jQuery动态调用函数的问题

时间:2009-03-27 17:35:04

标签: javascript jquery

for(n=0;n < 20;n++){
     $('#button' + n).click(function () { newAction(n); });
}

function newAction(x){
     alert(x);
}

这段代码的问题在于,当我按下按钮时,他们的点击动作不会与他们的号码相关联,所以按下button5我可能会得到警报6或类似的东西。

4 个答案:

答案 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);
}