通过JS将事件附加到IE中的元素并传入对象本身

时间:2011-03-11 05:22:35

标签: internet-explorer object attachevent

我有一些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 :(得分:0)

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

答案 1 :(得分:0)

解决方案:

这是我原来的逻辑:

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

除了IE之外,它工作得很好,其中相同的obj被传递给每个事件监听器(数组中的最后一个对象)。

修复方法是这样做:

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

function
    attach events to each item passing object[i]

我之前遇到过这个...这是一个关闭问题,对吗?