Я сталкиваюсь с проблемой с помощью 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");
Какие-либо идеи относительно того, почему это могло бы происходить?
Отвечая на мой собственный вопрос: никогда не недооценивайте значение dojo.addOnLoad!
Мне кажется, что поскольку кнопка использовалась как виджет, ее ID не был зарегистрирован до тех пор, пока Dojo не закончил загрузку, и поскольку код подключения не был внутри блока addOnLoad, он не мог найти (еще не загруженную) кнопку. Причина, по которой метод срабатывал при каждом событии щелчка, заключалась в том, как Dojo работает с нулевыми объектами в функции connect(): он игнорирует их и вместо этого использует dojo.global (версия Dojo для document.window) в качестве объекта.
Надеюсь, это поможет всем, кто столкнулся с подобной проблемой!
Как вы говорите, если вы запустите этот код до того, как 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 даёт вам - всё уже встроено.