0

我有一段 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)});
4

2 回答 2

0

Solution:

This was my original logic:

for loop...
    attach events to each item passing object[i]

That worked fine except for IE, where the same obj was being passed to each event listener (the last object in the array).

The fix is to do this:

for loop...
    call function to attach events passing object[i]

function
    attach events to each item passing object[i]

I've run into this before...this is a closure issue, correct?

于 2011-03-11T17:02:36.890 回答
0

嘿,在 IE 中,事件处理程序没有提供触发事件作为参数。你必须通过window.event来收集它。

于 2011-03-11T05:38:16.740 回答