每个和$ .post的闭包

时间:2013-03-14 16:28:10

标签: javascript jquery ajax closures

我有一个我想要编辑的项目列表

<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总是包含最后修改过的。

如何在成功处理程序中检索当前发布的项目?

3 个答案:

答案 0 :(得分:5)

您需要使用itemvar范围限定为每次迭代。

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。