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);

ループ内の各反復には、独自の変数があります。


関数に送信されたパラメーターを使用することもできますが、jQuery オブジェクトではなく、DOM 要素への参照があります。

$('#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 は、反復されるコレクション内の現在のオブジェクト/文字列/etc を参照することに注意してください。

于 2013-03-14T16:30:32.437 に答える