Mise à jour en 2018 : je viens de recevoir quelques points pour cette ancienne réponse, et je voulais juste ajouter que la meilleure solution serait de rendre l'opération idempotente afin que les soumissions en double soient inoffensives.
Par exemple, si le formulaire crée une commande, mettez un identifiant unique dans le formulaire. La première fois que le serveur voit une demande de création de commande avec cet identifiant, il doit la créer et répondre «succès». Les soumissions suivantes devraient également répondre «succès» (au cas où le client n'obtiendrait pas la première réponse) mais ne devraient rien changer.
Les doublons doivent être détectés via un contrôle d'unicité dans la base de données pour éviter les conditions de concurrence.
Je pense que votre problème est cette ligne:
$('input').attr('disabled','disabled');
Vous désactivez TOUTES les entrées, y compris, je suppose, celles dont le formulaire est censé soumettre les données.
Pour désactiver uniquement le (s) bouton (s) d'envoi, vous pouvez faire ceci:
$('button[type=submit], input[type=submit]').prop('disabled',true);
Cependant, je ne pense pas que IE soumettra le formulaire si même ces boutons sont désactivés. Je suggérerais une approche différente.
Un plugin jQuery pour le résoudre
Nous venons de résoudre ce problème avec le code suivant. L'astuce ici consiste à utiliser jQuery data()
pour marquer le formulaire comme déjà soumis ou non. De cette façon, nous n'avons pas à jouer avec les boutons d'envoi, ce qui effraie 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;
};
Utilisez-le comme ceci:
$('form').preventDoubleSubmission();
S'il y a des formulaires AJAX qui devraient être autorisés à soumettre plusieurs fois par chargement de page, vous pouvez leur donner une classe indiquant cela, puis les exclure de votre sélecteur comme ceci:
$('form:not(.js-allow-double-submission)').preventDoubleSubmission();