我有一个事件处理程序,当我点击链接时会被调用六次。
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;
});
}
我目前正在使用Firefox 3.5,因此这用于AttachEvent:
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
匹配。
所以,我已将一个事件附加到我的链接上,当我点击其中一个时,它会被调用六次,并且链接信息完全相同。
知道为什么会这样吗?
答案 0 :(得分:2)
看起来您将相同的事件处理程序附加到第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属性运行一次,对于...运行一次......无论其他两个内置属性是什么。总共六次,这可能不是你想要的。使用for(var i=0;i<elems.length;i++)
来提高可靠性。