Addaw, ir a inicio Donar

Técnica HTML WCAG 2.2

H32Poner un botón de envío en cada formulario

Nombre oficial en el W3C: Proporcionar botones de envío

En pocas palabras

Todo formulario debe tener un botón para enviarlo, como «Buscar» o «Ver horarios». El cambio de página o de contenido solo debe ocurrir cuando la persona pulsa ese botón. No debe ocurrir al elegir una opción de un desplegable ni al marcar una casilla.

Por qué es importante

Quien usa teclado recorre las opciones de un desplegable con las flechas. Si la página cambia con la primera flecha, nunca llega a la opción que buscaba.

Un cambio inesperado también desorienta a quien usa lector de pantalla o tiene dificultades cognitivas. El botón deja claro cómo y cuándo se envía el formulario. Así cada persona decide el momento.

Cómo se hace

  1. Añada a cada formulario un <button type="submit"> o un <input type="submit">. Si el botón es una imagen, use <input type="image"> con su alt.
  2. Dé al botón un texto que diga lo que va a pasar: «Ver horarios», «Buscar», «Enviar solicitud».
  3. Lance la acción con el evento submit del formulario, no con el change de un desplegable o una casilla.
  4. No sustituya el botón por un div o un icono con onclick.

Ejemplo práctico

Es frecuente en desplegables que llevan a otra página en cuanto se elige una opción. Por ejemplo, un selector de oficina, de provincia, de idioma o de categoría. La demo no puede cambiar de página, así que simula el cambio escribiendo el resultado.

Así no: Desplegable que cambia de página al elegir

El formulario no tiene botón de envío. El cambio de página se lanza con el evento change del desplegable. En Chrome y Edge para Windows, las opciones se recorren con las flechas sin abrir la lista. La primera pulsación ya cambia de página, y el usuario nunca llega a la oficina que buscaba.

Captura de pantalla del ejemplo incorrecto: Desplegable que cambia de página al elegir
Así se ve el ejemplo incorrecto.

La demostración contiene, a propósito, el error de accesibilidad que se explica.

Ver el código del ejemplo incorrecto
<form action="#" id="f">
  <label for="oficina">Oficina de atención ciudadana</label>
  <select id="oficina" name="oficina">
    <option value="">Seleccione una oficina</option>
    <option>Centro</option>
    <option>El Carmen</option>
    <option>Puerto</option>
  </select>
</form>
<p id="resultado" role="status"></p>
<script>
  var f = document.getElementById('f');
  document.getElementById('oficina').addEventListener('change', function () {
    if (!this.value) return;
    f.hidden = true;
    document.getElementById('resultado').textContent =
      'Nueva página: horarios de la oficina ' + this.value + '.';
  });
</script>

Así sí: Botón de envío que el usuario pulsa cuando decide

Se añade un <button type="submit">. El código escucha el evento submit del formulario, no el change del desplegable. El usuario recorre las opciones con calma. El cambio solo ocurre cuando pulsa «Ver horarios» o Intro.

Pruébelo aquí:

Ver el código del ejemplo correcto
<form action="#" id="f">
  <label for="oficina">Oficina de atención ciudadana</label>
  <select id="oficina" name="oficina">
    <option value="">Seleccione una oficina</option>
    <option>Centro</option>
    <option>El Carmen</option>
    <option>Puerto</option>
  </select>
  <button type="submit">Ver horarios</button>
</form>
<p id="resultado" role="status"></p>
<script>
  var f = document.getElementById('f');
  f.addEventListener('submit', function (e) {
    e.preventDefault();
    var oficina = document.getElementById('oficina').value;
    if (!oficina) {
      document.getElementById('resultado').textContent = 'Seleccione una oficina antes de continuar.';
      return;
    }
    f.hidden = true;
    document.getElementById('resultado').textContent =
      'Nueva página: horarios de la oficina ' + oficina + '.';
  });
</script>

Cómo comprobarlo

Teclado

  1. Llegar al desplegable con Tab y, sin abrirlo, pulsar Flecha abajo varias veces.
  2. Comprobar que la página no cambia mientras se recorren las opciones.
  3. Pasar al botón con Tab y activarlo con Intro o Espacio. Comprobar que entonces sí se produce el cambio.

Lector de pantalla (NVDA o VoiceOver)

  1. Recorrer el formulario con Tab. Comprobar que, después del desplegable, se anuncia un botón con un texto que dice lo que va a pasar.

Debería anunciar: «Ver horarios, botón»

Herramientas del navegador

  1. Abrir las herramientas de desarrollo (F12) y seleccionar el <form> en Elementos. Comprobar que contiene un <button type="submit">, un <input type="submit"> o un <input type="image">.
  2. Seleccionar el <select> y revisar la pestaña Event Listeners (Detectores de eventos). Un detector de change que cambia de página o recarga es la señal del fallo.

Validación automática

  1. Ni axe DevTools, ni WAVE, ni Lighthouse comprueban si un formulario tiene botón de envío. Tampoco si un change provoca un cambio de página. Hay que revisarlo con el teclado.

Errores frecuentes en auditorías

  • Selectores de idioma, provincia o categoría que cambian de página con el evento change, sin botón para confirmar.
  • Buscadores sin botón que solo se envían con Intro, sin ninguna indicación visible de cómo buscar.
  • Botones de envío sustituidos por un div o un icono con onclick. No reciben el foco ni envían el formulario con Intro.
  • Filtros de listados (casillas o botones de opción) que recargan toda la página en cada cambio y llevan el foco al principio.
Ver el texto completo del W3C (traducción al español)

Esta es una traducción no oficial al español de la técnica H32 de Techniques for WCAG 2.2, del W3C. Puede contener errores. El único documento oficial y normativo es la versión original en inglés, publicada en el sitio web del W3C.

Aplicabilidad

Contenido que incluye controles de formulario.

Descripción

El objetivo de esta técnica es proporcionar un mecanismo que permita a los usuarios solicitar de forma explícita los cambios de contexto. El uso previsto de un botón de envío es generar una petición HTTP que envíe los datos introducidos en un formulario, por lo que es un control apropiado para provocar un cambio de contexto.

Ejemplos

Ejemplo básico de un formulario con un botón de envío

<form action="/subscribe" method="post">
 <p>Enter your email address to subscribe to our mailing list.</p>
 <label for="address">Your email address:</label>
 <input autocomplete="email" id="address" name="address" type="text"> 
 <input type="submit" value="Subscribe">
</form>

Pruebas

Procedimiento

  1. Localizar todos los formularios del contenido.
  2. Para cada formulario, comprobar que tiene un botón de envío (<input type="submit">, <input type="image"> o <button type="submit">).

Resultados esperados

  • La comprobación n.º 2 es verdadera

Recursos

Cómo lo comprobamos en ADDAW

En cada auditoría de ADDAW revisamos esta técnica página a página y le entregamos los errores con capturas y la forma de corregirlos.

Solicitar una auditoría

Basado en la técnica H32 del W3C (WCAG 2.2). Explicación y ejemplos: ADDAW. Traducción no oficial del texto del W3C © W3C, licencia de documentos del W3C. ¿Ha visto un error? Escríbanos.