每个和$.post的闭包

Closures with each and $.post

本文关键字:闭包 post      更新时间:2023-09-26

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

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

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

您需要使用varitem的范围限定到每个迭代。

var item = $(this);

代码的问题是没有使用闭包;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');
    }
  });
};
$('#mainForm div.modified').each(function (index, valueOfElement) {

您可以使用jQuery的$.each()提供的"valueOfElement"参数,而不是使用this。注意,valueOfElement是指正在迭代的集合中的当前对象/string/etc。