Hacer que la tecla Enter en un formulario HTML se envíe en lugar de activar el botón

81

Tengo un formulario HTML con una sola submitentrada, pero también varios buttonelementos. Cuando el usuario presiona la tecla 'enter', esperaría que realmente envíe el formulario, pero en cambio (al menos dentro de Chrome 15) descubro que está activando el primero button(ya que eso ocurre antes en el HTML que en la submitentrada , Supongo).

Sé que, en general, no se puede obligar a los navegadores a favorecer una submitentrada en particular , pero realmente pensé que favorecerían las submitentradas sobre los buttonelementos. ¿Hay algún pequeño ajuste que pueda hacer al HTML para que esto funcione, o tendré que adoptar algún tipo de enfoque de Javascript?

Aquí hay una maqueta aproximada del HTML:

<form action="form.php" method="POST">
    <input type="text" name="field1"/>
    <button onclick="return myFunc1()">Button 1</button>
    <input type="submit" name="go" value="Submit"/>
</form>
andygeers
fuente
Compruebe esta pregunta: stackoverflow.com/a/925387/1031900
Ofir Farchy
1
@OfirFarchy Supongo que lo que pensé que hizo que esta pregunta fuera diferente fue que solo hay UN envío, los demás son todos botones.
andygeers
Bueno, si usted no se opone a la utilización de JS y jQuery comprobar mi y David de respuestas
Ofir Farchy

Respuestas:

143

No necesita JavaScript para elegir su entrada o botón de envío predeterminado. Solo necesita marcarlo con type="submit", y los otros botones marcarlos con type="button". En tu ejemplo:

<button type="button" onclick="return myFunc1()">Button 1</button>
<input type="submit" name="go" value="Submit"/>
Jesús Carrera
fuente
4
En realidad, esto no funciona como se esperaba en algunos navegadores. Hoy me encontré con este problema pensando que type = "submit" lo convertiría en el predeterminado, sin embargo, no es así en Chrome o Safari.
Ben Davis
5
Me funciona en Chrome y Safari. Debe ser otra cosa.
Jesús Carrera
15
La configuración del tipo = "botón" en los botones adicionales Y la configuración del tipo = "enviar" es lo que marca la diferencia.
Alex
21
La razón por la que no funciona si no lo configura type="button"es porque, de forma predeterminada, los elementos del botón lo son type="submit". Entonces, la premisa en la pregunta de que solo había un botón de envío era en realidad incorrecta.
Elezar
30

Puedes usar jQuery:

$(function() {
    $("form input").keypress(function (e) {
        if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
            $('button[type=submit] .default').click();
            return false;
        } else {
            return true;
        }
    });
});
Ofir Farchy
fuente
14
Dado que esta es la respuesta aceptada: desplácese hacia abajo para obtener una solución muy simple solo en HTML.
jlh
2
La solución HTML es la respuesta correcta. Un navegador se maneja de forma predeterminada
Edward Newsome
Sé que esta es una respuesta antigua, pero no es necesario utilizar este "equipo pesado" para resolver este problema. Use la solución solo HTML (respuesta de @ Jesús Carrera), el navegador maneja esto ahora.
Martijn Luyckx
1
Lo bueno de este enfoque, aunque sí, requiere jQuery / JavaScript, es que funcionará incluso si necesita tener varios botones de envío en su formulario. El selector específico en este ejemplo no debería tener el espacio después del button[type=submit]sin embargo, asumiendo que ha etiquetado su botón de envío predeterminado con la defaultclase css.
Christopher King
4

Pruebe esto, si se presionó la tecla enter, puede capturarlo así, por ejemplo, desarrollé una respuesta el otro día, el botón html especifique seleccionado , vea si esto ayuda.

Especifique el nombre del formulario, por ejemplo, yourFormNameentonces debería poder enviar el formulario sin tener que centrarse en el formulario.

document.onkeypress = keyPress;

function keyPress(e){
  var x = e || window.event;
  var key = (x.keyCode || x.which);
  if(key == 13 || key == 3){
   //  myFunc1();
   document.yourFormName.submit();
  }
}
david
fuente
si el formulario tiene más botones de envío, esto ayudará: <input type = "submit" id = "submit" value = "ok" /> document.getElementById ("submit"). click ();
Muflix
Esta es una forma obtusa de evitar el comportamiento predeterminado en HTML. Vea la respuesta anterior para saber por qué.
alttag
4
$("form#submit input").on('keypress',function(event) {
  event.preventDefault();
  if (event.which === 13) {
    $('button.submit').trigger('click');
  }
});
samehanwar
fuente
3

Acabo de encontrar un problema con esto. La mía fue una caída al cambiar de inputa a buttony tenía un />terminador de etiquetas mal escrito :

Entonces tuve:

<button name="submit_login" type="submit" class="login" />Login</button>

Y lo acabo de modificar para:

<button name="submit_login" type="submit" class="login">Login</button>

Ahora funciona como un encanto, siempre las pequeñas cosas molestas ... HTH

Mike Wells
fuente
2

Dado que solo hay un botón de envío (o con esta solución potencialmente ni siquiera uno), aquí hay una solución basada en jQuery que funcionará para múltiples formularios en la misma página ...

<script type="text/javascript">
    $(document).ready(function () {

        var makeAllFormSubmitOnEnter = function () {
            $('form input, form select').live('keypress', function (e) {
                if (e.which && e.which == 13) {
                    $(this).parents('form').submit();
                    return false;
                } else {
                    return true;
                }
            });
        };

        makeAllFormSubmitOnEnter();
    });
</script>
Darren
fuente
1

Le di un giro a esto tanto en Chrome como en Firefox e IE10.

Como se mencionó anteriormente, asegúrese de haber marcado con type = "button", "reset", "submit", etc. para asegurarse de que se conecte correctamente en cascada y elija el botón correcto.

Quizás también configurar todos ellos para que tengan la misma forma (es decir, todos como eso funcionó para mí)

Flanamacca
fuente