5 ms·
It won't alert quite what you want - when you click on each element in the list, it will alert "4". This is because the function assigned to the click event of
by theoretical 16y ago
It won't alert quite what you want - when you click on each element in the list, it will alert "4".
This is because the function assigned to the click event of each li is bound to the "i" variable used in the loop by a closure. Variable i is incremented to 4 before the loop ends, so that is what each will print.
You could use make the function used in the click handler take a parameter, then use partial function application (or currying) to fix the value of the parameter.
- Timmy_C 16y agoThe function in the click handler does take a parameter 'e' (...or whatever you call it) which is an Event object. But I think you're on to something by using currying.
- theoretical 16y agoWell yes, the function is called with a MouseEvent as one of the arguments, so you could use the "arguments" object to access it. What I was thinking of, was something along the lines of: // From http://ejohn.org/blog/partial-functions-in-javascript/ Function.prototype.curry = function() { var fn = this, args = Array.prototype.slice.call(arguments); return function() { return fn.apply(this, args.concat( Array.prototype.slice.call(arguments))); }; }; els = document.getElementsByTagName('li'); for(i=0; i < els.length; i++){ els[i].addEventListener('click', function(x){ alert(x); }.curry(i), false); }