2011-05-28 74 views
7

任何想法如何使用JQuery的延遲方法檢測所有更改的表單並將每個表單提交爲Ajax文章?JQuery推遲使用.each()

我可以得到同樣的事情工作,如果我只列出表單提交的負荷,但如果我使用...

$('form.changed').each(function(){ 
    return $(this).submitWithAjax(); 
}); 

,我試圖讓工作的代碼更全面的版本在這裏... at JS Fiddle

在此先感謝!

+0

你能澄清你的問題嗎?我不確定我是否理解(但我很確定我的答案是基於...) – Pointy 2011-05-28 16:54:33

回答

17

相反 「每()」 中,使用 「.MAP()」:

var deferreds = $('form.changed').map(function(i, elem) { 
    return $(this).submitWithAjax(); 
}); 

$.when.apply(null, deferreds.get()).then(function() { ... }); 

的 「$。當()」 的東西讓你捆綁了一堆遞延對象,等待所有他們成功(或者任何失敗—注意其中的差異)。它通常允許任意數量的參數,但由於我們有一個數組,我使用了「apply()」。

請注意,我只用過這東西掉以輕心,所以讀jQuery的API文檔,仔細檢查:-) 編輯 —也是在重新閱讀你的問題,我可能誤會你了。

+0

這看起來不錯。我會試一試並回報。 – 2011-05-28 17:47:18

+0

這個完美的作品。謝謝你的幫助。試圖理解它爲什麼現在起作用。 – 2011-05-28 18:06:18

+1

「延遲」功能就是其中的一件非常簡單的功能,但我同意真的很難完全「獲得」機制的工作原理:-) – Pointy 2011-05-28 19:16:40

0

將更改事件委託給表單字段可以解決您的問題。

$('form').delegate('input[type=text], input[type=radio], select', 'change', 
function(evt){ 
    // your submits here 
    console.log('changed!') 
}); 
+0

感謝您的回覆,但檢測到表單上的更改不是問題。 (「form:input」)。live('change',function(){ //如果表單輸入發生更改,則返回 $(this).closest('form')。addClass(「changed」); });' – 2011-05-28 18:08:05