我在循环中通过 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/