Update im Jahr 2018 : Ich habe gerade einige Punkte für diese alte Antwort erhalten und wollte nur hinzufügen, dass die beste Lösung darin besteht, die Operation idempotent zu machen, damit doppelte Einreichungen harmlos sind.
Wenn das Formular beispielsweise eine Bestellung erstellt, geben Sie eine eindeutige ID in das Formular ein. Wenn der Server zum ersten Mal eine Anforderung zur Auftragserstellung mit dieser ID sieht, sollte er diese erstellen und auf "Erfolg" antworten. Nachfolgende Einsendungen sollten ebenfalls mit "Erfolg" antworten (falls der Client nicht die erste Antwort erhalten hat), aber nichts ändern.
Duplikate sollten über eine Eindeutigkeitsprüfung in der Datenbank erkannt werden, um Rennbedingungen zu vermeiden.
Ich denke, dass Ihr Problem diese Zeile ist:
$('input').attr('disabled','disabled');
Sie deaktivieren ALLE Eingaben, einschließlich derjenigen, deren Daten das Formular senden soll.
Um nur die Senden-Schaltfläche (n) zu deaktivieren, können Sie Folgendes tun:
$('button[type=submit], input[type=submit]').prop('disabled',true);
Ich glaube jedoch nicht, dass der IE das Formular senden wird, wenn auch diese Schaltflächen deaktiviert sind. Ich würde einen anderen Ansatz vorschlagen.
Ein jQuery-Plugin, um es zu lösen
Wir haben dieses Problem gerade mit dem folgenden Code gelöst. Der Trick dabei ist, mit jQuery's data()
das Formular als bereits gesendet zu markieren oder nicht. Auf diese Weise müssen wir uns nicht mit den Submit-Buttons herumschlagen, was den IE ausflippt.
// 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;
};
Verwenden Sie es so:
$('form').preventDoubleSubmission();
Wenn es AJAX-Formulare gibt, die mehrmals pro Seitenladevorgang gesendet werden dürfen, können Sie ihnen eine Klasse geben, die dies angibt, und sie dann wie folgt aus Ihrer Auswahl ausschließen:
$('form:not(.js-allow-double-submission)').preventDoubleSubmission();