0

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

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

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

4

3 回答 3

5

您需要item使用var.

var item = $(this);
于 2013-03-14T16:30:33.757 回答
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');
    }
  });
};
于 2013-03-14T16:31:17.477 回答
3
$('#mainForm div.modified').each(function (index, valueOfElement) {

this您可以使用 jQuery 提供的“valueOfElement”参数来代替使用$.each(). 请注意,valueOfElement 指的是正在迭代的集合中的当前对象/字符串/等。

于 2013-03-14T16:30:32.437 回答