单击链接时,会执行多次Onclick事件处理程序

时间:2009-09-24 02:46:22

标签: javascript javascript-events

我有一个事件处理程序,当我点击链接时会被调用六次。

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匹配。

所以,我已将一个事件附加到我的链接上,当我点击其中一个时,它会被调用六次,并且链接信息完全相同。

知道为什么会这样吗?

1 个答案:

答案 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++)来提高可靠性。