Botón HTML para NO enviar el formulario

370

Tengo un formulario Fuera de esa forma, tengo un botón. Un botón simple, como este:

<button>My Button</button>

Sin embargo, cuando hago clic en él, envía el formulario. Aquí está el código:

<form id="myform">
    <input />
</form>
<button>My Button</button>

Todo lo que este botón debe hacer es un poco de JavaScript. Pero incluso cuando se ve exactamente como en el código anterior, envía el formulario. Cuando cambio el botón de etiqueta para abarcar, funciona perfectamente. Pero desafortunadamente, debe ser un botón. ¿Hay alguna forma de impedir que ese botón envíe el formulario? Como por ejemplo

<button onclick="document.getElementById('myform').doNotSubmit();">My Button</button>
arik
fuente
3
Este problema no es reproducible en los navegadores modernos, y el problema puede haber surgido originalmente de un malentendido. Si bien el valor predeterminado para buttones type=submit, no se debe enviar ningún formulario cuando el buttonelemento está fuera de cualquier formulario. A menos que se pueda dar una demostración real (un documento de muestra, identificación de un navegador y una descripción de las observaciones que muestran que se envía algún formulario), esta pregunta debe cerrarse como no reproducible. Usar type=buttones una buena práctica, pero esto no hace que el problema sea real.
Jukka K. Korpela

Respuestas:

895

Creo que esta es la pequeña peculiaridad más molesta de HTML ... Ese botón debe ser del tipo "botón" para no enviarlo.

<button type="button">My Button</button>

Actualización 5-feb-2019: según el estándar de vida HTML (y también la especificación HTML 5 ):

El valor predeterminado valor faltante y por defecto valor no válido son el estado del botón Submit.

Dave Markle
fuente
99
@Powerslave cualquier razón para noto use <button>
Sandip Pingle
44
@SandipPingle No hay razón para usarlo, a menos que necesite algún tipo de estilo realmente complejo. Además, IE6 e IE7 (afortunadamente se están eliminando gradualmente) manejan <button>incorrectamente en algunos casos. Además, <button>no es 100% compatible con todos los navegadores, ya que diferentes navegadores pueden enviar valores diferentes para el mismo <button>cuando se usan en un formulario.
Powerslave
35
Esta es una gran respuesta, pero no es una peculiaridad . El valor predeterminado del typeatributo en una <button>etiqueta es submit. Cuando se cambia a type=button, no <button>se da el comportamiento predeterminado. Ver typeatributo aquí: developer.mozilla.org/en-US/docs/Web/HTML/Element/button
Michael Benjamin
1
Entonces, ¿cuál es la idea de? <button type='submit'>Eso es demasiado difícil para mí, jaja. De todos modos su respuesta funciona muy bien!
divHelper11
2
El comportamiento predeterminado (y, por lo tanto, implícito) de un elemento no específico de forma es desencadenar una funcionalidad específica de forma potencialmente destructiva. ¿Cómo es que no es una decisión de diseño peculiar para la especificación HTML?
HonoredMule
36

return false;al final del controlador onclick hará el trabajo. Sin embargo, es mejor simplemente agregar type="button"al <button>- de esa manera, se comporta correctamente incluso sin ningún JavaScript.

ThiefMaster
fuente
1
Los botones que no envían formularios solo son útiles con JavaScript habilitado de todos modos ... Estoy de acuerdo en que type = "button" es más limpio.
ThiefMaster
2
return false;no funciona en todos los escenarios, mientras que lo type="Button"hace. Incluso con JavaScript habilitado.
brejoc
15

Dave Markle tiene razón. Desde el sitio web de W3School :

Siempre especifique el atributo de tipo para el botón. El tipo predeterminado para Internet Explorer es "botón", mientras que en otros navegadores (y en la especificación W3C) es "enviar".

En otras palabras, el navegador que está utilizando sigue las especificaciones del W3C.

Gert Grenander
fuente
15

Por defecto, los botones html envían un formulario.

Esto se debe al hecho de que incluso los botones ubicados fuera de un formulario actúan como remitentes (consulte el sitio web de W3Schools: http://www.w3schools.com/tags/att_button_form.asp )

En otras palabras, el tipo de botón es "enviar" por defecto

<button type="submit">Button Text</button>

Por lo tanto, una manera fácil de evitar esto es usar el tipo de botón .

<button type="button">Button Text</button>

Otras opciones incluyen devolver falso al final del onclick o cualquier otro controlador para cuando se hace clic en el botón, o para usar una etiqueta <input> en su lugar

Para obtener más información, consulte la información de la red de desarrolladores de Mozilla sobre botones: https://developer.mozilla.org/en/docs/Web/HTML/Element/button

GJZ
fuente
3

Se recomienda no usar la <Button>etiqueta. Use la <Input type='Button' onclick='return false;'>etiqueta en su lugar. (El uso de "return false" no debería enviar el formulario).

Un poco de material de referencia

Tim
fuente
2
Es suficiente para usar <input type="button" />, y es suficiente return false;: no hay necesidad de hacer ambas cosas.
Tom
No estoy de acuerdo con que se recomienda no usar la etiqueta del botón. Si no lo usa, pierde algunas características de accesibilidad que obtendría automáticamente con la etiqueta del botón. Yo diría que la etiqueta del botón se recomienda para elementos que actúan como botones.
CookieMonster
de acuerdo con la nota en el material de referencia que ha vinculado: "Si bien los elementos <input> del botón de tipo siguen siendo HTML perfectamente válidos, el elemento más nuevo <button> ahora es la forma preferida de crear botones". Entonces, es exactamente lo contrario que usted dijo.
jedzej
1

Por razones de accesibilidad, no pude lograrlo con varios type=submitbotones. La única forma de trabajar de forma nativa con formvarios botones, pero SOLO se puede enviar el formulario al Enterpresionar la tecla, es asegurarse de que solo uno de ellos sea de type=submitotro tipo, mientras que otros son de otro tipo type=button. De esta manera, puede beneficiarse de la mejor experiencia del usuario al tratar con un formulario en un navegador en términos de compatibilidad con el teclado.

motss
fuente
0

Otra opción que funcionó para mí fue agregar onsubmit = "return false;" a la etiqueta del formulario.

<form onsubmit="return false;">

Semánticamente probablemente no sea una solución tan buena como los métodos anteriores para cambiar el tipo de botón, pero parece ser una opción si solo desea un elemento de formulario que no se enviará.

kk64738
fuente