2018'de güncelleme : Bu eski cevap için bazı puanlar aldım ve sadece en iyi çözümün, işlemlerin ikna edici olmasını sağlamak, böylece yinelenen gönderimlerin zararsız olmasını sağlamak istedim .
Örneğin, form bir sipariş oluşturuyorsa, forma benzersiz bir kimlik ekleyin. Sunucu bu kimliğe sahip bir sipariş oluşturma isteği ilk gördüğünde, onu oluşturmalı ve "başarılı" yanıt vermelidir. Sonraki gönderimler de "başarılı" yanıt vermelidir (müşterinin ilk yanıtı almaması durumunda), ancak hiçbir şeyi değiştirmemelidir.
Yarış koşullarını önlemek için, veri tabanındaki bir teklik kontrolü ile kopyalar tespit edilmelidir.
Bence senin sorunun şu satır:
$('input').attr('disabled','disabled');
Tahmin ediyorum ki, verileri formun göndermesi gereken girişler de dahil olmak üzere TÜM girdileri devre dışı bırakıyorsunuz.
Yalnızca gönder düğmelerini devre dışı bırakmak için şunları yapabilirsiniz :
$('button[type=submit], input[type=submit]').prop('disabled',true);
Ancak, bu düğmeler bile devre dışı olsa bile IE formu göndereceğini sanmıyorum. Farklı bir yaklaşım öneririm.
Bunu çözmek için bir jQuery eklentisi
Bu sorunu aşağıdaki kodla çözdük. Buradaki hile, jQuery's'i kullanarak data()
formu önceden gönderilmiş veya gönderilmemiş olarak işaretlemektedir. Bu şekilde, IE'yi korkutacak gönderme düğmeleriyle uğraşmak zorunda kalmıyoruz.
// jQuery plugin to prevent double submission of forms
jQuery.fn.preventDoubleSubmission = function() {
$(this).on('submit',function(e){
var $form = $(this);
if ($form.data('submitted') === true) {
// Previously submitted - don't submit again
e.preventDefault();
} else {
// Mark it so that the next submit can be ignored
$form.data('submitted', true);
}
});
// Keep chainability
return this;
};
Şöyle kullanın:
$('form').preventDoubleSubmission();
Sayfa yüklemesi başına birden çok kez gönderilmesine izin verilmesi gereken AJAX formları varsa, onlara bunu gösteren bir sınıf verebilir, ardından bunları seçicinizden hariç tutabilirsiniz:
$('form:not(.js-allow-double-submission)').preventDoubleSubmission();