¿Cómo evitar que se presione ENTER para enviar un formulario web?

207

¿Cómo evita que una ENTERpulsación de tecla envíe un formulario en una aplicación basada en la web?

usuario67722
fuente

Respuestas:

99

[ revisión 2012, sin manejador en línea, preservar manejo de ingreso de área de texto]

function checkEnter(e){
 e = e || event;
 var txtArea = /textarea/i.test((e.target || e.srcElement).tagName);
 return txtArea || (e.keyCode || e.which || e.charCode || 0) !== 13;
}

Ahora puede definir un controlador de pulsación de tecla en el formulario:
<form [...] onkeypress = "return checkEnter (event)">

document.querySelector('form').onkeypress = checkEnter;
KooiInc
fuente
3
Por cierto: puede agregar una verificación para el tipo de entrada (a través del origen del evento) en la función checkEnter para excluir el área de texto.
KooiInc
1
Trabajos. Agregué esto a una sola entrada porque quería evitar que <enter> envíe el formulario. Tenía un botón para realizar una búsqueda interna, y en realidad mejora la usabilidad.
Foxinni
1
Un problema con este enfoque (al usar esta función con un controlador de eventos en el formulario como un todo), es que también evita que se produzcan entradas en áreas de texto que también están en el formulario (donde las entradas son generalmente deseables).
Lonnie Best
1
@LonnieBest: gracias por notarlo. Usted qué leer mi comentario sobre esta respuesta (véase más arriba), ¿verdad? De todos modos, revisé esta respuesta bastante antigua.
KooiInc
1
@ Jonathan: puede adjuntar el controlador a campos de entrada individuales o algún div que contenga una colección de campos de entrada (pero no los botones) en lugar de todo el formulario.
KooiInc
57

Aquí hay un controlador jQuery que se puede usar para detener el ingreso de envíos y también detener la tecla de retroceso -> atrás. Los pares (keyCode: selectorString) en el objeto "keyStop" se utilizan para hacer coincidir los nodos que no deberían activar su acción predeterminada.

Recuerde que la web debe ser un lugar accesible, y esto está rompiendo las expectativas de los usuarios de teclados. Dicho esto, en mi caso, a la aplicación web en la que estoy trabajando no le gusta el botón Atrás de todos modos, por lo que deshabilitar su atajo de teclado está bien. La discusión "debería entrar -> enviar" es importante, pero no está relacionada con la pregunta real formulada.

¡Aquí está el código, para que pienses en la accesibilidad y por qué realmente querrías hacer esto!

$(function(){
 var keyStop = {
   8: ":not(input:text, textarea, input:file, input:password)", // stop backspace = back
   13: "input:text, input:password", // stop enter = submit 

   end: null
 };
 $(document).bind("keydown", function(event){
  var selector = keyStop[event.which];

  if(selector !== undefined && $(event.target).is(selector)) {
      event.preventDefault(); //stop event
  }
  return true;
 });
});
thetoolman
fuente
12
De la manera más simple: $ ("# myinput"). Keydown (function (e) {if (e.which == 13) e.preventDefault ();}); La clave es usar "keydown" y event.preventDefault () juntos. No funciona con "keyup".
lepe
Esto tiene la ventaja sobre otras soluciones que simplemente bloquean la clave 13 de que la sugerencia automática del navegador continuará funcionando correctamente.
jsalvata
52

Simplemente devuelva falso desde el controlador de envío

<form onsubmit="return false;">

o si quieres un controlador en el medio

<script>
var submitHandler = function() {
  // do stuff
  return false;
}
</script>
<form onsubmit="return submitHandler()">
Paul Tarjan
fuente
55
Esta parece ser la respuesta más simple. Lo probé en Google Chrome y funciona bien. ¿Has probado esto en todos los navegadores?
styfle
22
Esta no es una buena idea si desea que su formulario se submit
envíe
13
No funciona porque el botón de envío ya no envía el formulario
paullb
39
@Paul, ¿cómo obtuvo esto 38 votos a favor? Parando <form>de conseguir presentado en absoluto es tirar al bebé con el agua del baño.
Pacerier
8
@Pacerier En el contexto de un SPA, casi siempre querrá manejar el envío de formularios manualmente. Siempre es razonable evitar que el navegador envíe un formulario (y actualizar la página, que reinicia la aplicación) es razonable en este caso.
Nathan Friend
44
//Turn off submit on "Enter" key

$("form").bind("keypress", function (e) {
    if (e.keyCode == 13) {
        $("#btnSearch").attr('value');
        //add more buttons here
        return false;
    }
});
mtntrailrunner
fuente
55
Esto funciona muy bien. e.preventDefault()en lugar de return falselograr el mismo fin, pero permitir que el evento llegue a controladores en elementos primarios. La acción predeterminada (envío de formulario) aún se
evitará
24

Deberá llamar a esta función que cancelará el comportamiento de envío predeterminado del formulario. Puede adjuntarlo a cualquier campo o evento de entrada.

function doNothing() {  
var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
    if( keyCode == 13 ) {


    if(!e) var e = window.event;

    e.cancelBubble = true;
    e.returnValue = false;

    if (e.stopPropagation) {
        e.stopPropagation();
        e.preventDefault();
    }
}
picadillo
fuente
2
e debería ser un argumento y luego debería verificar la ventana. Además, debería obtener el código clave del evento. Finalmente, deberías devolver falso.
ntownsend
9
¿Puede explicar dónde y cómo llamar a esta función?
mydoghasworms
17

La tecla ENTRAR simplemente activa el botón de envío predeterminado del formulario, que será el primero

<input type="submit" />

el navegador encuentra dentro del formulario.

Por lo tanto, no tengo un botón de enviar, sino algo como

<input type="button" value="Submit" onclick="submitform()" /> 

EDITAR : En respuesta a la discusión en los comentarios:

Esto no funciona si solo tiene un campo de texto, pero puede ser ese el comportamiento deseado en ese caso.

El otro problema es que esto se basa en Javascript para enviar el formulario. Esto puede ser un problema desde el punto de vista de accesibilidad. Esto se puede resolver escribiendo <input type='button'/>javascript y luego poner un <input type='submit' />dentro de una <noscript>etiqueta. El inconveniente de este enfoque es que para los navegadores con JavaScript deshabilitado, tendrá envíos de formularios en ENTER. Depende del OP decidir cuál es el comportamiento deseado en este caso.

No conozco ninguna forma de hacerlo sin invocar javascript en absoluto.

DanSingerman
fuente
Extrañamente, esto no funciona en Firefox si solo hay un campo.
DanSingerman
55
Terrible para la accesibilidad? Tal vez. Sin embargo , responde a la pregunta de los muchachos, que es para qué sirve SO ... ¿Tal vez una edición de la respuesta para señalar el problema de accesibilidad es un buen compromiso?
Neil Barnwell
1
@bobince: tal vez la pregunta merece -1 debido a la accesibilidad, pero ¿esta respuesta precisa a la pregunta? No lo creo Además, hay casos de uso válidos en los que desea hacer esto.
DanSingerman
Sin embargo, no es necesario que sea imposible enviar un formulario sin JavaScript, eh. Sin embargo, eso funcionó, lo que no sucede porque los navegadores enviarán un formulario que no contiene ningún botón de envío.
bobince
2
Probado en todos esos más Opera con una entrada de texto y un botón de entrada: todos aún enviaron el formulario en Enter. Obviamente, necesita JavaScript para 'resolver' el problema de Enter, pero el truco es hacerlo sin dejar la página completamente inoperable donde JS no está disponible.
bobince
13

En resumen, la respuesta en Javascript puro es:

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

Esto solo deshabilita la acción de presionar la tecla "Enter" para input type = 'text'. Los visitantes aún pueden usar la tecla "Enter" en todo el sitio web.

Si desea deshabilitar "Enter" para otras acciones también, puede agregar console.log (e); para sus propósitos de prueba, y presione F12 en Chrome, vaya a la pestaña "consola" y presione "retroceso" en la página y mire dentro para ver qué valores se devuelven, luego puede apuntar a todos esos parámetros para mejorar aún más el código arriba para satisfacer sus necesidades de "e.target.nodeName" , "e.target.type" y muchos más ...

Vea mi respuesta detallada para una pregunta similar aquí

Tarik
fuente
3
En realidad debería serlo e.target.nodeName === 'INPUT' && e.target.type !== 'textarea'. Con el código especificado, permitirá enviar formularios si se enfoca una radio o casilla de verificación.
ocurre
1
Esta es la solución más efectiva y amigable con los recursos. Gracias a @AlexandrePires a! Aquí está mi script de trabajo completo: stackoverflow.com/a/40686327/1589669
eapo
1
La única solución de trabajo; Al menos en mi situación.
hex494D49
9

Todas las respuestas que encontré sobre este tema, aquí o en otras publicaciones tienen un inconveniente y es que también evita el desencadenante de cambio real en el elemento del formulario. Entonces, si ejecuta estas soluciones, el evento onchange no se activa también. Para superar este problema, modifiqué estos códigos y desarrollé el siguiente código para mí. Espero que esto sea útil para otros. Di una clase a mi formulario "prevent_auto_submit" y agregué el siguiente JavaScript:

$(document).ready(function() 
{
    $('form.prevent_auto_submit input,form.prevent_auto_submit select').keypress(function(event) 
    { 
        if (event.keyCode == 13)
        {
            event.preventDefault();
            $(this).trigger("change");
        }
    });
});
Mahdi Mehrizi
fuente
7

Siempre lo he hecho con un controlador de pulsación de teclas como el anterior en el pasado, pero hoy encontré una solución más simple. La tecla Intro solo activa el primer botón de envío no deshabilitado en el formulario, por lo que en realidad todo lo que se requiere es interceptar ese botón tratando de enviar:

<form>
  <div style="display: none;">
    <input type="submit" name="prevent-enter-submit" onclick="return false;">
  </div>
  <!-- rest of your form markup -->
</form>

Eso es. Las pulsaciones de teclas se manejarán como de costumbre por el navegador / campos / etc. Si se activa la lógica de ingresar-enviar, entonces el navegador encontrará ese botón de envío oculto y lo activará. Y el controlador de JavaScript evitará la sumisión.

acoulton
fuente
1
Por lo general, no me gustan los hacks, pero este es realmente efectivo.
TechWisdom
1
eliminar el div y simplemente poner attr hiddenen la entrada sería más corto. buen truco :)
Nik
5

He pasado algún tiempo haciendo este navegador cruzado para IE8,9,10, Opera 9+, Firefox 23, Safari (PC) y Safari (MAC)

Ejemplo de JSFiddle: http://jsfiddle.net/greatbigmassive/ZyeHe/

Código base: llame a esta función a través de "onkeypress" adjunta a su formulario y pase "window.event".

function stopEnterSubmitting(e) {
    if (e.keyCode == 13) {
        var src = e.srcElement || e.target;
        if (src.tagName.toLowerCase() != "textarea") {
            if (e.preventDefault) {
                e.preventDefault();
            } else {
                e.returnValue = false;
            }
        }
    }
}
Adán
fuente
4
stopSubmitOnEnter (e) {
  var eve = e || window.event;
  var keycode = eve.keyCode || eve.which || eve.charCode;

  if (keycode == 13) {
    eve.cancelBubble = true;
    eve.returnValue = false;

    if (eve.stopPropagation) {   
      eve.stopPropagation();
      eve.preventDefault();
    }

    return false;
  }
}

Luego en su formulario:

<form id="foo" onkeypress="stopSubmitOnEnter(e);">

Sin embargo, sería mejor si no usaras JavaScript molesto.

ntownsend
fuente
Me gusta esta versión porque es más legible que la de @hash. Sin embargo, un problema es que debe devolver falso dentro del bloque "if (keycode == 13)". Como lo tiene, esta función evita cualquier entrada de teclado en el campo. Además, la versión de @ hash incluye e.keyCode, e.which y e.charCode ... no estoy seguro de si e.charCode es importante, pero lo puse allí de todos modos: "var keycode = eve.keyCode || eve.which || eve.charCode; ".
Jack Senechal
Gracias Jack. Edité la respuesta para verificar charCode. También moví el return falseinterior del bloque if. Buena atrapada.
ntownsend
3

En mi caso, este JavaScript jQuery resolvió el problema

jQuery(function() {
            jQuery("form.myform").submit(function(event) {
               event.preventDefault();
               return false;
            });
}
Kirby
fuente
Impresionante, gracias @ Kirby! Dado que la tecla Intro ahora está deshabilitada en el formulario, ¿cómo podría habilitar la tecla Intro para todos los <input>campos del formulario?
Ian Campbell
3

Evitar que "ENTRAR" envíe el formulario puede incomodar a algunos de sus usuarios. Por lo tanto, sería mejor si sigue el siguiente procedimiento:

Escriba el evento 'onSubmit' en su etiqueta de formulario:

<form name="formname" id="formId" onSubmit="return testSubmit()" ...>
 ....
 ....
 ....
</form>

escriba la función Javascript de la siguiente manera:

function testSubmit(){
  if(jQuery("#formId").valid())
      {
        return true;
      }
       return false;

     } 

     (OR)

Cualquiera sea el motivo, si desea evitar el envío del formulario al presionar la tecla Intro, puede escribir la siguiente función en javascript:

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

Gracias.

venky
fuente
3

Agregue esta etiqueta a su formulario: onsubmit="return false;" entonces solo puede enviar su formulario con alguna función de JavaScript.

Rajveer
fuente
El OP (como la mayoría de los que han sido mordidos por esta función del navegador) probablemente todavía quería permitir el envío con un clic del mouse, lo que este método (desafortunadamente recomendado a menudo) también deshabilitaría. No hay una buena manera de resolver esto, pero, por ejemplo, la respuesta anterior (en este momento), de Adam, lo hace mejor.
Sz.
3

Para evitar el envío de formularios al presionar enterun campo textareao input, verifique el evento de envío para encontrar qué tipo de elemento envió el evento.

Ejemplo 1

HTML

<button type="submit" form="my-form">Submit</button>
<form id="my-form">
...
</form>

jQuery

$(document).on('submit', 'form', function(e) {
    if (e.delegateTarget.activeElement.type!=="submit") {
        e.preventDefault();
    }
});

Una mejor solución es si no tiene un botón de envío y activa el evento con un botón normal. Es mejor porque en el primer ejemplo se disparan 2 eventos de envío, pero en el segundo ejemplo solo se dispara 1 evento de envío.

Ejemplo 2

HTML

<button type="button" onclick="$('#my-form').submit();">Submit</button>
<form id="my-form">
...
</form>

jQuery

$(document).on('submit', 'form', function(e) {
    if (e.delegateTarget.activeElement.localName!=="button") {
        e.preventDefault();
    }
});
Adam Mester
fuente
3

Encontrará esto más simple y útil: D

$(document).on('submit', 'form', function(e){
    /* on form submit find the trigger */
    if( $(e.delegateTarget.activeElement).not('input, textarea').length == 0 ){
        /* if the trigger is not between selectors list, return super false */
        e.preventDefault();
        return false;
    } 
});
Mike OO
fuente
2

Qué tal si:

<asp:Button ID="button" UseSubmitBehavior="false"/>
P Diddy
fuente
2

Consulte este artículo ¿Cómo evitar que se presione ENTER para enviar un formulario web?

$(“.pc_prevent_submit”).ready(function() {
  $(window).keydown(function(event) {
    if (event.keyCode == 13) {
      event.preventDefault();
      return false;
    }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form class=”pc_prevent_submit” action=”” method=”post”>
  <input type=”text” name=”username”>
  <input type=”password” name=”userpassword”>
  <input type=”submit” value=”submit”>
</form>

Pranabesh Chand
fuente
1

Puede atrapar el keydown en un formulario en javascript y evitar incluso el burbujeo, creo. ENTER en una página web básicamente solo envía el formulario en el que se coloca el control seleccionado actualmente.

Neil Barnwell
fuente
depende de un control aunque;) en un área de texto simplemente se mueve a la siguiente línea. Por lo tanto, capturar todos los eventos 'presionar' no es una buena idea.
kender
Posiblemente, pero en ese caso, ¿el formulario tendría un evento keydown de todos modos?
Neil Barnwell
Lo haría directamente en todos los tipos de texto de entrada y otros controles similares. Es un poco de dolor y no merece la pena molestando con en muchos casos, pero si usted tiene que ...
bobince
1

Este enlace proporciona una solución que me ha funcionado en Chrome, FF e IE9 más el emulador para IE7 y 8 que viene con la herramienta de desarrollo de IE9 (F12).

http://webcheatsheet.com/javascript/disable_enter_key.php

Miaka
fuente
En caso de que el enlace esté roto, agregue este código al área del encabezado de su página. <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")) {return false;} } document.onkeypress = stopRKey; </script>
Miaka
1

Otro enfoque es agregar el botón de entrada de envío al formulario solo cuando se supone que debe enviarse y reemplazarlo por un simple div durante el llenado del formulario

Nicolas Manzini
fuente
1

Simplemente agregue este atributo a su etiqueta FORM:

onsubmit="return gbCanSubmit;"

Luego, en su etiqueta SCRIPT, agregue esto:

var gbCanSubmit = false;

Luego, cuando haces un botón o por cualquier otra razón (como en una función) finalmente permites un envío, simplemente voltea el booleano global y haz una llamada .submit (), similar a este ejemplo:

function submitClick(){

  // error handler code goes here and return false if bad data

  // okay, proceed...
  gbCanSubmit = true;
  $('#myform').submit(); // jQuery example

}
Volomike
fuente
1

Me he encontrado con esto porque tengo varios botones de envío con diferentes valores de 'nombre', de modo que cuando se envían hacen cosas diferentes en el mismo archivo php. El botón enter/ returnrompe esto ya que esos valores no se envían. Entonces estaba pensando, ¿el botón enter/ returnactiva el primer botón de envío en el formulario? De esa manera, podría tener un botón de envío 'vainilla' que está oculto o tiene un valor de 'nombre' que devuelve el archivo php en ejecución a la página con el formulario en él. O bien, un valor de 'nombre' predeterminado (oculto) que activa la pulsación de tecla, y los botones de envío se sobrescriben con sus propios valores de 'nombre'. Solo un pensamiento.

gavin
fuente
1

Qué tal si:

<script>
function isok(e) {
  var name = e.explicitOriginalTarget.name;
  if (name == "button") {
    return true
  }
  return false;
}
</script>
<form onsubmit="return isok(event);">
<input type="text" name="serial"/>
<input type="submit" name="button" value="Create Thing"/>
</form>

Y simplemente asigne un nombre correcto a su botón y aún se enviará, pero los campos de texto, es decir, el objetivo original explícito cuando presiona regresar en uno, no tendrán el nombre correcto.

Andrew Arrow
fuente
0

Esto funcionó para mí.
onkeydown = "return! (event.keyCode == 13)"

    <form id="form1" runat="server" onkeydown="return !(event.keyCode==13)">

   </form>
llamativo
fuente
1
Si tiene textarea, no puede saltar a la siguiente línea al ingresar de la misma forma
Aamir Afridi
0

Así es como lo haría:

window.addEventListener('keydown', function(event)
{
    if (event.key === "Enter")
    {
        if(event.target.type !== 'submit')
        {
            event.preventDefault();
            return false;
        }
    }
}
Lonnie Best
fuente
-1

poner en un archivo externo javascript

   (function ($) {
 $(window).keydown(function (event) {  

    if (event.keyCode == 13) {

        return false;
    }
});

 })(jQuery);

o en algún lugar dentro de la etiqueta del cuerpo

<script>


$(document).ready(function() {
    $(window).keydown(function(event) {
        alert(1);

        if(event.keyCode == 13) {

            return false;
        }
    });
});

</script>
topC
fuente
-2

Tuve el mismo problema (formularios con toneladas de campos de texto y usuarios no calificados).

Lo resolví de esta manera:

function chkSubmit() {
    if (window.confirm('Do you want to store the data?')) {
        return true;
    } else {
        // some code to focus on a specific field
        return false;
    }
}

usando esto en el código HTML:

<form
    action="go.php" 
    method="post"
    accept-charset="utf-8"  
    enctype="multipart/form-data"
    onsubmit="return chkSubmit()"
>

De esta manera, la ENTERclave funciona según lo planeado, pero una confirmación (un segundoENTER se requiere toque, generalmente).

Dejo a los lectores la búsqueda de un script que envíe al usuario en el campo donde presionó ENTERsi decide permanecer en el formulario.

Marco Bernardini
fuente