代码之家  ›  专栏  ›  技术社区  ›  James Black

当我单击一个链接时,on click事件处理程序会执行多次

  •  0
  • James Black  · 技术社区  · 15 年前

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

    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 .

    所以,我在我的链接上附加了一个事件,当我点击三个事件中的一个时,它被调用六次,链接信息完全相同。

    知道为什么会这样吗?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Rex M    15 年前

    似乎您正在将同一事件处理程序附加到第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++) 为了可靠性。

    推荐文章