2011-04-04 56 views
11

有人能告诉我我在做什么错吗?我简化它下面,但我基本上是试图创建一个列表,并有一个引用只在循环中可用的变量的单击事件。如何将可变参数传递给使用jQuery的匿名函数?

for (var i = 0; i < data.length; i++) {                   
    $newRow = $(rowFormat);      
    $('a:first', $newRow).click(function(i){ 
    return function() { alert(i); } 
    }); 
    $list.append($newRow);  
} 
+0

你做了 “错误” 的事情是称为封闭。你给每个点击函数一个refference给同一个变量'i'。 – ITroubs 2011-04-04 15:06:24

+0

@ITROUBS:他清楚地知道这一点,并试图解决它(事实上,他没有给任何*他们提及循环中使用的“i”;他将其隐藏在[外部]匿名函数的参数列表)。他只是忘记了一些括号 - 见大卫的答案。 :-) – 2011-04-04 15:16:29

+0

是的,你是对的。没有正确地读取代码;-) – ITroubs 2011-04-04 15:44:03

回答

13

您没有调用外部函数。

$('a:first', $newRow).click(function(j){ 
    return function() { alert(j); } 
}(i)); /* Pay special attention to this line, it is where the major change is */ 

由于T.J. Crowder提到,你可以将工厂移出循环。

function my_factory(j) { 
    return function() { 
     alert(j); 
    }; 
} 

$('a:first', $newRow).click(my_factory(i)); 
+0

通过在点击时调用您自己的参数,您将失去传入的事件参数。 – Eli 2011-04-04 14:58:30

+4

+1 @Mike:建议您移动工厂功能在循环之外,但;你不必要地创建了一堆额外的工厂函数,你只需要一个函数(为'click'创建各种函数)。也建议查看事件委派,而不是为每一行创建一个单独的事件处理程序。 – 2011-04-04 14:59:55

+0

@Eli:这不是代码的作用。接受'j'的函数不是'click'处理函数,它*构建并返回* click处理函数。 'click'处理函数是调用'alert'的函数。 – 2011-04-04 15:00:28

3

你已经差不多了,只是一个小小的改变。这实际上是我在Javascript中实际使用闭包的最喜欢的例子。

基本上,您需要创建一个接受值的函数,并返回使用该值的函数。请参阅下面的注释行,了解您的示例缺失的内容。你的代码创建了匿名函数,但没有调用它。

for (var i = 0; i < data.length; i++) {                   
    $newRow = $(rowFormat); 
    var fn = (function (value) { 
    return function() { 
     alert(value); 
    }; 
    }) (i); //this is what you were missing, you need to invoke the anonymous function 
    $('a:first', $newRow).click(fn); 
    $list.append($newRow);  
} 
0

使用'绑定'附加'click'事件并传递一个参数。使用 'event.data',你将能够得到您的参数的正确的价值:

例1:

$(document).ready(function() 
{ 
    for (var i = 0; i < data.length; i++) 
    {                   
     $newRow = $(rowFormat);      
     $('a:first', $newRow).bind('click', {i: i}, 
      function (event) 
      { 
       alert(event.data.i); 
      } 
     ); 
     $list.append($newRow);  
    } 
}); 

例2:

$(document).ready(function() 
{ 
    $(".selectorA").each(function() 
    { 
     var elementId = $(this).attr("id"); 

     for(var i = 0; i < 20; i++) 
     { 
      $('#question' + i).bind('click', {currentIndex: i, elementId: elementId}, 
       function (event) 
       { 
        alert(event.data.currentIndex + " | " + event.data.elementId); 
       } 
      ); 
     } 
    } 
}); 
相关问题