Addaw, ir a inicio Donar

Fallo común WCAG 2.2

F36Formularios que se envían solos al salir del último campo

Nombre oficial en el W3C: Fallo del criterio de conformidad 3.2.2 debido a enviar automáticamente un formulario y presentar contenido nuevo sin aviso previo cuando se asigna un valor al último campo del formulario

En pocas palabras

El error es enviar un formulario de forma automática cuando la persona rellena el último campo o sale de él, sin pulsar ningún botón. Quien vuelve atrás para revisar un dato o leer una ayuda lo envía sin querer. El envío debe hacerse solo con un botón o con la tecla Intro.

Por qué es importante

Enviar datos o cambiar de página sin que la persona lo pida es un cambio inesperado. Desorienta y provoca errores.

  • Quien usa el teclado sale del campo con el tabulador para leer las instrucciones. Si eso envía el formulario, lo envía a medias o sin revisar.
  • Quien usa un lector de pantalla (programa que lee en voz alta lo que hay en la pantalla) no ve que la página ha cambiado. Pierde el punto donde estaba.
  • Las personas con temblor en las manos o con dificultades de atención se equivocan más y no pueden corregirlo a tiempo.

Cómo evitarlo

  1. Ponga siempre un botón de envío visible y con un texto claro: «Buscar», «Consultar reserva», «Enviar solicitud».
  2. No envíe el formulario desde los eventos blur o focusout (cuando el campo pierde el foco). Tampoco desde change.
  3. Confíe en el comportamiento normal del navegador. Un formulario con botón de envío ya se envía al pulsar Intro en un campo de texto.
  4. Evite que una lista desplegable envíe el formulario al elegir una opción. Quien usa el teclado la recorre con las flechas, y cada flecha cambia el valor.
  5. Si de verdad necesita un envío automático, avíselo antes con un texto visible junto al formulario.

Ejemplo práctico

Pasa a menudo en formularios cortos de consulta: localizador de reserva, estado de un expediente o seguimiento de un pedido. Para «ahorrar un clic», el formulario se envía solo cuando el foco sale del último campo.

Así no: Envío automático al salir del último campo

El formulario no tiene botón. Al salir de «Primer apellido» se envía y la página cambia sin aviso. Da igual cómo se salga: con Tab, con Mayús+Tab o con un clic fuera. Quien vuelve atrás para revisar el localizador o leer la ayuda lo envía sin querer.

Captura de pantalla del ejemplo incorrecto: Envío automático al salir del último campo
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 id="f" action="#">
  <label for="loc">Localizador</label>
  <input id="loc" name="loc" type="text">
  <label for="ape">Primer apellido</label>
  <input id="ape" name="ape" type="text" autocomplete="family-name">
  <p>El localizador figura en el correo de confirmación.</p>
</form>
<p id="res" tabindex="-1" hidden>Reserva encontrada: hotel en Cartagena, 2 noches.</p>
<script>
  const f = document.getElementById('f');
  const res = document.getElementById('res');
  f.ape.addEventListener('blur', () => {
    if (f.loc.value && f.ape.value) {
      f.hidden = true; // equivale a f.submit(): cambio de contexto
      res.hidden = false;
      res.focus();
    }
  });
</script>

Así sí: Envío solo con el botón o con Intro

Se quita el envío en blur y se añade un botón de envío. Ahora el cambio solo ocurre cuando la persona lo pide: con el botón o con la tecla Intro en un campo, como en cualquier formulario.

Pruébelo aquí:

Ver el código del ejemplo correcto
<form id="f" action="#">
  <label for="loc">Localizador</label>
  <input id="loc" name="loc" type="text">
  <label for="ape">Primer apellido</label>
  <input id="ape" name="ape" type="text" autocomplete="family-name">
  <p>El localizador figura en el correo de confirmación.</p>
  <button type="submit">Consultar reserva</button>
</form>
<p id="res" tabindex="-1" hidden>Reserva encontrada: hotel en Cartagena, 2 noches.</p>
<script>
  const f = document.getElementById('f');
  const res = document.getElementById('res');
  f.addEventListener('submit', (e) => {
    e.preventDefault(); // solo para la demo; en real se envía al servidor
    f.hidden = true;
    res.hidden = false;
    res.focus();
  });
</script>

Cómo comprobarlo

Teclado

  1. Rellenar todos los campos con el tabulador, de arriba abajo.
  2. En el último campo, pulsar Tab para salir. No pulsar Intro ni ningún botón.
  3. Volver a un campo con Mayús+Tab y salir de nuevo.
  4. Si el formulario se envía o la página cambia en alguno de esos pasos, hay fallo.

Lector de pantalla (NVDA o VoiceOver)

  1. Rellenar el formulario. Después, seguir leyendo con las flechas la ayuda que hay bajo el último campo.
  2. Comprobar que el formulario no se envía hasta activar el botón.

Debería anunciar: «Consultar reserva, botón»

Herramientas del navegador

  1. En la pestaña Elementos, seleccionar el último campo. Abrir el panel «Detectores de eventos» (Event Listeners).
  2. Buscar manejadores blur, focusout o change que llamen a submit() o requestSubmit(), o que cambien location.

Validación automática

  1. axe DevTools, WAVE y Lighthouse no detectan los envíos automáticos. Dependen de la interacción, y estas herramientas no la prueban.
  2. WAVE y axe sí permiten ver que falta el botón de envío. Es una pista para revisarlo a mano.

Errores frecuentes en auditorías

  • Buscadores y filtros que recargan la página al salir del último campo, o al recorrer con flechas un select con onchange="this.form.submit()".
  • Campos de código de verificación que se envían solos al escribir el último dígito, sin aviso previo.
  • Ocultar el botón de envío por diseño y enviar con un evento blur.
  • Asistentes por pasos que avanzan solos al completar el último campo del paso.
Ver el texto completo del W3C (traducción al español)

Aplicabilidad

HTML

Descripción

Con frecuencia los formularios se diseñan para que se envíen automáticamente cuando el usuario ha rellenado todos los campos o cuando el foco abandona el último campo. Este enfoque plantea dos problemas. El primero es que un usuario con discapacidad que necesite más contexto puede mover el foco fuera del campo hacia las instrucciones sobre cómo rellenar el formulario, o hacia otro texto, y enviar el formulario accidentalmente. El otro es que, con algunos elementos de formulario, el valor del campo cambia a medida que se recorren los elementos con el teclado, lo que de nuevo envía accidentalmente el formulario. Es mejor confiar en el comportamiento estándar de los formularios: el botón de envío y la tecla Intro.

Ejemplos

Este ejemplo de fallo envía un formulario cuando el usuario abandona el último campo de un formulario de número de teléfono con tres campos. El formulario se enviará si el usuario abandona el campo después de editarlo, incluso al navegar hacia atrás en el orden de tabulación. Quien desarrolla no debería usar este método para enviar un formulario; en su lugar debería usar un botón de envío o confiar en el comportamiento predeterminado del formulario, que se envía cuando el usuario pulsa Intro en un campo de texto.

<form method="get" id="form1">
   <input type="text" name="text1" size="3" maxlength="3"> - 
   <input type="text" name="text2" size="3" maxlength="3"> - 
   <input type="text" name="text3" size="4" maxlength="4" onchange="form1.submit();">
 </form>

Este es un ejemplo que envía un formulario cuando el usuario selecciona una opción del menú sin que se avise de antemano de este comportamiento. El formulario se enviará en cuanto se seleccione un elemento del menú. Un usuario que use el teclado no podrá pasar del primer elemento del menú. Las personas ciegas y las personas con temblor en las manos pueden equivocarse fácilmente al elegir un elemento de la lista desplegable y se les lleva a un destino equivocado antes de que puedan corregirlo.

<form method="get" id="form2">
   <input type="text" name="text1">
    <select name="select1" onchange="form2.submit();">
      <option>one</option>
      <option>two</option>
      <option>three</option>
      <option>four</option>
    </select>
  </form>

Pruebas

Procedimiento

  1. Introducir datos en todos los campos de la página, empezando por arriba.
  2. Introducir datos en el último campo y salir de él (con el tabulador).
  3. Comprobar si al abandonar el último campo se produce un cambio de contexto.

Resultados esperados

  • Si la comprobación n.º 3 es verdadera, se da esta condición de fallo y el contenido falla el criterio de conformidad.

Cómo lo comprobamos en ADDAW

Este error es uno de los que buscamos en cada auditoría de ADDAW. Se lo entregamos con capturas y la forma de corregirlo.

Solicitar una auditoría

Basado en la técnica F36 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.