присоединение события к элементу в IE через JS и передача самого объекта - PullRequest
0 голосов
/ 11 марта 2011

У меня есть этот бит 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 ]

0 голосов
/ 11 марта 2011

Решение:

Это была моя оригинальная логика:

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]

Я сталкивался с этим раньше ... это проблема закрытия, правильно?

0 голосов
/ 11 марта 2011

Эй, В IE обработчики событий не предоставляют инициированное событие в качестве аргумента. Вы должны собрать его по window.event.

...