我在循环中通过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)
);
答案 0 :(得分:0)
这是一个非常常见的JavaScript问题,因为Javascript基于closure/scope
,而不是基于block
。
您可以通过在函数调用周围创建closure
来解决此问题。
$('#id_' + i).on('click', function() {
(function (index) {
ItemClick(index);
}(i));
});
<强> jsFiddle Demo 强>