在循环中附加事件

时间:2012-04-30 18:58:31

标签: javascript events javascript-events event-handling

正在做的是使用循环在类上附加事件,并在事件处理程序代码中使用索引值。这是我的代码:

var classElements=document.getElementsByClassName("a");
for(var i=0; i<4; i++)
{
    classElements[i].onClick=function(){
       alert("Clicked button : "+i);
    }
}

当我点击任何按钮时,它会发出警告

Clicked Button : 4

可能是什么问题?

2 个答案:

答案 0 :(得分:4)

JavaScript关闭对象并在以后调用它时对其进行评估。在调用时,i为4。

我想你想要这样的东西:

var classElements=document.getElementsByClassName("a");
for(var i=0; i<4; i++)
{
    classElements[i].onClick=function(j) { 
       return function(){
          alert("Clicked button : "+j);
       };
    }(i);
}

编辑:显示命名函数以使代码更清晰

var classElements=document.getElementsByClassName("a");
for(var i=0; i<4; i++)
{
    var makeFn = function(j) { 
       return function(){
          alert("Clicked button : "+j);
       };
    };
    classElements[i].onClick = makeFn(i);
}

答案 1 :(得分:2)

您需要一个闭包才能捕获i的更改。正如Lou所说,这是由于后期评估。

var classElements=document.getElementsByClassName("a");
for(var i=0; i<4; i++)
    classElements[i].onclick = (function(i){
          return function(){ alert("Clicked button : " + i) }; 
       })(i);