2013-03-14 37 views
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> 

,使阿賈克斯後每個修改項目

$('#mainForm div.modified').each(function() { 
    item = $(this); 
    $.post(
     $('#mainForm').attr('action') 
     , $(this).find(':input').serialize() 
     , function (data) { 
      item.removeClass('modified'); 
     } 
    }); 
}; 

成功發佈的項目應該得到消除了他們modified類。
我試圖使用item來關閉當前修改的閉包。
但是,因爲它是異步的,所以item總是包含最後一個修改的。

如何在成功處理程序中檢索當前張貼的項目?

+2

您在'項忘了'var'那裏的聲明。 – Zirak 2013-03-14 16:30:44

回答

5

您需要通過使用var來將item範圍限定爲每次迭代。

var item = $(this); 
+0

您的第一個「var item」答案是勝利者:) – 2013-03-14 17:06:17

3
$('#mainForm div.modified').each(function (index, valueOfElement) { 

而不是使用this的,你可以使用jQuery的$.each()提供的 「valueOfElement」 的說法。請注意,valueOfElement引用正在迭代的集合中的當前對象/字符串/ etc。

+2

我必須爲此+1。我支持*不*濫用''這個jQuery與迭代器做的方式。使用參數更好,更接近本地迭代方法的工作方式。 – 2013-03-14 16:32:49

+1

這是最好的答案,它有我的upvote。當已經存在的變量創建變量沒有意義。 – 2013-03-14 21:46:33

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'); 
    } 
    }); 
}; 
+0

作爲提示,將此字符串放置在所有腳本文件/腳本標記的開頭:「use strict」較新的瀏覽器會在您執行類似操作時顯示錯誤,舊版瀏覽器會忽略該字符串。 – Hoffmann 2013-03-14 16:33:54