Присоединение события к элементу в IE через JS и передача самого объекта
У меня есть этот бит JS, который вызывается, поскольку он проходит через каждый из элементов INPUT на странице:
if (thisField.addEventListener){ // good browsers
thisField.addEventListener('focus', function(event){toggleHelpText(this,event)}, true);
thisField.addEventListener('blur', function(event){toggleHelpText(this,event)}, false);
} else if (thisField.attachEvent){ // IE
thisField.attachEvent('onfocus',function(event){toggleHelpText(thisField,event)});
thisField.attachEvent('onblur',function(event){toggleHelpText(thisField,event)});
}
В хороших браузерах он делает то, что должен делать. Он прикрепляет слушатель события фокуса и размытия к каждому элементу, который при срабатывании передает объект, а событие, которое его сработало, в функцию 'toggleHelpText'.
IE не работает, хотя В IE происходит то, что каждое поле, к которому прикреплен прослушиватель событий, имеет объект thisField, ссылающийся только на последний объект в цикле.
Другими словами, если у меня есть 3 поля ввода, хороший браузер будет вызывать событие фокуса на каждом из проходящих field1, field2 и field3 как "this" соответственно.
В IE все 3 поля при запуске события фокуса передают field3 как объект.
Есть ли решение?
Я также попробовал следующие параметры синтаксиса только для получения ошибок в IE:
thisField.attachEvent('onblur',function(event){toggleHelpText(this,event)});
thisField.attachEvent('onblur',function(this,event){toggleHelpText(thisField,event)});
thisField.attachEvent('onblur',function(this,event){toggleHelpText(this,event)});
2 ответа
Решение:
Это была моя оригинальная логика:
for loop...
attach events to each item passing object[i]
Это работало нормально, за исключением IE, где один и тот же объект передавался каждому слушателю событий (последний объект в массиве).
Исправление должно сделать это:
for loop...
call function to attach events passing object[i]
function
attach events to each item passing object[i]
Я сталкивался с этим раньше... это проблема закрытия, правильно?
Эй, в IE обработчики событий не предоставляют событие сгенерированное в качестве аргумента. Вы должны собрать его по window.event.