2012-04-12 78 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