2012-12-07 15 views
7

Sto tentando di aggiungere un listener di eventi a tutti gli elementi con una classe di sezione, tuttavia si applica solo all'ultimo oggetto nell'elenco di nodi.addEventHandler a ogni elemento di una classe

var section = document.querySelectorAll('.section'); 
for(var i=0;i<section.length;i++){ 
var elem = section[i]; 
elem.addEventListener('click', function() {move (elem)}, false); 
} 

C'è un modo per aggiungere il listener di eventi per ognuno?

+4

See http: // stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example per la risposta generica. – pimvdb

risposta

5

Il problema è che non c'è alcun ambito di blocco in JavaScript. Pertanto, elem viene sovrascritto ogni iterazione, anziché essere dichiarato ogni volta come una nuova variabile. L'unico modo per dichiarare nuove variabili in ogni iterazione è attraverso una funzione:

for(var i = 0; i < section.length; i++){ 
    (function(elem) { 
    elem.addEventListener('click', function() { move(elem); }, false); 
    })(elem); 
} 

Ma addEventListener set this all'elemento, così nel tuo caso si può ben fare:

for(var i = 0; i < section.length; i++){ 
    elem.addEventListener('click', function() { move(this); }, false); 
} 
1

è perché si fa riferimento a elem e i all'interno della funzione. Posso suggerire di provare

var section = document.querySelectorAll('.section'); 
for(var i=0;i<section.length;i++){ 
    var handler = (function(ind){ 
     return function() { 
      move (section[ind]); 
     } 
    })(i) 

    elem.addEventListener('click', handler, false); 
} 
+1

Anche questo fallirà perché 'i' è dichiarato nello stesso ambito. – pimvdb

+0

sì, è necessario ripararlo. Ci penserò io – Eugeny89

+1

In questo caso puoi semplicemente fare 'move (this)'. – pimvdb

Problemi correlati