我有一个我想要编辑的项目列表
<form id="mainForm" action="machin_chose">
<div><input name="field" value="chouchouette" /></div>
<div class="modified><input name="field" value="trutruc" /></div>
<div class="modified"><input name="field" value="machin" /></div>
</form>
并在每个修改过的项目上发布ajax帖子
$('#mainForm div.modified').each(function () {
item = $(this);
$.post(
$('#mainForm').attr('action')
, $(this).find(':input').serialize()
, function (data) {
item.removeClass('modified');
}
});
};
成功发布的项目应该被移除modified
课程
我尝试使用item
的闭包来保留当前修改过的闭包
但由于它是异步的,item
总是包含最后修改过的。
如何在成功处理程序中检索当前发布的项目?
答案 0 :(得分:5)
您需要使用item
将var
范围限定为每次迭代。
var item = $(this);
答案 1 :(得分:4)
您的代码的问题在于您没有使用闭包; item
变量是全局的,因为你没有在函数中声明它。
只需改变一下:
item = $(this);
为:
var item = $(this);
现在循环中的每次迭代都有自己的变量。
你也可以使用发送给函数的参数,但是你有一个DOM元素的引用,而不是jQuery对象:
$('#mainForm div.modified').each(function (i, item) {
$.post(
$('#mainForm').attr('action')
, $(item).find(':input').serialize()
, function (data) {
$(item).removeClass('modified');
}
});
};
答案 2 :(得分:3)
$('#mainForm div.modified').each(function (index, valueOfElement) {
您可以使用jQuery this
提供的“valueOfElement”参数,而不是使用$.each()
。注意,valueOfElement引用正在迭代的集合中的当前对象/字符串/ etc。