2010-02-28 1 views
5

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

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

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

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

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

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

ответ

2

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

3

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

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

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

2

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

В функции, которая запускается, аргумент события передавался из прототипа. Для того, чтобы получить значение текстового поля (что вызвавший событие) в 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;
}