我有一个事件处理程序,当我单击一个链接时,它被调用六次。
var elems = elem.getElementsByTagName('a'); var cntr = 0; for(var a in elems) { AttachEvent(elems[cntr], 'click', function(e) { this.reporturl = this.href; document.getElementById('reportpopup').style.visibility = "visible"; return false; }); }
我目前正在使用火狐3.5,所以这是用于附件:
function AttachEvent(obj,evt,fnc,useCapture){ if (!useCapture) useCapture=false; if (undefined == obj || null == obj) return; if (obj.addEventListener){ obj.addEventListener(evt,fnc,useCapture); return true; } else if (obj.attachEvent) return obj.attachEvent("on"+evt,fnc); else{ MyAttachEvent(obj,evt,fnc); obj['on'+evt]=function(){ MyFireEvent(obj,evt); }; } }
这个 this.href 值每次都相同,并且只有三个链接与我的 getElementsByTagName .
this.href
getElementsByTagName
所以,我在我的链接上附加了一个事件,当我点击三个事件中的一个时,它被调用六次,链接信息完全相同。
知道为什么会这样吗?
似乎您正在将同一事件处理程序附加到第0个项目,次数与链接的次数相同。
var cntr = 0; for(var a in elems) { AttachEvent(elems[cntr], 'click', function(e) { ^never changes?
其次,在javascript对象成员中,属性、数组元素等都在同一集合中。 for(var item in obj) 将为的每个可用成员运行一次 obj . 如果它是一个包含3个元素的数组,它将为每个元素运行一次,为length属性运行一次,为…不管其他两个内置属性是什么。总共是6倍,这可能不是你想要的。使用 for(var i=0;i<elems.length;i++) 为了可靠性。
for(var item in obj)
obj
for(var i=0;i<elems.length;i++)