Aktualizacja w 2018 r . : Właśnie dostałem kilka punktów za tę starą odpowiedź i chciałem tylko dodać, że najlepszym rozwiązaniem byłoby uczynienie operacji idempotentną, aby zduplikowane zgłoszenia były nieszkodliwe.
Np. Jeśli formularz tworzy zamówienie, umieść w formularzu unikalny identyfikator. Gdy serwer po raz pierwszy zobaczy żądanie utworzenia zamówienia o tym identyfikatorze, powinien je utworzyć i odpowiedzieć „sukces”. Kolejne zgłoszenia również powinny odpowiadać „sukces” (w przypadku, gdy klient nie otrzymał pierwszej odpowiedzi), ale nie powinny niczego zmieniać.
Duplikaty powinny być wykrywane przez kontrolę unikalności w bazie danych, aby zapobiec sytuacjom wyścigu.
Myślę, że Twoim problemem jest ta linia:
$('input').attr('disabled','disabled');
Wyłączasz WSZYSTKIE dane wejściowe, w tym, jak sądzę, te, których dane ma przesłać formularz.
Aby wyłączyć tylko przyciskiem przedstawienia (S), to mogłaby to zrobić:
$('button[type=submit], input[type=submit]').prop('disabled',true);
Nie sądzę jednak, aby IE przesłał formularz, jeśli nawet te przyciski są wyłączone. Proponuję inne podejście.
Wtyczka jQuery do rozwiązania tego problemu
Właśnie rozwiązaliśmy ten problem za pomocą następującego kodu. Sztuczka polega na tym, że użycie jQuery data()
do oznaczenia formularza jako już przesłanego lub nie. W ten sposób nie musimy majstrować przy przyciskach przesyłania, co wkurza IE.
// 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;
};
Użyj tego w ten sposób:
$('form').preventDoubleSubmission();
Jeśli istnieją formularze AJAX, które powinny być przesyłane wiele razy podczas ładowania strony, możesz nadać im klasę wskazującą na to, a następnie wykluczyć je ze swojego selektora w następujący sposób:
$('form:not(.js-allow-double-submission)').preventDoubleSubmission();