J'ai un sondage sur un site Web et il semble y avoir des problèmes avec les utilisateurs qui entrent (je ne sais pas pourquoi) et soumettent accidentellement le sondage (formulaire) sans cliquer sur le bouton soumettre. Est-ce qu'il y a un moyen d'éviter cela?
J'utilise HTML, PHP 5.2.9 et jQuery sur l'enquête.
jquery
html
forms
form-submit
DForck42
la source
la source
Réponses:
Vous pouvez utiliser une méthode telle que
En lisant les commentaires sur le message d'origine, pour le rendre plus utilisable et permettre aux gens de presser Enters'ils ont rempli tous les champs:
la source
keydown
audocument
lieu dewindow
pour que cela fonctionne.&& !$(document.activeElement).is('textarea')
à la condition, sinon les sauts de ligne à l'intérieur d'une zone de texte sont bloqués (dans IE au moins).Interdire la touche entrée n'importe où
Si vous n'en avez pas
<textarea>
dans votre formulaire, ajoutez simplement ce qui suit à votre<form>
:Ou avec jQuery:
Cela entraînera que chaque pression de touche à l'intérieur du formulaire sera vérifiée sur le
key
. Si ce n'est pas le casEnter
, il reviendratrue
et tout continuera comme d'habitude. Si c'est le casEnter
, il reviendrafalse
et tout s'arrêtera immédiatement, donc le formulaire ne sera pas envoyé.L'
keydown
événement est préférékeyup
car ilkeyup
est trop tard pour bloquer la soumission du formulaire. Historiquement, il y avait aussi lekeypress
, mais c'est obsolète, tout comme leKeyboardEvent.keyCode
. Vous devez utiliser à laKeyboardEvent.key
place qui renvoie le nom de la touche enfoncée. LorsqueEnter
est coché, cela vérifierait 13 (entrée normale) ainsi que 108 (entrée du pavé numérique).Notez que
$(window)
comme suggéré dans certaines autres réponses au lieu de$(document)
ne fonctionne pas pourkeydown
/keyup
dans IE <= 8, ce n'est donc pas un bon choix si vous souhaitez également couvrir ces pauvres utilisateurs.Autoriser la touche Entrée uniquement sur les zones de texte
Si vous avez un
<textarea>
dans votre formulaire (qui bien sûr devrait accepter la touche Entrée), ajoutez le gestionnaire de keydown à chaque élément d'entrée individuel qui n'est pas un<textarea>
.Pour réduire le passe-partout, il est préférable de le faire avec jQuery:
Si vous avez d'autres fonctions de gestionnaire d'événements attachées à ces éléments d'entrée, que vous souhaitez également invoquer sur la touche Entrée pour une raison quelconque, n'empêchez que le comportement par défaut de l'événement au lieu de renvoyer false, afin qu'il puisse se propager correctement aux autres gestionnaires.
Autoriser la touche Entrée dans les zones de texte et soumettre uniquement les boutons
Si vous souhaitez également autoriser la touche Entrée sur les boutons de soumission
<input|button type="submit">
, vous pouvez toujours affiner le sélecteur comme ci-dessous.Notez que,
input[type=text]
comme suggéré dans certaines autres réponses, ne couvre pas ces entrées non textuelles HTML5, ce n'est donc pas un bon sélecteur.la source
":input:not(textarea):not([type=submit]):not(button)"
si vous utilisez<button>
au lieu de<input type=submit>
input
?La section 4.10.22.2 La soumission implicite de la spécification W3C HTML5 dit:
Par conséquent, une façon conforme aux normes de désactiver toute soumission implicite du formulaire consiste à placer un bouton d'envoi désactivé comme premier bouton d'envoi du formulaire:
Une caractéristique intéressante de cette approche est qu'elle fonctionne sans JavaScript ; que JavaScript soit activé ou non, un navigateur Web conforme aux normes est requis pour empêcher la soumission implicite de formulaires.
la source
<input type="submit" disabled style="display: none" aria-hidden="true" />
et à mesure et vous pouvez réduire la taille de votre page de quelques caractères. :-PJ'ai dû attraper les trois événements liés à la pression des touches afin d'empêcher la soumission du formulaire:
Vous pouvez combiner tout ce qui précède dans une belle version compacte:
la source
$("#search").bind('keypress keyup keydown',preventSubmit)
;<form>
balise, la touche entrée se présenter sous forme ... Cette solution désactivé sur la touche Entrée et fixe le problème cependant, merci @ Dave! Ensuite, j'ai activé la touche Entrée pour certains champs parid
.console.log
, j'ai mis à jour ma réponse.keypress keyup keydown
vous déclenchez code dans la condition if deux fois .Si vous utilisez un script pour effectuer la soumission réelle, vous pouvez ajouter la ligne "return false" au gestionnaire onsubmit comme ceci:
L'appel de submit () sur le formulaire à partir de JavaScript ne déclenchera pas l'événement.
la source
Utilisation:
Cette solution fonctionne sur tous les formulaires d'un site Web (également sur les formulaires insérés avec Ajax), empêchant uniquement les Enters dans les textes saisis. Placez-le dans une fonction prête pour le document et oubliez ce problème pour la vie.
la source
e.which
était bonne; pas besoin de le changere.keyCode
. Les deux renvoient la valeur 13 pour la touche Entrée. Voir stackoverflow.com/a/4471635/292060 et stackoverflow.com/a/18184976/292060Au lieu d'empêcher les utilisateurs d'appuyer sur Enter, ce qui peut sembler anormal, vous pouvez laisser le formulaire tel quel et ajouter une validation supplémentaire côté client: lorsque l'enquête n'est pas terminée, le résultat n'est pas envoyé au serveur et l'utilisateur reçoit un joli message disant ce qui doit être terminé pour remplir le formulaire. Si vous utilisez jQuery, essayez le plugin Validation:
http://docs.jquery.com/Plugins/Validation
Cela nécessitera plus de travail que d'attraper le Enterbouton, mais cela offrira sûrement une expérience utilisateur plus riche.
la source
Une jolie petite solution jQuery simple:
la source
var key = event.keyCode || event.which; if (key == 13) return false;
Je ne peux pas encore commenter, je vais donc poster une nouvelle réponse
La réponse acceptée est ok-ish, mais elle n'a pas empêché la soumission sur le pavé numérique. Au moins dans la version actuelle de Chrome. J'ai dû modifier la condition du code clé pour cela, puis cela fonctionne.
la source
C'est ma solution pour atteindre l'objectif, c'est propre et efficace.
la source
Une approche complètement différente:
<button type="submit">
du formulaire sera activé en appuyant sur Enter.style="display:none;
false
, ce qui interrompt le processus de soumission.<button type=submit>
pour soumettre le formulaire. Revenez simplementtrue
pour mettre en cascade la soumission.<textarea>
ou sur d'autres contrôles de formulaire se comportera normalement.<input>
contrôles de formulaire déclenchera le premier<button type=submit>
, qui revientfalse
, et donc rien ne se passe.Donc:
la source
<button onclick="this.disabled=true;this.form.submit();" type="submit"">submit</button>
Donner au formulaire une action de 'javascript: void (0);' semble faire l'affaire
la source
Ne pas mettre un bouton de soumission pourrait faire l'affaire. Il suffit de mettre un script à l'entrée (type = bouton) ou d'ajouter eventListener si vous voulez qu'il soumette les données dans le formulaire.
Utilisez plutôt ceci
que d'utiliser cela
la source
la source
J'avais besoin d'empêcher seulement des entrées spécifiques de soumettre, j'ai donc utilisé un sélecteur de classe, pour que cela soit une fonctionnalité "globale" partout où j'en ai besoin.
Et ce code jQuery:
Alternativement, si la clé est insuffisante:
Quelques notes:
En modifiant ici diverses bonnes réponses, la Enterclé semble fonctionner pour
keydown
tous les navigateurs. Pour l'alternative, j'ai misbind()
à jour laon()
méthode.Je suis un grand fan des sélecteurs de classe, pesant tous les avantages et les inconvénients et les discussions sur les performances. Ma convention de dénomination est «idSomething» pour indiquer que jQuery l'utilise comme identifiant, pour le séparer du style CSS.
la source
Vous pouvez créer une méthode JavaScript pour vérifier si la Enterclé a été frappée, et si c'est le cas, pour arrêter la soumission.
Appelez simplement cela sur la méthode de soumission.
la source
BLOQUER SEULEMENT SOUMETTRE mais pas d'autres fonctionnalités importantes de la touche Entrée, telles que la création d'un nouveau paragraphe dans un
<textarea>
:la source
function(e)
cela devrait l'êtrefunction(event)
. Sinon, ça marche pour moi. Je vous remercie.on("keydown", function(event) { enterPressed = true; }
, puis dans l'événement submit, doon("submit", function(e) { if (pressedEnter == true) { pressedEnter = false; e.preventDefault(); return false;}
Ceci garantira que cela fonctionne quel que soit le délai.C'est le moyen idéal, vous ne serez pas redirigé depuis votre page
la source
J'ai eu un problème similaire, où j'avais une grille avec "ajax textfields" (Yii CGridView) et un seul bouton de soumission. Chaque fois que je faisais une recherche sur un champ de texte et que j'appuyais sur le formulaire soumis. J'ai dû faire quelque chose avec le bouton car c'était le seul bouton commun entre les vues (modèle MVC). Tout ce que j'avais à faire était de retirer
type="submit"
et de mettreonclick="document.forms[0].submit()
la source
Je pense qu'il est bien couvert avec toutes les réponses, mais si vous utilisez un bouton avec un code de validation JavaScript, vous pouvez simplement définir la touche onkeypress du formulaire pour que Enter appelle votre soumission comme prévu:
Le onkeypress JS pourrait être tout ce que vous devez faire. Il n'est pas nécessaire de procéder à un changement global plus important. Cela est particulièrement vrai si vous n'êtes pas le seul à coder l'application à partir de zéro, et que vous avez été amené à réparer le site Web de quelqu'un d'autre sans le déchirer et le tester à nouveau.
la source
Il y a déjà beaucoup de bonnes réponses ici, je veux juste apporter quelque chose du point de vue UX. Les commandes du clavier dans les formulaires sont très importantes.
La question est de savoir comment désactiver la soumission en appuyant sur une touche
Enter
. Pas comment ignorerEnter
dans une application entière. Pensez donc à attacher le gestionnaire à un élément de formulaire, pas à la fenêtre.La désactivation
Enter
de la soumission du formulaire devrait toujours permettre ce qui suit:Enter
bouton Soumettre.Enter
.Ce n'est qu'un passe-partout, mais il suit les trois conditions.
la source
Quelque chose à laquelle je n'ai pas vu de réponse ici: lorsque vous parcourez les éléments de la page, appuyez sur Enterlorsque vous accédez au bouton d'envoi pour déclencher le gestionnaire onsubmit sur le formulaire, mais il enregistrera l'événement comme un événement MouseEvent. Voici ma courte solution pour couvrir la plupart des bases:
Ce n'est pas une réponse liée à jQuery
HTML
Javascript
Pour trouver un exemple de travail: https://jsfiddle.net/nemesarial/6rhogva2/
la source
Dans mon cas spécifique, j'ai dû empêcher ENTER de soumettre le formulaire et simuler le clic du bouton soumettre. C'est parce que le bouton d'envoi avait un gestionnaire de clics parce que nous étions dans une fenêtre modale (ancien code hérité). En tout cas, voici mes solutions combo pour ce cas.
Ce cas d'utilisation est particulièrement utile pour les personnes travaillant avec IE8.
la source
Ça marche pour moi
la source
Je voudrais ajouter un peu de code CoffeeScript (non testé sur le terrain):
(J'espère que vous aimez la bonne astuce dans la clause à moins.)
la source
Utilisation de Javascript (sans vérifier aucun champ de saisie):
Si quelqu'un souhaite l'appliquer à des champs spécifiques, par exemple le texte du type d'entrée:
Cela fonctionne bien dans mon cas.
la source
Allez dans votre CSS et ajoutez-le, puis bloquera automatiquement la soumission de votre formulaire tant que vous aurez soumis une entrée si vous ne le souhaitez plus, vous pouvez le supprimer ou taper
activate
et à ladeactivate
placela source
Vous pouvez également utiliser
javascript:void(0)
pour empêcher la soumission du formulaire.la source
method="post"
sur votre formulaire. Par exemple, je veux que le formulaire soit soumis par des boutons, mais pas lorsque vous appuyez sur Entrée tout en étant concentré dans l'entrée.method="post"
forme et ses œuvres, vérifiez à nouveau.Cela a fonctionné pour moi dans tous les navigateurs après beaucoup de frustration avec d'autres solutions. La fonction externe name_space est juste pour éviter de déclarer des globales, quelque chose que je recommande également.
Exemple d'utilisation:
la source
Utilisation:
la source