página contiene múltiples formas, y la aplicación no sería capaz de determinar (o, por lo que estoy dicho) que forma a la acción.
Cuando se presiona entrar en una entrada de control del navegador busca el primer botón presentar en esa forma y simula un clic sobre ella. En el caso de varios botones, se presionará el primero en el teclado enter (esto no está escrito en piedra y los navegadores pueden desviarse de esto).
Si tiene dos formularios, el que recibió una pulsación de tecla tendrá es primer botón de envío presionado. Por lo tanto, realmente no necesitas ningún manejo especial de esto. Solo tienes que dejar de estar en el camino.
Se puede simular esto en código, en un formulario:
$('form').bind('keypress', function(e){
if (e.keyCode == 13) {
$(this).find('input[type=submit]:first').click();
}
});
o ventana (para una demostración de lo que está ocurriendo más o menos):
$(window).bind('keypress', function(e){
if ($(e.originalTarget).is(':input') && e.keyCode == 13) {
$( e.originalTarget)
.closest('form')
.find('input[type=submit]:first')
.click();
}
});
asumiendo por supuesto que .preventDefault()
no ha sido llamado en el evento.
En pocas palabras: si tienes el evento, puedes adivinar de qué elemento proviene y, por lo tanto, a qué forma pertenece. Incluso en este caso:
<input type="button" value="LOGIN" name="btnLoginOk" onclick="submit();">
Aquí submit()
es una función global, pero cuando se le llama, su contexto (this
) será el elemento y se puede hacer submit(e){ this.form.submit(); }
.
La aplicación ha sido diseñada de modo que no son botones de envío (como en el tipo de entrada = "submit") y, en cambio, los diseñadores han ido para el manejo onclick.
Esto me parece que el diseñador no comprende por completo los eventos DOM/forma y va a la vuelta de la esquina del problema. Otra razón probable podría ser que el programa es antiguo y se diseñó cuando estas cosas no eran tan estables o estaban debidamente documentadas, como lo son hoy.
Reemplazar esta:
<form action="/login/" method="POST">
[...]
<input type="button" value="LOGIN" name="btnLoginOk" onclick="submit();">
</form>
Con esta:
<form action="/login/" method="POST">
[...]
<input type="submit" value="LOGIN" name="btnLoginOk">
</form>
Luego agregar un controlador clave de todas formas que lo necesitan, que detecta y suprime entrar si se cumple alguna condición (para las formas que realmente quiere desactivar esto).
// for all forms that POST that have 2+ submit buttons
$('form[method=post]:has(:submit:eq(1))').bind('keydown', function(e){
// if target is an enter key, input element, and not a button
if (e.keyCode == 13 && e.target.tagName == 'INPUT' &&
!/^(button|reset|submit)$/i.test(e.target.type)) {
return false; // kill event
}
});
O mejor aún: Utilice una biblioteca de formularios de validación (o plugin de jQuery) que sabe cómo hacer esto para usted.
Creo que se puede consolidar algo de eso con:. $ ([ 'De entrada', 'textarea', 'seleccione']) se centran (focus_form) .end(). blur (desenfoque_forma); // No estoy seguro si ese final es necesario o funcionará – Matt
Esto es lo que estaba pensando también. –