2012-04-12 8 views
12

このコードは、配列をループして画像をロードし、画像がロードされたときに通知するコードです。Javascript Image onloadイベントバインディング

for (var i = 0; i < arr.length; i++) {     
    var imageObj = new Image(); 
    imageObj.src = url[i]; 
    imageObj.onload= (function(i){ 
       return function(){ 
        console.log(i, 'loaded'); 
       } 
      })(i); 

} 

正常に動作します。しかし、これを実行しようとすると動作しません。

imageObj.addEventListener('onload', function(
    console.log(i, 'loaded'); 
}, false); 

問題は何ですか?この場合、クロージャを使用しないようにする方法はありますか?

+0

唯一の問題ではありませんが、2番目の壊れた例は、JSの最初の行の末尾に 'i' {{{{}}がありません。 – Lambart

+0

ちょうど安全なところにいて、最初にイベントを割り当ててからsrcを割り当ててはいけませんか? – bashan

答えて

21

問題の一部:onloadではなく、loadというイベントが発生しました。それ以外

imageObj.addEventListener('load', function() { /* ... */ }, false); 

、イベントリスナー関数の外i変化するので、あなたはクロージャを必要とします。

+1

@gillesc通常のES5 array.forEach()は新しいスコープを与えるので、バインディングは最後のアイテムに必ずしも設定されません。インデックスを繰り返したり、独自のクロージャを追加するよりもコードが少なくなります。 – mikemaccana