dojo.connect не соединит 'onclick' с кнопкой

Я сталкиваюсь с проблемой с помощью dojo.connect () для соединения 'onclick' события с этой кнопкой:

<button dojoType="dijit.form.Button" widgetId="inbox_button" id="inbox_button">Inbox</button>

и код, устанавливающий связь:

var inbox_button=dojo.byId("inbox_button");
dojo.connect(inbox_button,'onclick',function(){
    var container=dijit.byId("center");
    container.addChild(new dijit.layout.ContentPane({region: "left", content: "...", style: "width: 100px;"}))
});

Однако вместо того, чтобы выполнить функцию, когда кнопка нажата, ЛЮБОЕ onclick событие инициировало функцию, и я заканчиваю с большим количеством дочерних контейнеров.

Даже при том, что я вполне уверен .connect (), функция должна быть доступной как часть базовой функциональности додзе, я 'потребовал' его явно:

dojo.require("dojo._base.connect");

Какие-либо идеи относительно того, почему это могло бы происходить?

6
задан Daniel 9 June 2010 в 17:49
поделиться

2 ответа

Отвечая на мой собственный вопрос: никогда не недооценивайте значение dojo.addOnLoad!

Мне кажется, что поскольку кнопка использовалась как виджет, ее ID не был зарегистрирован до тех пор, пока Dojo не закончил загрузку, и поскольку код подключения не был внутри блока addOnLoad, он не мог найти (еще не загруженную) кнопку. Причина, по которой метод срабатывал при каждом событии щелчка, заключалась в том, как Dojo работает с нулевыми объектами в функции connect(): он игнорирует их и вместо этого использует dojo.global (версия Dojo для document.window) в качестве объекта.

Надеюсь, это поможет всем, кто столкнулся с подобной проблемой!

2
ответ дан 8 December 2019 в 17:18
поделиться

Как вы говорите, если вы запустите этот код до того, как DOM будет готов, dojo.byId("inbox_button") вернет null. Таким образом, ваш коннект на самом деле делает:

dojo.connect(null, "onclick", function() { ... })

... если первый аргумент dojo.connect равен null, будет использован глобальный объект или объект 'window'.

Но это только одна ошибка. Ваш элемент кнопки становится виджетом и превращается в dijit.form.Button. Поэтому вы должны подключаться к методу onClick виджета, а не к методу onclick узла:

dojo.connect(dijit.byId("inbox_button"), "onClick", function() { ... });

Также, для ясности, вам никогда не нужно требовать dojo.require в dojo._base, это обещание, которое dojo.js даёт вам - всё уже встроено.

12
ответ дан 8 December 2019 в 17:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: