Event.observe «изменить» события не запускаются в IE - PullRequest
5 голосов
/ 28 февраля 2010

Прослушиватель событий Prototype, который я использую для изменений в некоторых меню, не запускается в IE.

Event.observe('use_billing', 'change', Checkout.getBillingData);

Это нормально работает в Firefox (конечно), но в IE (конечно) ничего не происходит - я уже некоторое время гуглю это, но я не нашел подходящего решения этой проблемы. Я читал, что есть проблемы, но я не нашел ничего полезного, чтобы обойти эту проблему и заставить ее работать.

Я действительно стараюсь избегать использования встроенных триггеров событий, потому что они навязчивы и создают грязный документ, подверженный ошибкам:

<select id='use_billing' onchange="Checkout.getBillingData();">....</select>

Любые идеи были бы великолепны - это единственное, что мешает этому проекту перейти от бета-версии к производству.

Ответы [ 3 ]

3 голосов
/ 01 марта 2010

Это общая проблема с IE. Он не запускает события change, пока элемент не потеряет фокус.

Чтобы убедиться, что это действительно является причиной вашей проблемы, попробуйте изменить меню и нажать клавишу Tab, чтобы переместить фокус на другой элемент. Если ваш обратный вызов сработает правильно, вы поймете, что других проблем нет.

Я обошел эту проблему и раньше, слушая другие события, такие как click или keydown. Вы можете добавить проверку к вашему обратному вызову, чтобы убедиться, что значение действительно отличается от предыдущего, чтобы гарантировать, что вы не обрабатываете событие больше, чем необходимо (поскольку другие браузеры будут одновременно запускать click и change если они нажимают на новое значение).

2 голосов
/ 24 июня 2011

Я знаю, что это старая тема, но я хотел поделиться альтернативным ответом на вопрос выше. В моем коде имя и идентификатор элемента были одинаковыми, но это не имело значения.

В вызываемой функции аргумент события передавался из прототипа. Чтобы получить значение текстового поля (вызвавшего событие) в Firefox, вы используете eventArg.currentTarget.value

но в IE вы должны использовать eventArg.srcElement.value

Итак, чтобы он работал в обоих браузерах, вы должны использовать ...

var value = "";
var id = "";
if(eventArg.currentTarget){//FireFox
value = eventArg.currentTarget.value;
id = eventArg.currentTarget.id;
}
else{//IE
value = eventArg.srcElement.value;
id = eventArg.srcElement.id;
}

2 голосов
/ 01 марта 2010

Я нашел причину - проблема была не в фокусе, оказалось, что у меня были одинаковые значения имени элемента и значения идентификатора - я изменил значение идентификатора, и все работало нормально.

...