2012-12-07 8 views
7

セクションのクラスを持つすべての要素にイベントリスナーを追加しようとしていますが、ノードリストの最後のオブジェクトにのみ適用されます。クラスのすべての要素にaddEventHandlerを追加

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

それぞれにイベントリスナーを追加する方法はありますか?

+4

は、httpを参照してください。ジェネリックアンサーについては、stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example – pimvdb

答えて

5

JavaScriptにブロックスコープがないという問題があります。したがって、毎回新しい変数として宣言するのではなく、elemを各繰り返しに上書きします。各反復で新しい変数を宣言するための唯一の方法は、関数を使用している:

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

しかしaddEventListenerセットthis要素に、あなたのケースでは、あなたはきちんと行うことができるように://:

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

これは、機能内でelemiを参照しているためです。私は試してみることができます

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

同じスコープで 'i'が宣言されているので、これも失敗します。 – pimvdb

+0

はい、修正する必要があります。私はそれを考えるでしょう – Eugeny89

+1

この場合、あなたは 'move(this)'をすることができます。 – pimvdb

関連する問題