单击Event Closure Inside Loop

时间:2014-07-15 16:30:15

标签: javascript jquery events closures

我在循环中通过JQuery将一个click事件附加到元素上(循环变量i):

$('#id_'+i).click(function() {ItemClick(i)});

并在其他地方定义:

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

正如预期的那样,由于关闭,这并没有按预期工作。我希望看到每个不同的点击事件显示不同的数字,而我只是得到i的最后一个值。

我知道我需要将闭包中的i转换为某种方式并不附加到闭包范围内的东西,但即使在尝试了各种例子之后,它仍然无法实现。如:

$('#id_'+i).click(function() {ItemClick(function(x){return x)(i))});

这样做有一个简洁明了的方法吗?

修改

在查看副本后,我现在有两个答案(请关闭问题):

回答A

$('#id_'+i).data('index',i);

$('#id_'+i).click(
    function() {
        ItemClick($(this).data('index'));
    }
);

回答B

$('#id_'+i).click(
    function(index) {
        return function () {
            ItemClick(index)
        };
    }(i)
);

1 个答案:

答案 0 :(得分:0)

这是一个非常常见的JavaScript问题,因为Javascript基于closure/scope,而不是基于block

您可以通过在函数调用周围创建closure来解决此问题。

$('#id_' + i).on('click', function() {
    (function (index) { 
        ItemClick(index);
    }(i));
});

<强> jsFiddle Demo