【问题标题】:Click Event Closure Inside Loop [duplicate]单击循环内的事件关闭[重复]
【发布时间】:2014-07-15 16:30:15
【问题描述】:

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

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

并在其他地方定义:

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

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

我知道我需要将闭包中的 i 转换为某种与闭包范围无关的东西,但即使在尝试了各种示例之后,它也让我无法理解。如:

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

有没有一种简洁明了的方法?

编辑

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

回答一个

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

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

回答 B

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

【问题讨论】:

  • 不要使用增量id 属性。它会导致这样的头痛。使用通用类,并通过索引访问它们,或者如果需要,在 data 属性中添加标识符。

标签: javascript jquery events closures


【解决方案1】:

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

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

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

jsFiddle Demo

【讨论】:

  • 我愿意接受这个答案。但我怕它不起作用。我仍然在点击中获得 i 的最后一个值。
  • 对不起,应该是ItemClick(index)!现在修复它
猜你喜欢
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 2021-09-29
  • 2018-12-19
相关资源
最近更新 更多