2011-05-28 4 views
7

JQuery'nin ertelenmiş yöntemlerini, değiştirilen tüm formları algılayan ve her birini bir Ajax gönderi olarak gönderen bir işlevle nasıl kullanabileceğinizi düşünün.JQuery, .each() ile ertelendi.

Ben

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

Ben çalışma almak çalışıyorum kod daha geniş bir versiyonu burada ... Ben kullanırsanız aynı şey sadece formu gönderimleri bir yük listelerseniz çalışan ancak alabilirsiniz ... at JS Fiddle

Şimdiden teşekkürler! Bunun yerine ".each()" nin

+0

Sorunuzu açıklayabilir misiniz? Anladığımdan emin değilim (ama cevabımın tabanda olduğuna eminim ...) – Pointy

cevap

17

, ") (.map" kullanın:

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

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

"$ .her()" şey ertelenmiş bir grup nesne paket ve tüm beklemek sağlar Onların başarılı olması (ya da herhangi bir başarısızlık için — farkını not edin). Normalde isteğe bağlı sayıda argümana izin verir, ancak bir dizimiz olduğu için "apply()" kullanırdım. Ben sadece hafifçe bu şeyleri kullanılmış, bu nedenle düzenlemek yeniden okuma soru, seni yanlış anlamış olabilir üzerine de — :-) tekrar kontrol etmek jQuery API docs okudum

Not.

+0

Bu iyi görünüyor. Bir deneme yapıp rapor vereceğim. –

+0

Bu, mükemmel çalışır. Yardım ettiğin için teşekkür ederim. Sadece neden şimdi çalıştığını anlamaya çalışıyorum. –

+1

"Ertelenmiş" özelliği oldukça basit olan şeylerden biri, ancak mekanizmanın tam olarak nasıl çalıştığını tam olarak "almayı" gerçekten çok zor buluyorum :-) – Pointy

0

Değişiklik olayını form alanlarına atama, sorununuzu burada çözebilir.

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

Yanıtınız için teşekkürler, ancak formdaki değişiklikleri tespit etmek sorun değildi. '$ ("form: input") canlı (' change ', function() { // Bir form girdisi $ (bu) değiştiğinde .closest (' form '). AddClass ("changed"); }); ' –