Aggiornamento nel 2018 : ho appena ricevuto alcuni punti per questa vecchia risposta e volevo solo aggiungere che la soluzione migliore sarebbe quella di rendere l'operazione idempotente in modo che gli invii duplicati siano innocui.
Ad esempio, se il modulo crea un ordine, inserire un ID univoco nel modulo. La prima volta che il server vede una richiesta di creazione dell'ordine con quell'id, dovrebbe crearla e rispondere "successo". I successivi invii dovrebbero anche rispondere al "successo" (nel caso in cui il cliente non ottenga la prima risposta) ma non dovrebbero cambiare nulla.
I duplicati devono essere rilevati tramite un controllo di unicità nel database per prevenire le condizioni di gara.
Penso che il tuo problema sia questa linea:
$('input').attr('disabled','disabled');
Stai disabilitando TUTTI gli input, compresi, immagino, quelli i cui dati dovrebbero essere inviati dal modulo.
Per disattivare solo il pulsante di invio (s), si potrebbe fare questo:
$('button[type=submit], input[type=submit]').prop('disabled',true);
Tuttavia, non credo che IE invierà il modulo se anche quei pulsanti sono disabilitati. Suggerirei un approccio diverso.
Un plugin jQuery per risolverlo
Abbiamo appena risolto questo problema con il seguente codice. Il trucco qui sta usando jQuery data()
per contrassegnare il modulo come già inviato o meno. In questo modo, non dobbiamo pasticciare con i pulsanti di invio, il che fa impazzire 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;
};
Usalo in questo modo:
$('form').preventDoubleSubmission();
Se ci sono moduli AJAX che dovrebbero essere autorizzati a inviare più volte per caricamento della pagina, puoi dare loro una classe che indica quello, quindi escluderli dal tuo selettore in questo modo:
$('form:not(.js-allow-double-submission)').preventDoubleSubmission();