2012-01-11 25 views
13

Formu göndermeden önce ek bir işlevim var. Bu hile yapmıyor.Bir formun gönderilmesini nasıl geciktirebilirim

$('form').submit(function(event) { 
    var formId = $(this).attr('id'); 
    mySpecialFunction(formId); 

    event.preventDefault(); 

    setTimeout(function() { 
     $(this).submit(); 
    }, 300); 

}); 

Bu açık bir şekilde çalışmıyor.

cevap

28

Etkinliği jQuery seçiminde değil, form öğesinin kendisinde de tetiklemeniz gerekir.

$('form').submit(function(event) { 
    var formId = this.id, 
     form = this; 
    mySpecialFunction(formId); 

    event.preventDefault(); 

    setTimeout(function() { 
     form.submit(); 
    }, 300); 
}); 

: onun submit yöntemi

Önbellek formu (this) bir referans ve çağrı - (. setTimeout içinde this küresel nesnedir Aslında, hatta form öğesi seçilerek değildi) Verimsiz $(this).attr('id') çağrınızı this.id ile değiştirdiğimi unutmayın. Ayrıca jQuery yöntemi değil, DOM form öğesinin gönderme yöntemini çağırmanız gerektiğini unutmayın, böylece jQuery olay işleyicisi tetiklenmez, bu sonsuz (ve tamamen etkisiz) bir döngüye neden olur.

+0

I aşağıdaki gibi form gönderme geciktirmek Bunu denedim, ancak FireBug form.submit() işlevinin bir işlevi olmadığını söylüyor. JQuery 1.7.1 kullanıyorum. – Chris

+0

@Chris Cevabımda tam kodu kullandınız mı? – lonesomeday

+0

Ya, JSFiddle'da çalışmamı sağlayabilirim ama sayfamda değil. JQuery'yi dinamik olarak yüklüyorum, bu yüzden bununla ilgili olabilir. hrmm – Chris

1
$('form').submit(function(event) { 
    var formId = this.id, 
       $this = $(this); 

    mySpecialFunction(formId); 

    event.preventDefault(); 
    $this.unbind("submit"); 
    setTimeout($.proxy($.fn.submit, $this), 300); 

}); 
1

Gönderme olayını açmaya çalışın ve setTimeout içinden pencere yerine uygun "bu" bölümüne bakın. göndermek olay üzerine denir ve tekrar tekrar, fakat preventDefault sunulmasını engellediği içindir var

$(this).unbind("submit"); 
var self = this; 
setTimeout(function() { 
    $(self).submit(); 
}, 300); 
0

. İşleviniz yürütüldükten sonra gönder olayını engelleyin ya da önceden yürütüldüğünü ayarlamak ve kontrol etmek için bir boole değeri kullanın.

1

Fonksiyonunuzda bir geri arama ayarlayabilirsiniz

jquery gecikme yöntemiyle Ayrıca
$('form').submit(function(event) { 
    var formId = $(this).attr('id'); 

    mySpecialFunction(formId, $(this).doWhatever(formId); 

    event.preventDefault(); 
}); 

function mySpecialFunction(id, onComplete) { 

    if ($.isFunction(onComplete)) { 
     onComplete.call(this); 
    } 
} 
0

mümkün:

$(function() { 
    $('#the_form').delay(300).submit(); 
}); 
0

başka küçük bir kod

$('form').submit(function (e) { 
    var form = this; 
    e.preventDefault(); 
    setTimeout(function() { 
     form.submit(); 
    }, 1000); // in milliseconds 

    $("<p>Delay...</p>").appendTo("body"); 
}); 
İlgili konular