jquery deshabilita el formulario enviar al ingresar

208

Tengo el siguiente javascript en mi página que no parece estar funcionando.

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

Me gustaría deshabilitar el envío del formulario al ingresar, o mejor aún, para llamar a mi formulario ajax. Cualquiera de las soluciones es aceptable, pero el código que incluyo anteriormente no impide que se envíe el formulario.

Adam Levitt
fuente
3
Aquí hay una solución HTML simple: stackoverflow.com/a/51507806/337934
SamB

Respuestas:

421

Si keyCodeno es atrapado, atrape which:

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

EDITAR: se lo perdió, es mejor usarlo en keyuplugar dekeypress

EDITAR 2: como en algunas versiones más nuevas de Firefox no se impide el envío del formulario, también es más seguro agregar el evento de pulsación de tecla al formulario. Además, no funciona (¿ya?) Simplemente vinculando el evento al "nombre" del formulario, sino solo al id del formulario. Por lo tanto, hice esto más obvio cambiando el código de ejemplo de manera apropiada.

EDITAR 3: cambiado bind()aon()

zessx
fuente
15
jQuery lo normaliza e.which, por lo que no necesita realizar pruebas e.keyCode, pero +1 es la causa más probable de este problema.
Bojangles
44
¿Necesitas return false;esto? e.preventDefault();parece suficiente
chromigo
10
¡Importante! Este bloque de solución se rompe en el área de texto.
Alemán Khokhlov
44
El problema es si tengo en la misma forma un cuadro de texto, ahora no puedo agregar una entrada (para hacer una nueva línea) en el cuadro de texto.
Tikky
3
keyCode === 13 && !$(e.target).is('textarea')
teran
62

Por lo general, el formulario se envía Entercuando se centra en los elementos de entrada.

Podemos deshabilitar la Enterclave (código 13) en los elementos de entrada dentro de un formulario:

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

DEMO: http://jsfiddle.net/bnx96/325/

Visión
fuente
El botón Ir de iOS fue mi problema en un campo de entrada de autocompletado personalizado. Esto lo resolvió.
Dylan Valade
11
Esto evita que la tecla enter se use textareasdentro de la misma forma. Usar en $("form input")lugar de $("form :input")parece solucionarlo. DEMO: jsfiddle.net/bnx96/279
shaneparsons
43

Aún más corto:

$('myform').submit(function() {
  return false;
});
usuario1017926
fuente
35
¿Pero esto también evitará que el usuario haga clic?
haibuihoang
55
@haibuihoang Sí, esto deshabilitará el envío del formulario.
Tom
77
Debe usar function(e) {e.preventDefault();}como valores de retorno en los controladores de eventos obsoletos: stackoverflow.com/a/20045473/601386
gripe
66
@ user1111929 Esto funciona muy bien, pero no debería ser la respuesta principal porque la pregunta solo se hizo Entery no se trata de deshabilitar el envío del formulario con el Submitbotón.
daveslab
Una situación común en la que es posible que desee conservar el envío del formulario, pero deshabilitar el envío al presionar la tecla 'enter', es si decide usar un onClickevento jQuery para validar un formulario y aún enviarlo usando jQuery. En otras palabras, hay casos en los que solo desea enviar a través de javascript / jQuery. Si bien aún puede usar AJAX con esta solución, deshabilita la funcionalidad básica del submitmétodo.
JRad the Bad el
23
$('form').keyup(function(e) {
  return e.which !== 13  
});

los propiedad event.which normaliza event.keyCode y event.charCode. Se recomienda ver el evento, que para la entrada de teclas del teclado.

which docs.

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

Esta solución funciona en todos los formularios del sitio web (también en formularios insertados con ajax), evitando que solo ingrese en los textos de entrada. Colóquelo en una función de documento listo y olvide este problema de por vida.

Buzogany Laszlo
fuente
9

La mayoría de las respuestas anteriores evitarán que los usuarios agreguen nuevas líneas en un campo de área de texto. Si esto es algo que desea evitar, puede excluir este caso en particular al verificar qué elemento tiene el foco actualmente:

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

La exageración de tener que capturar y probar cada tecla para la tecla ENTER realmente me molesta, por lo que mi solución se basa en el siguiente comportamiento del navegador:

Al presionar ENTRAR, se activará un evento de clic en el botón de envío (probado en IE11, Chrome 38, FF 31) ** (ref: http://mattsnider.com/how-forms-submit-when-pressing-enter/ )

Entonces, mi solución es eliminar el botón de envío estándar (es decir <input type="submit">) para que el comportamiento anterior falle porque no hay un botón de envío para hacer clic mágicamente cuando se presiona ENTRAR. En cambio, utilizo un controlador de clic jQuery en un botón normal para enviar el formulario a través del .submit()método 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>

Manifestación: http://codepen.io/anon/pen/fxeyv?editors=101

** este comportamiento no es aplicable si el formulario tiene solo 1 campo de entrada y ese campo es una entrada de 'texto'; en este caso, el formulario se enviará con la tecla ENTER incluso si no hay un botón de envío en el marcado HTML (por ejemplo, un campo de búsqueda). Este ha sido el comportamiento estándar del navegador desde los años 90.

Costa
fuente
Agregué un cuadro de entrada invisible para contrarrestar "el formulario se enviará con la tecla ENTRAR" causado por "el formulario tiene solo 1 campo de entrada y ese campo es una entrada de" texto "".
Luo Jiong Hui
6

si solo desea deshabilitar el botón enviar al ingresar y enviar, use el evento de envío del formulario

<form onsubmit="return false;">

Puede reemplazar "return false" con la llamada a la función JS que hará lo que sea necesario y también enviará el formulario como último paso.

Perica Zivkovic
fuente
1
Esto deshabilitará todo el envío de formularios, incluido hacer clic en el botón Enviar.
Nick
no 100% ... trabaja regularmente, envía una clave ... es mejor usar jquery para prevenir
KingRider
Buena respuesta alternativa (con las advertencias anteriores) porque ... bueno, a veces esto es todo lo que necesitas.
Emilys
esto es exactamente lo que necesitaba para una situación, gracias
shababhsiddique
4

Puede hacerlo perfectamente en Javascript puro, simple y no requiere biblioteca. Aquí está mi respuesta detallada para un tema similar: deshabilitar la tecla enter para el formulario

En resumen, aquí está el código:

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

Este código es para evitar la tecla "Enter" para el tipo de entrada = 'texto' solamente. (Debido a que el visitante puede necesitar presionar enter en la página) Si desea desactivar "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 ...

Tarik
fuente
2
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
3

No sé si ya resolvió este problema, o si alguien está tratando de resolverlo ahora mismo, ¡pero aquí está mi solución para esto!

$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
fuente
2

La manera simple es cambiar el tipo de botón a botón - en html y luego agregar evento en js ...

Cambiar de esto:

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

A

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

Y en js o jquery agregue:

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

El siguiente código negará el uso de la tecla Intro para enviar un formulario, pero aún le permitirá usar la tecla Intro en un área de texto. Puede editarlo más según sus necesidades.

<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> 
Rábano
fuente
1

En Firefox, cuando ingresas y presionas Intro, enviará su forma superior. La solución está en el formulario de envío, agregue esto:

<input type="submit" onclick="return false;" style="display:none" />
vadear
fuente
1

3 años después y ni una sola persona ha respondido esta pregunta por completo.

El autor de la pregunta quiere cancelar el envío del formulario predeterminado y llamar a su propio Ajax. Esta es una solicitud simple con una solución simple. No es necesario interceptar todos los caracteres ingresados ​​en cada entrada.

Suponiendo que el formulario tiene un botón de envío, ya sea <button id="save-form">ao an <input id="save-form" type="submit">, haga lo siguiente:

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

Cuando finaliza el archivo (carga completa), el script detecta cada evento para la tecla "Entrada" y desactiva el evento detrás.

<script>
            $(document).ready(function () {
                $(window).keydown(function(event){
                    if(event.keyCode == 13) {
                        e.preventDefault(); // Disable the " Entry " key
                        return false;               
                    }
                });
            });
        </script>
McNavy
fuente
agregue alguna explicación
HaveNoDisplayName
@HaveNoDisplayName: actualizado.
McNavy
-4

Solución completa en JavaScript para todos los navegadores

El código anterior y la mayoría de las soluciones son perfectas. Sin embargo, creo que la "respuesta corta" que más me gustó es incompleta.

Así que aquí está la respuesta completa. en JavaScript con soporte nativo para IE 7 también.

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

Esta solución ahora evitará que el usuario envíe utilizando la tecla Intro y no volverá a cargar la página, ni lo llevará a la parte superior de la página, si su formulario está en algún lugar debajo.

Tarandeep Singh
fuente
8
Esto también evita que se envíe el formulario si hace clic en el botón "Enviar".
Mario Werner
-10

Qué tal esto:

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

Esto debería deshabilitar todos los formularios con botones de envío en su aplicación.

Shreekar Patel
fuente