javascript - 单击循环内的事件关闭

标签 javascript jquery events closures

我在循环中通过 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))});

有没有一种简洁明了的方法来做到这一点?

编辑

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

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

最佳答案

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

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

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

<强> jsFiddle Demo

关于javascript - 单击循环内的事件关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24763485/

相关文章:

javascript - 我如何简单地从一个数组中取出一个属性并将其放入另一个数组中? Javascript

javascript - 无法读取未定义的属性 'parent' - Node.js

javascript - 动态添加 ListView 时 jQuery Mobile 页脚未修复

javascript - 获取元素内的文本,如果元素包含 select 获取选定选项

javascript - 我如何使用 HTML 和 CSS 在一行中均匀地拆分按钮?

php - Magento 在保存客户地址时会发送事件吗?

events - 你如何应对分布式系统中没有事件?

php - jQuery .post 帖子元素

javascript - 构建一个 Ajax 系统以通过链接类加载新页面内容

javascript - Google Chrome MonitorEvent 支持自定义事件吗?