2009-09-24 3 views
0

J'ai un gestionnaire d'événements qui est appelé six fois lorsque je clique sur un lien.Le gestionnaire d'événement Onclick est exécuté plusieurs fois lorsque je clique sur un lien

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; 
    }); 
} 

J'utilise Firefox 3.5 actuellement si ceci est utilisé pour 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); }; 
    } 
} 

La valeur this.href est le même à chaque fois, et il n'y a que trois liens qui correspondent à mes getElementsByTagName. Donc, j'ai attaché un événement à mon lien, et quand je clique sur l'un des trois, il est appelé six fois avec les mêmes informations de lien.

Une idée pourquoi cela peut-il se produire?

Répondre

2

Il semble que vous joignez le même gestionnaire d'événements au 0ème élément autant de fois qu'il y a de liens. Deuxièmement, dans les membres d'objet JavaScript, les propriétés, les éléments de tableau, etc. sont tous dans la même collection. for(var item in obj) sera exécuté une fois pour chaque membre disponible de obj. Si c'est un tableau avec 3 éléments, il s'exécutera une fois pour chaque élément, une fois pour la propriété length, et une fois pour chaque ... quelles que soient les deux autres propriétés intégrées. C'est six fois au total, ce qui n'est probablement pas ce que vous voulez. Utilisez for(var i=0;i<elems.length;i++) pour la fiabilité.

+0

Merci, j'ai oublié d'incrémenter mon cntr. –

Questions connexes