2012-04-12 80 views
12

所以我有這段代碼循環訪問數組並加載圖像,並在圖像加載時通知。Javascript圖像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

不是唯一的問題,但你的第二個破碎的例子顯然是破碎的JS,缺少'i){'在第一行的末尾。 – Lambart 2014-10-10 22:57:48

+0

只是爲了安全起見,不應該先分配事件然後分配src? – bashan 2015-05-04 11:28:36

回答

21

問題的一個部分:事件不叫onload,而是load

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

除此之外,由於i事件偵聽器功能之外的變化,需要關閉。

+1

@gillesc一個正常的ES5 array.forEach()會給你一個新的範圍,所以你的綁定並不總是設置在最後一個項目上。它將比遍歷索引和添加自己的閉包更少的代碼。 – mikemaccana 2014-09-30 11:05:40