我所做的是使用循环在类上附加事件,并且索引值被用于事件处理程序代码中。这是我的代码:
var classElements=document.getElementsByClassName("a");
for(var i=0; i<4; i++)
{
classElements[i].onClick=function(){
alert("Clicked button : "+i);
}
}
无论我点击哪个按钮,它都会弹出警告框:
可能是什么问题呢?点击的按钮:4
我所做的是使用循环在类上附加事件,并且索引值被用于事件处理程序代码中。这是我的代码:
var classElements=document.getElementsByClassName("a");
for(var i=0; i<4; i++)
{
classElements[i].onClick=function(){
alert("Clicked button : "+i);
}
}
可能是什么问题呢?点击的按钮: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);
}
function(j)
。关于如何/何时自动执行这样的函数可能存在一些歧义,而外部括号则使其明确无误。 - Mattfunction(j) {...
会立即被调用,而return function(){...
则被分配为处理程序。如果您使用命名函数而不是内联匿名函数,则更清晰。也许Lou会更新并提供那个解决方案。 - user1106925为了捕获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);
i
,但是你一直在改变i
的值,最终把它设为了4。 - SampsononClick
应该改为onclick
。 - user1106925