2010-01-21 4 views
1

Я прошел через документы Dojo, а также API и попытался Google, но не могу найти решение моей проблемы, я надеюсь, что кто-нибудь здесь может помочь мне.Dojo: dijit.form.select не запускает событие «onClick» при первом щелчке

Я пытаюсь создать программу dijit.form.select программно (используя Dojo 1.4) и подключиться к «onClick» -эвенту виджета. Вот часть моего кода:

var dataSelect = new dijit.form.Select({ 
     id : "myselect", 
     name : "myselect", 
     labelAttr: "label", 
     labelType: "html" 
     }, 
     "selectid"); 
     dataSelect.addOption({value: "value", label: "first item label"}); 

     dojo.connect(dataSelect, "onClick", function() { 
     alert("clicked!"); 
     }); 

Что он делает: Избранная ящик создается с заменой ввода-поле с идентификатором «selectid», вариант «первый элемент ярлык» создается. Все в порядке, пока здесь. Затем я подключаюсь к «onClick» -эвенту выбора, который должен загружать больше параметров через AJAX (но в этом примере будет отображаться предупреждение для целей тестирования).

Проблема: когда я нажимаю на маленькую стрелку рядом с выпадающим меню, событие запускается (ОК). Но когда я нажимаю на сам поле выбора (область, содержащая эту опцию), событие НЕ запускается при первом щелчке мыши (если только я не нажал на стрелку раньше). Когда я нажимаю кнопку выбора во второй раз (и каждый раз после этого), событие срабатывает!

Я попытался использовать «onFocus» вместо «onClick», который работает, но затем раскрывающийся список не открывается при первом нажатии, даже если я использую функцию openDropDown (которая работает при подключении к "по щелчку"!).

Это я, я столкнулся с ошибкой Dojo или это странная функция, которую я просто не понимаю? Любая помощь приветствуется.

Привет, Select0r

+0

Может быть вызов метода dataSelect.startup() (после создания виджета) исправит это? – Kniganapolke

+0

Нет, до сих пор нет изменений :( – Select0r

+0

Хм, я вижу dijit.form.Select - старый виджет. Я попытался программно создать FilteringSelect и ComboBox из версии 1.3 (без атрибутов и опций), и ваш код работал неплохо. – Kniganapolke

ответ

0

Select (который расширяет _HasDropDown) имеет причудливый код для обработки:

  1. мышь вниз по избранному виджету
  2. мышь перейти к одному из вариантов
  3. mouse up

Возможно, это отмена события click.

Возможно, вы можете перейти в _loadChildren() вместо этого.

+0

«_loadChildren» ist выстрел слишком рано, чтобы быть полезным, так как я хочу загрузить больше детей только при необходимости. Но «onMouseDown» (вместо «onClick») сделал трюк! Избавляет меня, почему, но теперь выпадающие группы ведут себя точно так, как предполагалось. Я все еще считаю, что это ошибка Dojo, но хорошо знать, как избавиться от нее. Спасибо большое! – Select0r

1

Попытки подключиться не к самому виджету но это дом узел:

dojo.connect(dataSelect.domNode, "onclick", function() { 
     alert("clicked!"); 
     }); 
+0

К сожалению, это не сработает. На самом деле, при подключении к domnode не запускается никакое событие. Я также попытался окружить выбор диапазоном и подключиться to onClick этого диапазона, но с аналогичным результатом. – Select0r

+0

Извините, он не включен в onClick. И убедитесь, что domNode существует, когда вы подключаетесь к нему. – Kniganapolke

+0

Спасибо, я не сейчас «onclick» и «onClick» сделает разница в этой точке. Но, к сожалению, использование «onclick» приведет к тому же поведению, которое у меня было до: первый щелчок по выбору не запускает событие (wh ile первый щелчок на стрелке), а затем второй щелчок работает. Я не вижу причин, по которым первый щелчок изменит ситуацию, может быть, мне нужно «активировать» выбор после его рендеринга? В любом случае, это все больше похоже на Dojo-bug для меня ... – Select0r

2

Вот кросс браузер решение:

var sizeSelect = new dijit.form.Select({ 
    id: "sizeSelect", 
    name: "state", 

    options: size, 
    onChange: function(val) { 
      dojo.style(dojo.byId("textInput"), {"fontSize":val}); 
    } 
}, "sizeSelect"); 
0

Основной причиной этой проблемы является то, что метод _onDropDownMouseDown из dijit._HasDropDown будет манипулировать узел DOM, которые вызывают e.target из OnMouseDown и OnMouseUp изменения для первой инициализации.

Как известно, событие onclick будет срабатывать только тогда, когда цель onmousedown и onmouseup будет одинаковой целью.

В этом случае событие onclick не запускается.

Кажется, что в Dojo 1.5 проблема остается.

Смежные вопросы