J'ai un formulaire qui prend un peu de temps pour que le serveur soit traité. Je dois m'assurer que l'utilisateur attend et n'essaye pas de soumettre à nouveau le formulaire en cliquant à nouveau sur le bouton. J'ai essayé d'utiliser le code jQuery suivant:
<script type="text/javascript">
$(document).ready(function() {
$("form#my_form").submit(function() {
$('input').attr('disabled', 'disabled');
$('a').attr('disabled', 'disabled');
return true;
});
});
</script>
Quand j'essaye ceci dans Firefox, tout est désactivé mais le formulaire n'est soumis avec aucune des données POST qu'il est censé inclure. Je ne peux pas utiliser jQuery pour soumettre le formulaire car j'ai besoin que le bouton soit soumis avec le formulaire car il y a plusieurs boutons d'envoi et je détermine lequel a été utilisé par lequel sa valeur est incluse dans le POST. J'ai besoin que le formulaire soit soumis comme d'habitude et je dois tout désactiver juste après que cela se produise.
Merci!
Réponses:
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:
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:
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.Utilisez-le comme ceci:
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:
la source
$(this)
sur unvar that = $(this)
?$form
cependant utilisé - 'form' parce que c'est plus descriptif, et le premier$
parce que par ma convention, cela signifie que c'est un objet jQuery.L'approche de synchronisation est incorrecte - comment savoir combien de temps l'action durera sur le navigateur du client?
Comment faire
Lorsque le formulaire est soumis, il désactivera tous les boutons d'envoi à l'intérieur.
N'oubliez pas que dans Firefox, lorsque vous désactivez un bouton, cet état sera mémorisé lorsque vous reviendrez dans l'historique. Pour éviter cela, vous devez activer les boutons lors du chargement de la page, par exemple.
la source
Je pense que la réponse de Nathan Long est la voie à suivre. Pour moi, j'utilise la validation côté client, je viens donc d'ajouter une condition que le formulaire soit valide.
EDIT : Si cela n'est pas ajouté, l'utilisateur ne pourra jamais soumettre le formulaire si la validation côté client rencontre une erreur.
la source
event.timeStamp
ne fonctionne pas dans Firefox. Renvoyer false n'est pas standard, vous devez appelerevent.preventDefault()
. Et tant que nous y sommes, utilisez toujours des accolades avec une construction de contrôle .Pour résumer toutes les réponses précédentes, voici un plugin qui fait le travail et fonctionne avec plusieurs navigateurs.
Pour aborder Kern3l, la méthode de synchronisation fonctionne pour moi simplement parce que nous essayons d'arrêter un double-clic sur le bouton d'envoi. Si vous avez un temps de réponse très long à une soumission, je vous recommande de remplacer le bouton ou le formulaire d'envoi par un spinner.
Le blocage complet des soumissions ultérieures du formulaire, comme le font la plupart des exemples ci-dessus, a un mauvais effet secondaire: s'il y a une défaillance du réseau et qu'ils veulent essayer de soumettre à nouveau, ils ne pourraient pas le faire et perdraient les modifications qu'ils fabriqué. Cela rendrait certainement un utilisateur en colère.
la source
Veuillez consulter le plugin jquery-safeform .
Exemple d'utilisation:
la source
Correct. Les noms / valeurs des éléments de formulaire désactivés ne seront pas envoyés au serveur. Vous devez les définir comme des éléments en lecture seule .
De plus, les ancres ne peuvent pas être désactivées comme ça. Vous devrez soit supprimer leurs HREF (non recommandé), soit empêcher leur comportement par défaut (meilleure façon), par exemple:
la source
$('input[type=submit]').attr("disabled", "disabled");
mais ma manière préférée est de mettreonclick="this.disabled = 'disabled'"
en un clic de la soumission.Il est possible d'améliorer l' approche de Nathan Long . Vous pouvez remplacer la logique de détection du formulaire déjà soumis par celle-ci:
la source
Code de Nathan mais pour le plugin jQuery Validate
Si vous utilisez le plugin jQuery Validate, ils ont déjà implémenté le gestionnaire de soumission, et dans ce cas, il n'y a aucune raison d'en implémenter plus d'un. Le code:
Vous pouvez facilement le développer dans le
} else {
bloc pour désactiver les entrées et / ou soumettre le bouton.À votre santé
la source
J'ai fini par utiliser les idées de cet article pour trouver une solution assez similaire à la version d'AtZako.
En utilisant comme ça:
J'ai trouvé que les solutions qui n'incluaient pas une sorte de délai d'expiration, mais simplement la soumission désactivée ou des éléments de formulaire désactivés posaient des problèmes car une fois le verrouillage déclenché, vous ne pouvez plus soumettre tant que vous n'avez pas actualisé la page. Cela me pose des problèmes lorsque je fais des choses ajax.
Cela peut probablement être un peu embelli car ce n'est pas si compliqué.
la source
Si vous utilisez AJAX pour publier un formulaire, set
async: false
devrait empêcher les soumissions supplémentaires avant que le formulaire ne s'efface:la source
Modification un peu de la solution de Nathan pour Bootstrap 3. Cela définira un texte de chargement sur le bouton d'envoi. De plus, il expirera au bout de 30 secondes et permettra au formulaire d'être resoumis.
la source
Utilisez deux boutons d'envoi.
Et jQuery:
la source
Utilisez un compteur simple lors de la soumission.
Et appelez la
monitor()
fonction lors de l' envoi du formulaire.la source
J'ai eu des problèmes similaires et mes solutions sont les suivantes.
Si vous n'avez aucune validation côté client, vous pouvez simplement utiliser la méthode jquery one () comme documentée ici.
http://api.jquery.com/one/
Cela désactive le gestionnaire après son appel.
Si vous effectuez une validation côté client comme je le faisais, c'est un peu plus délicat. L'exemple ci-dessus ne vous permet pas de soumettre à nouveau après l'échec de la validation. Essayez plutôt cette approche
la source
Vous pouvez arrêter le deuxième envoi par ceci
la source
Ma solution:
la source
Dans mon cas, la soumission du formulaire contenait un code de validation, donc j'incrémente la réponse de Nathan Long, y compris un point de contrôle à la soumission.
la source
Modifier le bouton d'envoi:
Avec bouton normal:
Ensuite, utilisez la fonction de clic:
Et n'oubliez pas de réactiver le bouton lorsque cela est nécessaire:
la source
Je ne peux pas croire le bon vieux truc css des événements de pointeur: aucun n'a encore été mentionné. J'ai eu le même problème en ajoutant un attribut désactivé mais cela ne s'affiche pas. Essayez ce qui suit et remplacez #SubmitButton par l'ID de votre bouton d'envoi.
la source
Enter
touche.Pourquoi pas seulement cela - cela soumettra le formulaire mais désactivera également le bouton d'envoi,
De plus, si vous utilisez jQuery Validate, vous pouvez placer ces deux lignes sous
if ($('#myForm').valid())
.la source
ce code affichera le chargement sur l'étiquette du bouton et définira le bouton sur
désactiver l'état, puis après le traitement, réactiver et renvoyer le texte du bouton d'origine **
la source
J'ai résolu un problème très similaire en utilisant:
la source