14

I have this piece of code that loops through an array and load images and notify when the images is loaded.

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);

}

It works fine. However if I try to do this it won't work:

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

What is the problem? And is there any way for me to avoid using closure in this case?

2
  • Not the only problem, but your second broken example is clearly broken JS, missing i) { at the end of the first line. Commented Oct 10, 2014 at 22:57
  • Just to be on the safe side, shouldn't you first assign the event and then assign the src? Commented May 4, 2015 at 11:28

1 Answer 1

23

One part of the problem: The event is not called onload, but load.

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

Other than that, since i changes outside of the event listener function, you need a closure.

Sign up to request clarification or add additional context in comments.

1 Comment

@gillesc A normal ES5 array.forEach() will give you a new scope, so your bindings aren't always set on the last item. It will be less code than iterating through the indexes and adding your own closure too.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.