Addeventlistener, For(), Index. How To Use Closure?
I have this code: var items = this.llistat.getElementsByTagName('a'); for( var i = 0; i < items.length; i++ ){ items[i].addEventListener('click', function(event) { al
Solution 1:
No, the third argument of addEventListener
is the useCapture
one. See MDN for more information.
But you can use:
for( var i = 0; i < items.length; i++ ){
(function(i){
items[i].addEventListener('click', function(event) {
alert( i );
}, false);
})(i);
}
or
var handler = function(event) {
var i = items.indexOf(this);
alert( i );
};
for( var i = 0; i < items.length; i++ ){
items[i].addEventListener('click', handler, false);
}
The first one creates a new event handler for each element, so it needs more memory. The second one reuses the same event listener, but uses indexOf
, so it's more slow.
Solution 2:
That's a classical closure issue : you must create a new function bound, not to the 'i' variable, but to its value at the time of binding :
var items = this.llistat.getElementsByTagName('a');
for( var i = 0; i < items.length; i++ ) {
items[i].addEventListener('click', listener.bind( null, i) );
}
functionlistener(index) {
alert(index);
}
Post a Comment for "Addeventlistener, For(), Index. How To Use Closure?"