Tengo una encuesta en un sitio web, y parece haber algunos problemas con los usuarios presionando enter (no sé por qué) y enviando accidentalmente la encuesta (formulario) sin hacer clic en el botón enviar. ¿Hay alguna manera de prevenir esto?
Estoy usando HTML, PHP 5.2.9 y jQuery en la encuesta.
jquery
html
forms
form-submit
DForck42
fuente
fuente
Respuestas:
Puedes usar un método como
Al leer los comentarios en la publicación original, para que sea más útil y permitir que las personas presionen Entersi han completado todos los campos:
fuente
keydown
endocument
lugar dewindow
para que esto funcione.&& !$(document.activeElement).is('textarea')
a la condición, o las nuevas líneas dentro de un área de texto están bloqueadas (al menos en IE).No permitir la tecla Intro en cualquier lugar
Si no tiene un
<textarea>
en su formulario, simplemente agregue lo siguiente a su<form>
:O con jQuery:
Esto hará que cada pulsación de tecla dentro del formulario se verifique en el
key
. Si no es asíEnter
, volverátrue
y todo continuará como de costumbre. Si esEnter
así, volveráfalse
y todo se detendrá de inmediato, por lo que no se enviará el formulario.Se
keydown
prefiere el eventokeyup
ya quekeyup
es demasiado tarde para bloquear el envío del formulario. Históricamente también hubo elkeypress
, pero esto está en desuso, como es elKeyboardEvent.keyCode
. En suKeyboardEvent.key
lugar, debe usar lo que devuelve el nombre de la tecla que se está presionando. CuandoEnter
está marcado, entonces esto marcaría 13 (entrada normal) y 108 (entrada del teclado numérico).Tenga en cuenta que,
$(window)
como se sugiere en algunas otras respuestas, en lugar de$(document)
no funciona parakeydown
/keyup
en IE <= 8, entonces esa no es una buena opción si también desea cubrir a esos usuarios pobres.Permitir la tecla Intro solo en áreas de texto
Si tiene un
<textarea>
en su formulario (que por supuesto debería aceptar la tecla Intro), entonces agregue el controlador keydown a cada elemento de entrada individual que no sea un<textarea>
.Para reducir el repetitivo, es mejor hacerlo con jQuery:
Si tiene otras funciones de controlador de eventos adjuntas en esos elementos de entrada, que también le gustaría invocar en la tecla Intro por alguna razón, solo evite el comportamiento predeterminado del evento en lugar de devolver falso, para que pueda propagarse correctamente a otros controladores.
Permitir la tecla Intro en áreas de texto y enviar solo botones
Si también desea permitir la tecla Intro en los botones de envío
<input|button type="submit">
, siempre puede refinar el selector de la siguiente manera.Tenga en cuenta que,
input[type=text]
como se sugiere en algunas otras respuestas, no cubre esas entradas HTML5 que no son de texto, por lo que no es un buen selector.fuente
":input:not(textarea):not([type=submit]):not(button)"
si está utilizando en<button>
lugar de<input type=submit>
input
?La sección 4.10.22.2 de envío implícito de la especificación HTML5 W3C dice:
Por lo tanto, una forma que cumple con los estándares para deshabilitar cualquier envío implícito del formulario es colocar un botón de envío deshabilitado como el primer botón de envío del formulario:
Una buena característica de este enfoque es que funciona sin JavaScript ; ya sea que JavaScript esté habilitado o no, se requiere un navegador web que cumpla con los estándares para evitar el envío implícito de formularios.
fuente
<input type="submit" disabled style="display: none" aria-hidden="true" />
y puede reducir el tamaño de su página en unos pocos caracteres. :-PTuve que atrapar los tres eventos relacionados con presionar teclas para evitar que se enviara el formulario:
Puedes combinar todo lo anterior en una bonita versión compacta:
fuente
$("#search").bind('keypress keyup keydown',preventSubmit)
;<form>
etiqueta, la tecla enter enviará el formulario ... Esta solución deshabilitó la tecla enter y solucionó el problema, ¡gracias @Dave! Luego habilité la tecla Intro para ciertos campos porid
.console.log
, actualicé mi respuesta.keypress keyup keydown
usted activa cualquier código en la condición if dos veces .Si usa un script para realizar el envío real, puede agregar la línea "return false" al controlador de envío de esta manera:
Llamar a submit () en el formulario desde JavaScript no activará el evento.
fuente
Utilizar:
Esta solución funciona en todos los formularios de un sitio web (también en formularios insertados con Ajax), evitando solo Enters en los textos de entrada. Colóquelo en una función de documento listo y olvide este problema de por vida.
fuente
e.which
estuvo bien; no es necesario cambiarlo ae.keyCode
. Ambos devuelven el valor 13 para la tecla enter. Ver stackoverflow.com/a/4471635/292060 y stackoverflow.com/a/18184976/292060En lugar de evitar que los usuarios presionen Enter, lo que puede parecer poco natural, puede dejar el formulario como está y agregar una validación adicional del lado del cliente: cuando la encuesta no finaliza, el resultado no se envía al servidor y el usuario recibe un mensaje agradable que dice lo que necesita ser terminado para completar el formulario. Si está utilizando jQuery, pruebe el complemento de Validación:
http://docs.jquery.com/Plugins/Validation
Esto requerirá más trabajo que Enterapretar el botón, pero seguramente proporcionará una experiencia de usuario más rica.
fuente
Una pequeña y agradable solución jQuery:
fuente
var key = event.keyCode || event.which; if (key == 13) return false;
Todavía no puedo comentar, así que publicaré una nueva respuesta
La respuesta aceptada es ok-ish, pero no dejaba de enviar en el teclado numérico enter. Al menos en la versión actual de Chrome. Tuve que modificar la condición del código clave para esto, luego funciona.
fuente
Es mi solución para alcanzar el objetivo, es limpio y efectivo.
fuente
Un enfoque completamente diferente:
<button type="submit">
en el formulario se activará al presionar Enter.style="display:none;
false
, lo que anula el proceso de envío.<button type=submit>
para enviar el formulario. Simplemente regresetrue
a la presentación en cascada.<textarea>
u otros controles de forma se comportará de manera normal.<input>
controles de formulario, se activará el primero<button type=submit>
, que regresafalse
y, por lo tanto, no sucede nada.Así:
fuente
<button onclick="this.disabled=true;this.form.submit();" type="submit"">submit</button>
Dando al formulario una acción de 'javascript: void (0);' Parece funcionar
fuente
No poner un botón de enviar podría hacer. Simplemente coloque un script en la entrada (tipo = botón) o agregue eventListener si desea que envíe los datos en el formulario.
Más bien usa esto
que usar esto
fuente
fuente
Necesitaba evitar que solo se enviaran entradas específicas, por lo que utilicé un selector de clase, para permitir que esta sea una característica "global" donde sea que la necesite.
Y este código jQuery:
Alternativamente, si el keydown es insuficiente:
Algunas notas:
Modificando varias buenas respuestas aquí, la Enterclave parece funcionar
keydown
en todos los navegadores. Para la alternativa, actualicébind()
elon()
método.Soy un gran admirador de los selectores de clase, sopesando todos los pros y los contras y las discusiones de rendimiento. Mi convención de nomenclatura es 'idSomething' para indicar que jQuery lo está utilizando como id, para separarlo del estilo CSS.
fuente
Puede hacer un método de JavaScript para verificar si se Enterpresionó la tecla y, si es así, para detener el envío.
Simplemente llame a eso en el método de envío.
fuente
SÓLO ENVIAR BLOQUEO, pero no otra funcionalidad importante de la tecla Intro, como la creación de un nuevo párrafo en un
<textarea>
:fuente
function(e)
eso debería serfunction(event)
. De lo contrario, funciona para mí. Gracias.on("keydown", function(event) { enterPressed = true; }
y luego en el evento de envío, doon("submit", function(e) { if (pressedEnter == true) { pressedEnter = false; e.preventDefault(); return false;}
Esto asegurará que funcione sin importar la demora.Esta es la manera perfecta, no será redirigido desde su página
fuente
Tuve un problema similar, donde tenía una cuadrícula con "campos de texto ajax" (Yii CGridView) y solo un botón de envío. Cada vez que hice una búsqueda en un campo de texto y presioné, ingrese el formulario enviado. Tuve que hacer algo con el botón porque era el único botón común entre las vistas (patrón MVC). Todo lo que tenía que hacer era quitar
type="submit"
y poneronclick="document.forms[0].submit()
fuente
Creo que está bien cubierto con todas las respuestas, pero si está utilizando un botón con algún código de validación de JavaScript, puede configurar onpresspress del formulario para Enter para llamar a su envío como se esperaba:
El onkeypress JS podría ser lo que necesite hacer. No hay necesidad de un cambio global más grande. Esto es especialmente cierto si usted no es el que codifica la aplicación desde cero, y ha sido reparado el sitio web de otra persona sin desarmarlo y volver a probarlo.
fuente
Ya hay muchas buenas respuestas aquí, solo quiero aportar algo desde una perspectiva UX. Los controles del teclado en los formularios son muy importantes.
La pregunta es cómo deshabilitar el envío al presionar una tecla
Enter
. No cómo ignorarEnter
en una aplicación completa. Por lo tanto, considere adjuntar el controlador a un elemento de formulario, no a la ventana.La desactivación
Enter
para el envío del formulario aún debe permitir lo siguiente:Enter
botón Enviar está enfocado.Enter
.Esto es simplemente repetitivo pero sigue las tres condiciones.
fuente
Algo que no he visto respondió aquí: cuando pasas por los elementos de la página, presionar Entercuando llegas al botón de envío activará el controlador de envío en el formulario, pero registrará el evento como un evento de mouse. Aquí está mi solución corta para cubrir la mayoría de las bases:
Esta no es una respuesta relacionada con jQuery
HTML
JavaScript
Para encontrar un ejemplo de trabajo: https://jsfiddle.net/nemesarial/6rhogva2/
fuente
En mi caso específico, tuve que evitar que ENTER enviara el formulario y también simular el clic del botón Enviar. Esto se debe a que el botón Enviar tenía un controlador de clics porque estábamos dentro de una ventana modal (código antiguo heredado). En cualquier caso, aquí están mis soluciones combinadas para este caso.
Este caso de uso es específicamente útil para las personas que trabajan con IE8.
fuente
Esto funciona para mi
fuente
Me gustaría agregar un pequeño código CoffeeScript (no probado en el campo):
(Espero que les guste el buen truco en la cláusula de a menos.)
fuente
Usando Javascript (sin marcar ningún campo de entrada):
Si alguien quiere aplicar esto en campos específicos, por ejemplo, ingrese texto de tipo:
Esto funciona bien en mi caso.
fuente
Vaya a su CSS y agréguelo, luego bloqueará automáticamente el envío de su formulario siempre que haya enviado una entrada si ya no la desea, puede eliminarla o escribir
activate
y, en sudeactivate
lugarfuente
También puede usar
javascript:void(0)
para evitar el envío de formularios.fuente
method="post"
en su formulario. Por ejemplo, quiero que el formulario se envíe mediante botones, pero no cuando presione enter mientras está enfocado en la entrada.method="post"
en forma y sus trabajos, verifique nuevamente.Esto me ha funcionado en todos los navegadores después de mucha frustración con otras soluciones. La función externa name_space es solo para evitar declarar globales, algo que también recomiendo.
Uso de la muestra:
fuente
Utilizar:
fuente