jquery disable form submit on enter

208

J'ai le javascript suivant dans ma page qui ne semble pas fonctionner.

$('form').bind("keypress", function(e) {
  if (e.keyCode == 13) {               
    e.preventDefault();
    return false;
  }
});

Je souhaite désactiver la soumission du formulaire à l'entrée, ou mieux encore, appeler mon formulaire ajax soumettre. L'une ou l'autre solution est acceptable mais le code que j'inclus ci-dessus n'empêche pas la soumission du formulaire.

Adam Levitt
la source
3
Voici une solution HTML simple: stackoverflow.com/a/51507806/337934
SamB

Réponses:

421

Si keyCoden'est pas attrapé, attrapez which:

$('#formid').on('keyup keypress', function(e) {
  var keyCode = e.keyCode || e.which;
  if (keyCode === 13) { 
    e.preventDefault();
    return false;
  }
});

EDIT: manqué, il vaut mieux utiliser keyupau lieu dekeypress

EDIT 2: Comme dans certaines versions plus récentes de Firefox, la soumission du formulaire n'est pas empêchée, il est plus sûr d'ajouter également l'événement Keypress au formulaire. De plus, cela ne fonctionne pas (plus?) En liant simplement l'événement au formulaire "nom" mais uniquement à l'id du formulaire. Par conséquent, j'ai rendu cela plus évident en modifiant correctement l'exemple de code.

EDIT 3: remplacé bind()paron()

zessx
la source
15
jQuery le normalise e.which, vous n'avez donc pas besoin de tester e.keyCode, mais +1 pour la cause la plus probable de ce problème.
Bojangles
4
En avez-vous besoin return false;? e.preventDefault();semble assez
chromigo
10
Important! Ce bloc de solution se casse dans la zone de texte.
German Khokhlov
4
Le problème est que si j'ai sous la même forme une zone de texte, maintenant je ne peux pas ajouter une entrée (pour faire une nouvelle ligne) dans la zone de texte.
Tikky
3
keyCode === 13 && !$(e.target).is('textarea')
teran
62

Habituellement, le formulaire est soumis Enterlorsque vous vous concentrez sur les éléments d'entrée.

Nous pouvons désactiver la Enterclé (code 13) sur les éléments d'entrée dans un formulaire:

$('form input').on('keypress', function(e) {
    return e.which !== 13;
});

DÉMO: http://jsfiddle.net/bnx96/325/

Vision
la source
Le bouton iOS Go était mon problème sur un champ de saisie de saisie semi-automatique personnalisé. Cela l'a résolu.
Dylan Valade
11
Cela empêche l'utilisation de la touche Entréetextareas dans le même formulaire. Utiliser $("form input")au lieu de $("form :input")semble le corriger. DEMO: jsfiddle.net/bnx96/279
shaneparsons
43

Encore plus court:

$('myform').submit(function() {
  return false;
});
user1017926
la source
35
Mais cela empêchera également l'utilisateur de cliquer?
haibuihoang
5
@haibuihoang Oui, cela désactivera la soumission du formulaire.
Tom
7
Vous devez utiliser function(e) {e.preventDefault();}comme valeurs de retour dans les gestionnaires d'événements sont obsolètes: stackoverflow.com/a/20045473/601386
grippe
6
@ user1111929 Cela fonctionne très bien, mais ce ne devrait pas être la première réponse car la question Enterne concerne que la désactivation de la soumission des formulaires par le Submitbouton et non la désactivation .
daveslab
Une situation courante dans laquelle vous souhaiterez peut-être conserver la soumission du formulaire, mais désactiver la soumission en appuyant sur la touche «Entrée», est si vous décidez d'utiliser un jQuery onClick événement pour valider un formulaire et que vous soumettez toujours à l'aide de jQuery. En d'autres termes, il y a des cas où vous ne souhaitez soumettre que via javascript / jQuery. Bien que vous puissiez toujours utiliser AJAX avec cette solution, il désactive la fonctionnalité de base de la submitméthode.
JRad the Bad
23
$('form').keyup(function(e) {
  return e.which !== 13  
});

La propriété event.which normalise event.keyCode et event.charCode. Il est recommandé de regarder event.which pour la saisie des touches du clavier.

which docs.

gdoron soutient Monica
la source
14
$(document).on('keyup keypress', 'form input[type="text"]', function(e) {
  if(e.which == 13) {
    e.preventDefault();
    return false;
  }
});

Cette solution fonctionne sur tous les formulaires du site Web (également sur les formulaires insérés avec ajax), empêchant uniquement les entrées dans les textes saisis. Placez-le dans une fonction prête pour les documents et oubliez ce problème toute votre vie.

Buzogany Laszlo
la source
9

La plupart des réponses ci-dessus empêcheront les utilisateurs d'ajouter de nouvelles lignes dans un champ de zone de texte. Si c'est quelque chose que vous voulez éviter, vous pouvez exclure ce cas particulier en vérifiant quel élément a actuellement le focus:

var keyCode = e.keyCode || e.which;
if (keyCode === 13 && !$(document.activeElement).is('textarea')) {
  e.preventDefault();
  return false;
}
jean-baptiste
la source
8

L'excès d'avoir à capturer et à tester chaque frappe pour la touche ENTRÉE me dérange vraiment, donc ma solution repose sur le comportement du navigateur suivant:

Appuyer sur ENTER déclenchera un événement de clic sur le bouton d'envoi (testé dans IE11, Chrome 38, FF 31) ** (ref: http://mattsnider.com/how-forms-submit-when-pressing-enter/ )

Ma solution consiste donc à supprimer le bouton d'envoi standard (c'est-à-dire <input type="submit">) afin que le comportement ci-dessus échoue car il n'y a pas de bouton d'envoi pour cliquer comme par magie lorsque vous appuyez sur ENTRÉE. Au lieu de cela, j'utilise un gestionnaire de clics jQuery sur un bouton normal pour soumettre le formulaire via la .submit()méthode de jQuery .

<form id="myform" method="post">
  <input name="fav_color" type="text">
  <input name="fav_color_2" type="text">
<button type="button" id="form-button-submit">DO IT!</button>
</form>

<script>
 $('#form-button-submit').click(function(){
    $('#myform').submit();
  });
</script>

Démo: http://codepen.io/anon/pen/fxeyv?editors=101

** ce comportement n'est pas applicable si le formulaire n'a qu'un seul champ de saisie et que ce champ est une entrée "texte"; dans ce cas, le formulaire sera soumis sur la touche ENTER même si aucun bouton d'envoi n'est présent dans le balisage HTML (par exemple un champ de recherche). C'est le comportement standard du navigateur depuis les années 90.

Costa
la source
J'ai ajouté une zone de saisie invisible pour contrer "le formulaire sera soumis sur la touche ENTRÉE" provoqué par "le formulaire n'a qu'un seul champ de saisie et ce champ est une entrée" texte "".
Luo Jiong Hui
6

si vous voulez simplement désactiver la soumission sur le bouton Entrée et Soumettre aussi, utilisez l'événement onsubmit du formulaire

<form onsubmit="return false;">

Vous pouvez remplacer "return false" par un appel à la fonction JS qui fera tout ce qui est nécessaire et soumettra également le formulaire comme dernière étape.

Perica Zivkovic
la source
1
Cela désactivera toutes les soumissions de formulaires, y compris en cliquant sur le bouton Soumettre.
Nick
pas à 100% ... travailler régulièrement soumettre une clé ... utiliser au mieux jquery pour éviter
KingRider
Bonne réponse alternative (avec les mises en garde ci-dessus) parce que ... eh bien, parfois c'est tout ce dont vous avez besoin.
emilys
c'est exactement ce dont j'avais besoin pour une situation, merci
shababhsiddique
4

Vous pouvez le faire parfaitement en Javascript pur, simple et sans bibliothèque requise. Voici ma réponse détaillée pour un sujet similaire: Désactiver la touche Entrée pour le formulaire

En bref, voici le code:

<script type="text/javascript">
window.addEventListener('keydown',function(e){if(e.keyIdentifier=='U+000A'||e.keyIdentifier=='Enter'||e.keyCode==13){if(e.target.nodeName=='INPUT'&&e.target.type=='text'){e.preventDefault();return false;}}},true);
</script>

Ce code sert à empêcher la touche "Entrée" pour la saisie de type = "texte" uniquement. (Parce que le visiteur peut avoir besoin d'appuyer sur Entrée sur la page) Si vous souhaitez également désactiver "Entrée" pour d'autres actions, vous pouvez ajouter console.log (e); pour vos besoins de test, et appuyez sur F12 en chrome, allez dans l'onglet "console" et appuyez sur "backspace" sur la page et regardez à l'intérieur pour voir quelles valeurs sont retournées, puis vous pouvez cibler tous ces paramètres pour améliorer encore le code ci-dessus pour répondre à vos besoins pour "e.target.nodeName" , "e.target.type" et bien d'autres ...

Tarik
la source
2
En fait, ça devrait l'être e.target.nodeName === 'INPUT' && e.target.type !== 'textarea'. Avec le code spécifié, il permettra de soumettre des formulaires si une radio ou une case à cocher est ciblée.
afnpires
3

Je ne sais pas si vous résolvez déjà ce problème, ou si quelqu'un essaie de le résoudre maintenant, mais voici ma solution pour cela!

$j(':input:not(textarea)').keydown(function(event){
    var kc = event.witch || event.keyCode;
    if(kc == 13){
    event.preventDefault();
        $j(this).closest('form').attr('data-oldaction', function(){
            return $(this).attr('action');
        }).attr('action', 'javascript:;');

        alert('some_text_if_you_want');

        $j(this).closest('form').attr('action', function(){
            return $(this).attr('data-oldaction');
        });
        return false;
    }
});
Don Marcony Neves
la source
2

Le moyen le plus simple est de changer le type de bouton en bouton - en html puis d'ajouter un événement en js ...

Changement par rapport à ceci:

<form id="myForm">
   <button type="submit">Submit</button>
</form>

À

<form id="myForm">
   <button type="button" id="btnSubmit">Submit</button>
</form>

Et en js ou jquery ajoutez:

("#btnSubmit").click(function () {
    $('#myForm').submit();
});
Zvi Redler
la source
1

Le code suivant annule l'utilisation de la clé d'entrée pour soumettre un formulaire, mais vous permet tout de même d'utiliser la clé d'entrée dans une zone de texte. Vous pouvez le modifier davantage en fonction de vos besoins.

<script type="text/javascript">
        function stopRKey(evt) {
          var evt = (evt) ? evt : ((event) ? event : null);
          var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
          if ((evt.keyCode == 13) && ((node.type=="text") || (node.type=="radio") || (node.type=="checkbox")) )  {return false;}
        }

        document.onkeypress = stopRKey;
</script> 
Un radis
la source
1

Dans Firefox, lorsque vous entrez et appuyez sur Entrée, il soumettra son formulaire supérieur. La solution est dans le formulaire de soumission, ajoutez ceci:

<input type="submit" onclick="return false;" style="display:none" />
patauger
la source
1

3 ans plus tard et pas une seule personne n'a répondu complètement à cette question.

Le demandeur souhaite annuler la soumission du formulaire par défaut et appeler son propre Ajax. Il s'agit d'une simple demande avec une solution simple. Il n'est pas nécessaire d'intercepter chaque caractère entré dans chaque entrée.

En supposant que le formulaire possède un bouton d'envoi, que ce soit un <button id="save-form">ou un <input id="save-form" type="submit">, faites:

$("#save-form").on("click", function () {
    $.ajax({
        ...
    });
    return false;
});
derekm
la source
-2

Lorsque le fichier est terminé (chargement terminé), le script détecte chaque événement pour la touche "Entrée" et il désactive l'événement derrière.

<script>
            $(document).ready(function () {
                $(window).keydown(function(event){
                    if(event.keyCode == 13) {
                        e.preventDefault(); // Disable the " Entry " key
                        return false;               
                    }
                });
            });
        </script>
McNavy
la source
ajouter des explications
HaveNoDisplayName
@HaveNoDisplayName: mis à jour.
McNavy
-4

Solution complète en JavaScript pour tous les navigateurs

Le code ci-dessus et la plupart des solutions sont parfaits. Cependant, je pense que la "réponse courte" la plus appréciée est incomplète.

Voici donc la réponse complète. en JavaScript avec prise en charge native d'IE 7 également.

var form = document.getElementById("testForm");
form.addEventListener("submit",function(e){e.preventDefault(); return false;});

Cette solution empêchera désormais l'utilisateur de soumettre à l'aide de la touche Entrée et ne rechargera pas la page, ni ne vous amènera en haut de la page, si votre formulaire se trouve quelque part en dessous.

Tarandeep Singh
la source
8
Cela empêche également l'envoi du formulaire si vous cliquez sur le bouton «Soumettre».
Mario Werner
-10

Que dis-tu de ça:

$(":submit").closest("form").submit(function(){
    $(':submit').attr('disabled', 'disabled');
});

Cela devrait désactiver tous les formulaires avec des boutons d'envoi dans votre application.

Shreekar Patel
la source