Я не могу заставить onChange стрелять для dijit.form. Выбрать

Я кажусь не могущим правильно присоединить 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);
не делает.

Таким образом, я был прав, что был абсолютно глуп. Я предположил что, потому что вся строчная версия работает при помещении помещающий в нем тег HTML как атрибут, что Dojo рассматривал бы его то же. Это имеет смысл, потому что dijit.form. Выбор не имеет никакого атрибута .onchange, но действительно имеет атрибут .onChange. (Я закончил тем, что придерживался.Select по.FilteringSelect, потому что я не делаю своих пользователей, чтобы быть произведенным любое впечатление, которое они могут ввести в чем-то.) Так, на какого из Вас парни я даю ответ (потому что у Вас обоих был onChange в Ваших сообщениях, я предполагаю, что был просто слишком неопытен, чтобы понять, что случай имел значение)?
6
задан yarmiganosca 2 April 2010 в 16:20
поделиться

3 ответа

При выполнении dojo.connect попробуйте следующее:

  var inputEvents = [];  //Global var

  inputEvents.push(dojo.connect(dijit.byId(inputFldStr), "onChange", eventFuncObj));

Сохраните соединение в глобальной переменной.

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

В вашем коде вы подключаете обработчик к событию 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 для подключения к нескольким виджетам.

1
ответ дан 17 December 2019 в 00:06
поделиться

Кто-то другой, нашедший эту страницу с помощью веб-поиска, мог совершить ту же ошибку, что и я ... скопировать вашу разметку так, чтобы каждая имела одинаковое «значение».

например.

<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, если оно не было изменено.

4
ответ дан 17 December 2019 в 00:06
поделиться
Другие вопросы по тегам:

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