Я кажусь не могущим правильно присоединить onchange событие к dijit.form. Выберите виджет. Однако я плохо знаком с веб-разработкой, таким образом, я мог делать что-то абсолютно идиотичное (хотя, поскольку лучше всего я могу сказать (и я прочитал все документы, которые я мог найти), я не). Я удостоверился, что класс тела соответствует теме додзе, которую я dojo.require () для всех виджетов я использую (и dojo.parser), и тем не менее, nada. Код, который я использую:
dojo.addOnLoad(function () {
var _query = dojo.query('.toggle');
for (var i in _query) {
dojo.connect(_query[i], 'onchange', function (ev) {
console.log(ev + ' fired onchange');
});
}
});
Любая справка вообще ценилась бы.
Дополнение: после рытья больше во внутренности того, как dijit представляет виджеты, я обнаружил это, когда я добавляю dojoType ='dijit.form. Выберите' пару значения атрибута к моему элементу HTML (выполнение этого декларативно), dijit на самом деле представляет таблицу с двумя седлами с одной строкой. Первый элемент таблицы является промежутком (с классом dijitSelectLabel), что я принимаю, просто отображает выбранный (или значение по умолчанию) элемент. Это - второй элемент, кажется, кнопка, представленная как стрелка вниз, которая переключает дисплей меню itmes в ответ на определенные события DOM. Также (и я думал, что это было довольно изящно), dijit на самом деле не помещает избранные опции в дерево DOM, пока одно из тех событий не инициировано. Я посмотрел на HTML в поджигателе прямо после нового pageload (прежде чем я нажал на что-либо), и вторая опция нигде не состоит в том, чтобы быть найдена. Затем после того как я нажимаю на кнопку стрелки, существует dijit. Виджет меню, dijit засовывает dijit. Меню в конец узла тела; после того, как я нажму где-то в другом месте, виджет Меню является все еще lastChild тела, теперь его просто скрытый и не приложенный к форме. Выберите виджет.
Это должен действительно быть сложный, если все, я хочу сделать действительно ли место, является различным dijit.form виджетом в дереве DOM в зависимости от того, какой объект пользователь выбирает?
Заключение: Оказывается, что это была проблема капитализации.
dojo.connect(widget_obj, 'onChange', function_obj);
работы, тогда как dojo.connect(widget_obj, 'onchange', function_obj);
не делает.При выполнении dojo.connect попробуйте следующее:
var inputEvents = []; //Global var
inputEvents.push(dojo.connect(dijit.byId(inputFldStr), "onChange", eventFuncObj));
Сохраните соединение в глобальной переменной.
В вашем коде вы подключаете обработчик к событию onchange узлов dom, а не к виджетам додзё. dojo.query возвращает объект NodeList - набор узлов, соответствующих запросу.
В этом случае более надежно подключиться к событию onChange виджета, как показал GoinOff. Просто небольшое дополнение к его ответу, чтобы убедиться, что вы все делаете правильно.
Предположим, это ваш html (в более поздних версиях Dojo dijit.form.Select был заменен на dijit.form.FilteringSelect):
<input dojoType="dijit.form.FilteringSelect" id="stateInput" store="stateStore" searchAttr="name" name="state"/>
Затем вы должны подключиться к 'onChange' таким образом (вы также можете сохранить соединение в некотором массиве, чтобы иметь возможность отключить его позже, как предложил GoinOff):
dojo.addOnLoad (function () {
dojo.connect(dijit.byId("stateInput"), "onChange", function(){});
}
Но это совсем другая история, если вы не знаете идентификатор своего виджета и хотите использовать dojo.query для подключения к нескольким виджетам.
Кто-то другой, нашедший эту страницу с помощью веб-поиска, мог совершить ту же ошибку, что и я ... скопировать вашу разметку так, чтобы каждая имела одинаковое «значение».
например.
<select dojoType='dijit.form.Select' onChange="fn">
<option value='foo'>Foo 1</option>
<option value='foo'>Foo 2</option>
<option value='foo'>Foo 3</option>
</select>
fn () никогда не будет вызываться, потому что код обработчика изменений проверяет новое значение на соответствие ранее выбранному и не запускает onChange, если оно не было изменено.