Buttons y comportamiento de envío en formularios HTML | Nicolás Garzón
button
type
HTML
Copiar < button type = " submit" > Guardar cambios</ button>
HTML
Copiar < button type = " submit" > Enviar</ button> Activa la validación y el envío del formulario asociado.
Dentro de form, button usa submit como estado predeterminado si type se omite o es inválido.
Por eso una acción secundaria debe declarar:
HTML
Copiar < button type = " button" > Añadir campo</ button> HTML
Copiar < button type = " button" > Abrir vista previa</ button> No envía automáticamente. JavaScript puede responder a la activación.
HTML
Copiar < button type = " reset" > Restablecer</ button> Devuelve controles a sus valores iniciales, no necesariamente a vacío.
Puede borrar trabajo accidentalmente y suele ser inesperado. Evítalo salvo una necesidad clara y considera confirmación.
HTML
Copiar < button type = " submit" > Crear producto</ button> HTML
Copiar < button type = " submit" > Aceptar</ button> El nombre debe comunicar la consecuencia.
HTML
Copiar < button type = " button" >
< svg aria-hidden = " true" > ...</ svg>
Guardar favorito
</ button> button acepta phrasing content, pero no controles interactivos anidados.
HTML
Copiar < button> < a href = " /help" > Ayuda</ a> </ button> Es inválido y crea interacción conflictiva.
HTML
Copiar < button type = " button" aria-label = " Cerrar" >
< svg aria-hidden = " true" > ...</ svg>
</ button> Necesita un nombre accesible. Tooltip opcional no reemplaza ese nombre.
HTML
Copiar < button
type = " submit"
name = " intent"
value = " publish"
>
Publicar
</ button>
< button
type = " submit"
name = " intent"
value = " draft"
>
Guardar borrador
</ button> Solo el submitter activado aporta normalmente su name/value, permitiendo varias acciones desde un mismo formulario.
HTML
Copiar < button
type = " submit"
formaction = " /drafts"
formmethod = " post"
formnovalidate
>
Guardar borrador
</ button> Puede sobrescribir action, method, enctype, target y validación mediante atributos form*.
No uses formnovalidate para el submit principal si los campos deben validarse.
HTML
Copiar < form id = " editor-form" > ...</ form>
< button type = " submit" form = " editor-form" >
Guardar
</ button> Permite colocar el botón fuera del form. Mantén un orden DOM comprensible.
HTML
Copiar < button type = " submit" disabled > Enviando...</ button> No recibe activación normal ni se envía como submitter.
Deshabilitar mientras envías puede prevenir duplicados, pero también evita foco y puede impedir reintentar. Actualiza texto/estado perceptiblemente y vuelve a habilitar ante fallo.
No uses disabled solo para explicar por qué una acción no está disponible; ofrece el motivo.
HTML
Copiar < button type = " button" aria-pressed = " false" >
Negrilla
</ button> Representa un toggle button que mantiene estado presionado. JavaScript debe actualizarlo.
No uses aria-pressed para una acción momentánea como Guardar.
HTML
Copiar < button
type = " button"
aria-expanded = " false"
aria-controls = " filters"
>
Filtros
</ button> Describe la expansión de contenido controlado. No reemplaza hidden o la lógica real.
HTML
Copiar < input type = " submit" value = " Enviar" >
< input type = " button" value = " Vista previa" >
< input type = " reset" value = " Restablecer" > Funcionan, pero button permite iconos y contenido estructurado sin depender solo de value.
HTML
Copiar < input
type = " image"
src = " submit.png"
alt = " Enviar pedido"
name = " submit"
> Actúa como submit y puede enviar coordenadas del click. Rara vez es necesario; un button con imagen decorativa suele ser más claro.
JavaScript debe escuchar submit en el formulario:
JavaScript
Copiar form. addEventListener ( "submit" , handleSubmit) ; No solo click del botón, porque el envío puede ocurrir mediante Enter, otro submitter o APIs.
form.requestSubmit() activa validación y el flujo de submit.
form.submit() envía directamente y omite partes del flujo, además puede ser ocultado por un control llamado submit.
Prefiere requestSubmit cuando quieres simular una activación normal.
HTML
Copiar < form id = " project-form" action = " /projects" method = " post" >
...
< div class = " actions" >
< button
type = " submit"
name = " intent"
value = " publish"
>
Publicar proyecto
</ button>
< button
type = " submit"
name = " intent"
value = " draft"
formnovalidate
>
Guardar borrador
</ button>
</ div>
</ form>
Omitir type en acciones secundarias.
Usar reset sin considerar pérdida de datos.
Crear nombres genéricos.
Anidar links dentro de buttons.
Crear icon buttons sin nombre.
Deshabilitar permanentemente sin explicación.
Usar aria-pressed para cualquier button.
Mantener aria-expanded desincronizado.
Escuchar solo click.
Usar form.submit esperando validación.
Nombrar un control submit y ocultar el método.
Submit envía; button ejecuta una acción; reset restaura valores iniciales.
Dentro de form, button es submit por defecto.
El nombre debe describir la consecuencia.
El submitter puede enviar name/value y sobrescribir configuración.
Icon buttons necesitan nombre accesible.
Estados ARIA deben sincronizarse.
Escucha el evento submit del formulario.
RequestSubmit reproduce el flujo normal mejor que submit().
¿Por qué un botón “Abrir modal” dentro de un formulario necesita type="button"?
Respuesta Porque, sin type explícito, puede comportarse como submit y enviar el formulario al intentar abrir el modal.
fieldset, legend, output, progress y meter agrupa controles y representa resultados o medidas.