for(n=0;n < 20;n++){
$('#button' + n).click(function () { newAction(n); });
}
function newAction(x){
alert(x);
}
这段代码的问题在于,当我按下按钮时,他们的点击动作不会与他们的号码相关联,所以按下button5我可能会得到警报6或类似的东西。
答案 0 :(得分:3)
这看起来很奇怪,但这是创建闭包的更合适的方法,因此您可以每次迭代访问循环范围变量...
for(var n = 0; n < 20; n++) {
$('#button' + n).click((function(i) {
return function(e) { newAction(i) }
})(n));
}
function newAction(x){
alert(x);
}
答案 1 :(得分:3)
Mr Lucky在正确的轨道上,但他的例子我发现有点难以阅读。
function button_bind( num ){
$("#button" + num ).click(function(){
newAction(num);
});
}
for(var n = 0; n < 20; n++) {
button_bind(n);
}
function newAction(x){
alert(x);
}
这应该可以解决您的范围问题。
以上内容可以转换为内联:
for(var n = 0; n < 20; n++) {
(function(num){
$("#button" + num ).click(function(){
newAction(num);
});
})(n);
}
function newAction(x){
alert(x);
}
答案 2 :(得分:-1)
尝试以下方法:
for(n=0;n < 20;n++){
$('#button' + n).click(function (n) { newAction(n); });
}
function newAction(x){
alert(x);
}
原因是关闭。当你没有将n与匿名函数一起传递时,javascript会在自己的作用域和父作用域中查找变量。父作用域有一个'n',但是这个n是for循环后的n的值。通过传递n,你可以在函数范围内创建一个新的n,当for循环运行时,这个不会被改变。
答案 3 :(得分:-1)
我可以想到更简单的方法来做你正在尝试的事情,但这对你有用:
编辑:对不起,我觉得很清楚我正在为你的循环中的线路提供替代品。这是整个功能计划编辑2:好的,这里是外部的$(文档).ready()包装器,甚至在原始问题中都没有。这已经过测试。这很有效。即使在1.3+以上。这是给出的最佳答案。
我已经提出了这个程序的功能版本,你可以通过visiting here
来试用$(function() {
for (n = 0; n < 20; n++){
$('#button' + n).bind('click', n, function (e) { newAction(e.data); });
}
});
function newAction(x){
alert(x);
}