3个回答

41

你所有的处理程序都共享同一个i变量。

你需要把每个处理程序放到一个单独的函数中,该函数以i作为参数,这样每个处理程序都会有自己的变量:

function handleElement(i) {
    document.getElementById("b"+i).onclick=function() {
        alert(i);
    };
}

for(i=1; i<11; i++) 
    handleElement(i);

test.html:11 抛出未捕获的 TypeError 错误:无法设置 null 的 onclick 属性。 - sabin maharjan

20

你需要的是闭包:

for(i=1; i<11; i++) {
    (function(i) {
        document.getElementById("b"+i).onclick=function() {
            alert(i);
        };
    })(i);
}

2
我认为Caballero有一个不想要的闭包,他们想要一个闭包破坏器来强制立即评估i。这就是你的自执行函数所做的事情。 - mu is too short
1
闭包/非闭包...我不在乎!这个匿名/自调用的解决方案真是太美妙了 :) 我会选择这个。 - Nick
比拥有单独的函数更加优雅。 - Micah Henning

6

在解决这个问题时,有两种使用闭包的方式。其思想是为每次迭代创建一个作用域,并对“i”变量进行快照,以供事件处理程序使用。

解决方案#1(正如Kevin所提到的):

for(i=1; i<11; i++) {
    (function(num) {

       document.getElementById("b"+num).addEventListener('click', function() {
            alert(num);
       });

    })(i);
}

解决方案 #2:
for (i=1; i<11; i++) {
    document.getElementById("b"+i).addEventListener('click', (function(){
        var num = i;
        return function() {
            alert(num);
        }
    })());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接