2012-04-12 2 views
12

그래서이 코드 조각을 배열을 통해 반복하고 이미지를로드하고 이미지가로드 될 때이를 알립니다.자바 스크립트 이미지 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

+0

그냥 안전한쪽으로 가야합니다. 먼저 이벤트를 할당 한 다음 src를 할당해야합니까? – bashan

답변

21

한 부분 : 이벤트는 onload이 아니라 load이라고합니다. 이벤트 리스너 함수의 외부보다 다른

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

, i 이후 변경, 당신은 폐쇄해야합니다.

+1

@gillesc 일반 ES5 array.forEach()는 새 범위를 제공하므로 바인딩이 항상 마지막 항목에 설정되지는 않습니다. 인덱스를 반복하고 자신 만의 클로저를 추가하는 것보다 코드가 적습니다. – mikemaccana