你所有的处理程序都共享同一个i
变量。
你需要把每个处理程序放到一个单独的函数中,该函数以i
作为参数,这样每个处理程序都会有自己的变量:
function handleElement(i) {
document.getElementById("b"+i).onclick=function() {
alert(i);
};
}
for(i=1; i<11; i++)
handleElement(i);
你需要的是闭包:
for(i=1; i<11; i++) {
(function(i) {
document.getElementById("b"+i).onclick=function() {
alert(i);
};
})(i);
}
i
。这就是你的自执行函数所做的事情。 - mu is too short在解决这个问题时,有两种使用闭包的方式。其思想是为每次迭代创建一个作用域,并对“i”变量进行快照,以供事件处理程序使用。
解决方案#1(正如Kevin所提到的):
for(i=1; i<11; i++) {
(function(num) {
document.getElementById("b"+num).addEventListener('click', function() {
alert(num);
});
})(i);
}
for (i=1; i<11; i++) {
document.getElementById("b"+i).addEventListener('click', (function(){
var num = i;
return function() {
alert(num);
}
})());
}
attachEvent
/addEventListener
(虽然它们不能解决你的问题) - SLaksattachEvent
/addEventListener
比element.onclick
更合适? - Micah Henning