Question

J'ai une enquête sur un site Web, et il semble y avoir quelques problèmes avec les utilisateurs en appuyant sur entrée (je ne sais pas pourquoi) et soumettre accidentellement l'enquête (formulaire) sans cliquer sur le bouton Envoyer. Est-ce qu'il y a un moyen d'éviter cela?

J'utilise HTML, PHP 5.2.9 et jQuery sur l'enquête.

Était-ce utile?

La solution

Vous pouvez utiliser une méthode telle que

$(document).ready(function() {
  $(window).keydown(function(event){
    if(event.keyCode == 13) {
      event.preventDefault();
      return false;
    }
  });
});

En lisant les commentaires sur le message original, pour le rendre plus facile à utiliser et permettent aux gens de presse Entrée si elles ont rempli tous les champs:

function validationFunction() {
  $('input').each(function() {
    ...

  }
  if(good) {
    return true;
  }
  return false;
}

$(document).ready(function() {
  $(window).keydown(function(event){
    if( (event.keyCode == 13) && (validationFunction() == false) ) {
      event.preventDefault();
      return false;
    }
  });
});

Autres conseils

Disallow entrer partout touche

Si vous ne disposez pas d'un <textarea> dans votre formulaire, puis il suffit d'ajouter ce qui suit à votre <form>:

<form ... onkeydown="return event.key != 'Enter';">

Ou avec jQuery:

$(document).on("keydown", "form", function(event) { 
    return event.key != "Enter";
});

Cela entraînera que chaque pression de touche à l'intérieur du formulaire sera vérifié sur le key. Dans le cas contraire Enter, il retournera true et tout continue comme d'habitude. Si elle est Enter, il retournera false et tout ce qui arrêtera immédiatement, de sorte que le formulaire ne sera pas soumis.

est préférable L'événement keydown sur keyup comme keyup est trop tard pour bloquer formulaire soumettre. Par le passé il y avait aussi keypress , mais cela est dépréciée , tout comme le KeyboardEvent.keyCode . Vous devez utiliser KeyboardEvent.key au lieu qui retourne le nom du touche enfoncée. Lorsque Enter est cochée, ce vérifierait 13 (normal entrer), ainsi que 108 (numpad entrer).

Notez que $(window) comme suggéré dans d'autres réponses au lieu de $(document) ne fonctionne pas pour keydown / keyup dans IE <= 8, de sorte que ce n'est pas un bon choix si vous êtes comme pour couvrir ces pauvres utilisateurs aussi bien.

Laisser entrer la clé sur textareas seulement

Si vous avez un <textarea> dans votre formulaire (ce qui bien sûr devrait accepter la touche Entrée), puis ajoutez le gestionnaire keydown à chaque élément d'entrée individuel qui n'est pas <textarea>.

<input ... onkeydown="return event.key != 'Enter';">
<select ... onkeydown="return event.key != 'Enter';">
...

Pour réduire boilerplate, ce qui est mieux à faire avec jQuery:

$(document).on("keydown", ":input:not(textarea)", function(event) {
    return event.key != "Enter";
});

Si vous avez d'autres fonctions de gestionnaire d'événements associés à ces éléments d'entrée, que vous souhaitez également invoquer sur la touche entrée pour une raison quelconque, empêcher que le comportement par défaut de l'événement au lieu de retourner faux, alors il peut bien se propager à d'autres gestionnaires .

$(document).on("keydown", ":input:not(textarea)", function(event) {
    if (event.key == "Enter") {
        event.preventDefault();
    }
});

Laisser entrer la clé sur textareas et boutons d'envoi uniquement

Si vous souhaitez laisser entrer la clé sur les boutons d'envoi <input|button type="submit"> aussi, vous pouvez toujours affiner le sélecteur comme ci-dessous.

$(document).on("keydown", ":input:not(textarea):not(:submit)", function(event) {
    // ...
});

Notez que input[type=text] comme suggéré dans d'autres réponses ne couvre pas les HTML5 entrées non-texte, de sorte que ce n'est pas un bon sélecteur.

Je devais prendre les trois événements liés aux touches urgentes afin d'éviter la soumission du formulaire:

    var preventSubmit = function(event) {
        if(event.keyCode == 13) {
            console.log("caught ya!");
            event.preventDefault();
            //event.stopPropagation();
            return false;
        }
    }
    $("#search").keypress(preventSubmit);
    $("#search").keydown(preventSubmit);
    $("#search").keyup(preventSubmit);

Vous pouvez combiner tout ce qui précède dans une belle version compacte:

    $('#search').bind('keypress keydown keyup', function(e){
       if(e.keyCode == 13) { e.preventDefault(); }
    });

Section 4.10.22.2 soumission implicite de la spécification HTML5 du W3C dit:

  

form bouton de l'élément par défaut est le premier bouton submit pour arbre dont est que form élément.

     

Si l'agent utilisateur prend en charge permettant à l'utilisateur de soumettre une forme implicite (par exemple, sur certaines plates-formes appuyant sur la touche « entrée » alors qu'un champ de texte se concentre soumet implicitement la forme), puis en faisant donc une forme dont bouton par défaut a défini comportement d'activation » rel = "noreferrer" doit faire l'agent utilisateur Exécuter étapes d'activation de clic synthétique sur ce bouton par défaut de rel="noreferrer">.

     
    

Remarque: Par conséquent, si le bouton par défaut est désactivé, le formulaire n'est pas soumis lorsqu'un tel mécanisme de soumission implicite est utilisé. (Un bouton n'a pas quand il est désactivé.)

  

Par conséquent, conforme aux standarts façon de désactiver toute soumission implicite de la forme est de placer un bouton d'envoi désactivé comme le premier bouton d'envoi sous la forme:

<form action="...">
  <!-- Prevent implicit submission of the form -->
  <button type="submit" disabled style="display: none" aria-hidden="true"></button>

  <!-- ... -->

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

Une belle caractéristique de cette approche est que cela fonctionne sans JavaScript ; si JavaScript est activé, il faut un navigateur Web conforme aux normes pour empêcher la soumission de forme implicite.

Si vous utilisez un script pour faire le soumettre réel, vous pouvez ajouter la ligne « return false » au gestionnaire onsubmit comme ceci:

<form onsubmit="return false;">

Appel submit () sur le formulaire de JavaScript ne déclenche pas l'événement.

Utilisation:

$(document).on('keyup keypress', 'form input[type="text"]', function(e) {
  if(e.keyCode == 13) {
    e.preventDefault();
    return false;
  }
});

Cette solution fonctionne sur toutes les formes sur un site Web (également sur les formulaires insérés avec l'Ajax), ce qui empêche que Entrée s dans les textes d'entrée. Placez-le dans un document fonction prêt, et oublier ce problème pour une vie.

Je ne peux pas commenter, donc je vais poster une nouvelle réponse

Acceptée réponse est ok-ish, mais il n'a pas arrêter de soumettre à numpad entrer. Au moins dans la version actuelle de Chrome. Je devais modifier l'état du mot de code à cela, il fonctionne.

if(event.keyCode == 13 || event.keyCode == 169) {...}

Une belle petite solution simple, jQuery:

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

Il est ma solution pour atteindre l'objectif, il est propre et efficace.

$('form').submit(function () {
  if ($(document.activeElement).attr('type') == 'submit')
     return true;
  else return false;
});

Une approche complètement différente:

  1. La première <button type="submit"> sous la forme sera activé sur la touche Entrée .
  2. Ceci est vrai même si le bouton est cachée avec style="display:none;
  3. Le script de ce bouton peut revenir false, ce qui annule le processus de soumission.
  4. Vous pouvez toujours avoir une autre <button type=submit> de soumettre le formulaire. Il suffit de revenir true en cascade la soumission.
  5. Appuyez sur Entrée alors que le vrai bouton de soumission est focalisé activera le bouton réel soumettre.
  6. Appuyez sur Entrée à l'intérieur <textarea> ou d'autres contrôles se comportent normalement.
  7. Appuyez sur Entrée à l'intérieur des contrôles de formulaire de <input> déclencheront la première <button type=submit>, qui retourne false, et donc rien ne se passe.

Ainsi:

<form action="...">
  <!-- insert this next line immediately after the <form> opening tag -->
  <button type=submit onclick="return false;" style="display:none;"></button>

  <!-- everything else follows as normal -->
  <!-- ... -->
  <button type=submit>Submit</button>
</form>

Donner la forme d'une action de 'javascript: void (0);' semble faire l'affaire

<form action="javascript:void(0);">
<input type="text" />
</form>
<script>
$(document).ready(function() {
    $(window).keydown(function(event){
        if(event.keyCode == 13) {
    alert('Hello');
        }
    });
});
</script>

Je avais besoin pour empêcher les entrées seulement spécifiques de soumettre, donc j'ai utilisé un sélecteur de classe, pour que cela soit une caractéristique « globale » où je en ai besoin.

<input id="txtEmail" name="txtEmail" class="idNoEnter" .... />

Et ce code jQuery:

$('.idNoEnter').keydown(function (e) {
  if (e.keyCode == 13) {
    e.preventDefault();
  }
});

Par ailleurs, si keydown est insuffisant:

$('.idNoEnter').on('keypress keydown keyup', function (e) {
   if (e.keyCode == 13) {
     e.preventDefault();
   }
});

Quelques notes:

Modification diverses bonnes réponses ici, le Entrée clé semble fonctionner pour keydown sur tous les navigateurs. Pour l'alternative, je mis à jour bind() à la méthode on().

Je suis un grand fan de sélecteurs de classe, pesant tous les avantages et les inconvénients et les discussions sur le rendement. Ma convention d'appellation est « idSomething » pour indiquer jQuery utilise comme un identifiant, pour le séparer de style CSS.

  1. Ne pas utiliser type = "submit" pour les entrées ou les boutons.
  2. Utiliser type = "button" et utiliser [js Jquery / angulaire / etc] pour soumettre le formulaire au serveur.

Vous pouvez faire une méthode JavaScript afin de vérifier si le Entrée clé a été frappé, et si elle est, pour arrêter le soumettre.

<script type="text/javascript">
  function noenter() {
  return !(window.event && window.event.keyCode == 13); }
</script>

Il suffit d'appeler que la méthode soumettre.

Ne pas mettre un bouton d'envoi pourrait faire. Il suffit de mettre un script à l'entrée (type = bouton) ou ajouter eventListener si vous le souhaitez soumettre les données sous forme.

utilisez plutôt cette

<input type="button">

que d'utiliser cette

<input type="submit">

J'ai eu un problème similaire, où j'avais une grille avec « ajax » textfields (CGridView) et Yû un seul bouton soumettre. Chaque fois que je fait une recherche sur un champ de texte et appuyez sur Entrée le formulaire soumis. Je devais faire quelque chose avec le bouton parce qu'il était le seul bouton commun entre les vues (motif MVC). Tout ce que je devais faire était enlever type="submit" et mettre onclick="document.forms[0].submit()

Je pense qu'il est bien couvert de toutes les réponses, mais si vous utilisez un bouton avec un code de validation JavaScript vous pouvez simplement définir pour Entrez appeler votre soumettre comme prévu le onkeypress du formulaire:

<form method="POST" action="..." onkeypress="if(event.keyCode == 13) mySubmitFunction(this); return false;">

Les onkeypress JS pourrait être tout ce que vous devez faire. Il n'y a pas besoin d'un plus grand, changement global. Cela est particulièrement vrai si vous n'êtes pas celui de codage de l'application à partir de zéro, et vous avez été amené dans une personne fixe le site web d'un autre sans le déchirer et re-tester.

Il y a beaucoup de bonnes réponses déjà là, je veux juste apporter quelque chose du point de vue UX. Commandes du clavier dans les formulaires sont très important.

La question est de savoir comment désactiver de la soumission sur Enter keypress. Comment ignorer Enter dans une application entière. considérer la fixation du gestionnaire Donc à un élément de forme, et non pas la fenêtre.

Désactivation Enter pour la soumission de formulaire doit encore permettre à ce qui suit:

  1. l'envoi du formulaire via Enter lorsque le bouton submit est concentré.
  2. soumission de formulaire lorsque tous les champs sont remplis.
  3. Interaction avec les non-boutons de soumission via Enter.

Ceci est juste boilerplate mais il suit les trois conditions.

$('form').on('keypress', function(e) {
  // Register keypress on buttons.
  $attr = $(e.target).attr('type);
  if ($attr === 'button' || $attr === 'submit') {
    return true;
  }

  // Ignore keypress if all fields are not populated.
  if (e.which === 13 && !fieldsArePopulated(this)) {
    return false;
  }
});

SEULEMENT BLOC SOUMETTRE mais pas les autres fonctionnalités importantes d'entrer la clé, comme la création d'un nouveau paragraphe dans un <textarea>:

window.addEventListener('keydown', function(event) {
  //set default value for variable that will hold the status of keypress
  pressedEnter = false;

  //if user pressed enter, set the variable to true
  if (event.keyCode == 13)
    pressedEnter = true;

  //we want forms to disable submit for a tenth of a second only
  setTimeout(function() {
    pressedEnter = false;
  }, 100)

})

//find all forms
var forms = document.getElementsByTagName('form')

//loop through forms
for (i = 0; i < forms.length; i++) {
  //listen to submit event
  forms[i].addEventListener('submit', function(e) {
    //if user just pressed enter, stop the submit event
    if (pressedEnter == true) {
      updateLog('Form prevented from submit.')
      e.preventDefault();
      return false;
    }

    updateLog('Form submitted.')
  })
}

var log = document.getElementById('log')
updateLog = function(msg) {
  log.innerText = msg
}
input,
textarea {
  display: inline-block;
  margin-bottom: 1em;
  border: 1px solid #6f6f6f;
  padding: 5px;
  border-radius: 2px;
  width: 90%;
  font-size: 14px;
}

input[type=submit] {
  background: lightblue;
  color: #fff;
}
<form>
  <p>Sample textarea (try enter key):</p>
  <textarea rows="4">Hit enter, a new line will be added. But the form won't submit</textarea><br/>
  <p>Sample textfield (try enter key):</p>
  <input type="text" placeholder="" />
  <br/>
  <input type="submit" value="Save" />
  <h3 id="log"></h3>
</form>

Dans mon cas particulier, je devais arrêter de soumettre ENTRER la forme et simulent également le clic du bouton soumettre. En effet, le bouton d'envoi avait un gestionnaire de cliquer dessus parce que nous étions dans une fenêtre modale (ancien code hérité). Dans tous les cas, voici mes solutions combo pour ce cas.

    $('input,select').keypress(function(event) {
        // detect ENTER key
        if (event.keyCode == 13) {
            // simulate submit button click
            $("#btn-submit").click();
            // stop form from submitting via ENTER key press
            event.preventDefault ? event.preventDefault() : event.returnValue = false;
        }
    });

Ce cas d'utilisation est particulièrement utile pour les personnes qui travaillent avec IE8.

Cela fonctionne pour moi

jQuery.each($("#your_form_id").find('input'), function(){
    $(this).bind('keypress keydown keyup', function(e){
       if(e.keyCode == 13) { e.preventDefault(); }
    });
});

Quelque chose que je n'ai pas vu de réponse ici: lorsque vous onglet par les éléments de la page, en appuyant sur Entrée quand vous arrivez à le bouton Soumettre déclenchera le gestionnaire onsubmit sur la forme, mais il enregistrera l'événement comme mouseEvent. Voici ma courte solution pour couvrir la plupart des bases:

Ce n'est pas une réponse liée jQuery

HTML

<form onsubmit="return false;" method=post>
  <input type="text" /><br />
  <input type="button" onclick="this.form.submit()" value="submit via mouse or keyboard" />
  <input type="button" onclick="submitMouseOnly(event)" value="submit via mouse only" />
</form>

JavaScript

window.submitMouseOnly=function(evt){
    let allow=(evt instanceof MouseEvent) && evt.x>0 && evt.y>0 && evt.screenX > 0 && evt.screenY > 0;
    if(allow)(evt.tagName=='FORM'?evt.target:evt.target.form).submit();
}

Pour un exemple de travail: https://jsfiddle.net/nemesarial/6rhogva2/

Je voudrais ajouter un petit code CoffeeScript (non testé sur le terrain):

$ ->
    $(window).bind 'keypress', (event) ->
        if event.keyCode == 13
            unless {'TEXTAREA', 'SELECT'}[event.originalEvent.srcElement.tagName]
                event.preventDefault()

(J'espère que vous aimez l'astuce dans la clause, à moins.)

Allez dans votre css et ajouter que ce sera alors automatiquement bloquer la soumission de votre formular aussi longtemps que vous avez soumettre entrée si vous ne voulez plus vous pouvez le supprimer ou le type activate et deactivate à la place

 input:disabled {
        background: gainsboro;
      }
      input[value]:disabled {
        color: whitesmoke;
      }

Utilisation Javascript (sans vérifier un champ d'entrée):

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

Si quelqu'un veut appliquer cela sur des domaines spécifiques, par exemple saisie de texte du type:

<script>
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>

Cela fonctionne bien dans mon cas.

a travaillé pour moi dans tous les navigateurs après beaucoup de frustration avec d'autres solutions. La fonction extérieure NAME_SPACE est juste pour rester à l'écart de déclarer globals, quelque chose que je vous recommande également.

$(function() {window.name_space = new name_space();}); //jquery doc ready
function name_space() {
    this.is_ie = (navigator.userAgent.indexOf("MSIE") !== -1);

    this.stifle = function(event) {
        event.cancelBubble;
        event.returnValue = false;
        if(this.is_ie === false) {
            event.preventDefault();
        }
        return false;
    }

    this.on_enter = function(func) {
        function catch_key(e) {
            var enter = 13;
            if(!e) {
                var e = event;
            }
            keynum = GetKeyNum(e);
            if (keynum === enter) {
                if(func !== undefined && func !== null) {
                    func();
                }
                return name_space.stifle(e);
            }
            return true; // submit
        }

        if (window.Event) {
            window.captureEvents(Event.KEYDOWN);
            window.onkeydown = catch_key;
        }
        else {
            document.onkeydown = catch_key;
        }

        if(name_space.is_ie === false) {
            document.onkeypress = catch_key;    
        }
    }
}

Utilisation de l'échantillon:

$(function() {
    name_space.on_enter(
        function () {alert('hola!');}
    );
});

Utilisation:

// Validate your form using the jQuery onsubmit function... It'll really work...

$(document).ready(function(){
   $(#form).submit(e){
       e.preventDefault();
       if(validation())
          document.form1.submit();
   });
});

function validation()
{
   // Your form checking goes here.
}

<form id='form1' method='POST' action=''>
    // Your form data
</form>
scroll top