Addaw, ir a inicio Donar

Técnica Scripts de cliente WCAG 2.2

SCR35Hacer accesibles por teclado las acciones usando el evento onclick de enlaces y botones

En resumen

La forma más sencilla de que una acción de JavaScript funcione con teclado, ratón y tecnologías de asistencia es asociarla a un enlace o a un botón HTML nativos mediante onclick, ya que ese evento se dispara con cualquier dispositivo de entrada. Esta técnica muestra varias formas de hacerlo y cómo ofrecer una alternativa (href real o envío de formulario) cuando los scripts no estén disponibles.

Ejemplo práctico

Ficha de una oficina municipal con un control que muestra u oculta el horario de atención mediante JavaScript. Es habitual encontrarlo maquetado con un div clicable en lugar de un botón.

Así no: Acción de script en un div con onclick

El div responde al clic del ratón, pero no recibe el foco ni reacciona a Intro o Espacio: con teclado es imposible ver el horario, y el lector de pantalla lo anuncia como texto normal, no como control.

<h2>Oficina de Atención Ciudadana</h2>
<div class="accion" onclick="verHorario(this)">Ver horario de atención</div>
<p id="horario" hidden>De lunes a viernes, de 9:00 a 14:00. Jueves, también de 16:30 a 18:30.</p>
<style>
  h2 { font-size: 1.1em; }
  .accion { display: inline-block; background: #744E9A; color: #fff; border: 0; padding: .5em 1em; font: inherit; cursor: pointer; }
</style>
<script>
function verHorario(control) {
  var horario = document.getElementById('horario');
  horario.hidden = !horario.hidden;
}
</script>
Captura de pantalla del ejemplo incorrecto: Acción de script en un div con onclick
Así se ve el ejemplo incorrecto.

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

Así sí: La misma acción asociada a un botón nativo

El control pasa a ser un <button type="button">: recibe el foco, el evento click se dispara también con Intro y Espacio y se anuncia como botón. Al tratarse de un contenido desplegable, se añade aria-expanded para comunicar si está abierto.

<h2>Oficina de Atención Ciudadana</h2>
<button type="button" class="accion" aria-expanded="false" aria-controls="horario" onclick="verHorario(this)">Ver horario de atención</button>
<p id="horario" hidden>De lunes a viernes, de 9:00 a 14:00. Jueves, también de 16:30 a 18:30.</p>
<style>
  h2 { font-size: 1.1em; }
  .accion { display: inline-block; background: #744E9A; color: #fff; border: 0; padding: .5em 1em; font: inherit; cursor: pointer; }
  .accion:focus-visible { outline: 3px solid #0B2239; outline-offset: 2px; }
</style>
<script>
function verHorario(control) {
  var horario = document.getElementById('horario');
  horario.hidden = !horario.hidden;
  control.setAttribute('aria-expanded', String(!horario.hidden));
}
</script>

Pruébelo aquí:

Cómo comprobarlo

Teclado

  1. Recorrer la página con Tab y comprobar que el control recibe el foco con un indicador visible.
  2. Pulsar Intro y luego Espacio y verificar que en ambos casos se muestra u oculta el horario.
  3. Comparar con el ratón: todo lo que hace el clic debe poder hacerse también con el teclado.

Lector de pantalla (NVDA o VoiceOver)

  1. Situar el foco en el control y comprobar que se anuncia como botón y con su estado.
  2. Activarlo y verificar que el estado cambia a expandido.

Debería anunciar: «Ver horario de atención, botón, contraído»

Herramientas del navegador

  1. Abrir las herramientas de desarrollo (F12), pestaña Elementos, y buscar atributos onclick o escuchadores de click (panel «Event Listeners») en elementos div, span, li o img.
  2. En la pestaña Accesibilidad, comprobar que cada elemento con acción tiene función de botón o enlace y es enfocable.

Validación automática

  1. axe DevTools, WAVE y Lighthouse no detectan de forma fiable un div con onclick: no saben si un elemento tiene escuchadores de eventos.
  2. La prueba con teclado es imprescindible para el criterio 2.1.1; las herramientas automáticas solo ayudan si el elemento ya tiene una función ARIA sin nombre o sin tabindex.

Errores frecuentes en auditorías

  • Usar div o span con onclick como botones, que no reciben el foco ni responden a Intro o Espacio.
  • Añadir tabindex="0" a un div clicable pero no gestionar las teclas Intro y Espacio, de modo que recibe el foco y no hace nada.
  • Usar a sin href como disparador de scripts: sin href el enlace no es enfocable ni se activa con teclado.
  • Asociar la acción a mousedown o mouseup en lugar de click, eventos que el teclado no dispara.

Técnica completa: traducción al español del texto del W3C

Aplicabilidad

Scripts usados con HTML.

Descripción

El objetivo de esta técnica es mostrar cómo invocar una función de script de forma accesible por teclado, asociándola a un control accesible por teclado. Para garantizar que las acciones de script puedan invocarse desde el teclado, se asocian a elementos HTML «accionables de forma nativa» (enlaces y botones). El evento onclick de estos elementos es independiente del dispositivo. Aunque «onclick» suena a que está ligado al ratón, en realidad el evento onclick está asociado a la acción predeterminada de un enlace o de un botón. La acción predeterminada se produce cuando el usuario hace clic en el elemento con el ratón, pero también cuando el usuario sitúa el foco en el elemento y pulsa Intro o Espacio, y cuando el elemento se activa a través de la API de accesibilidad.

Esta técnica depende de los scripts del lado del cliente. No obstante, es beneficioso proporcionar una implementación alternativa o una explicación para los entornos en los que los scripts no estén disponibles. Cuando se usan elementos de anclaje para invocar una acción JavaScript, la implementación alternativa o la explicación se proporciona mediante el atributo href. Cuando se usan botones, se proporciona mediante el envío de un formulario.

Ejemplos

Enlace que ejecuta un script y no tiene alternativa para navegadores sin scripts

Este enfoque solo debe usarse cuando se confía en los scripts como tecnología compatible con la accesibilidad.

Aunque no queremos navegar desde este enlace, debemos usar el atributo href en el elemento a para que sea un verdadero enlace y obtenga el tratamiento de eventos adecuado. En este caso usamos href="#" como destino del enlace, pero podría usarse cualquier cosa. Nunca se navegará por este enlace.

El «return false;» al final de la función de manejo de eventos doStuff() indica al navegador que no navegue al URI. Sin él, la página se recargaría después de ejecutarse el script.

<script> 
  function doStuff() {
    //do stuff
    return false;
  }
</script>
<a href="#" onclick="return doStuff();">do stuff</a>

Enlace que ejecuta un script, pero navega a otra página cuando los scripts no están disponibles

Este enfoque puede usarse para crear sitios que no dependan de los scripts, siempre y cuando el destino de la navegación ofrezca la misma funcionalidad que el script. Este ejemplo es idéntico al ejemplo 1, salvo que ahora su href apunta a una página real, dostuff.html. La página dostuff.html debe ofrecer la misma funcionalidad que el script. El «return false;» al final de la función de manejo de eventos doStuff() indica al navegador que no navegue al URI. Sin él, el navegador navegaría a dostuff.html después de ejecutarse el script.

<script> 
  function doStuff() {  
  //do stuff
  return false;
}
</script>
<a href="dostuff.html" onclick="return doStuff();">do stuff</a>

Hay disponible un ejemplo funcional de este código. Consulte Creating Action Links using JavaScript (crear enlaces de acción con JavaScript).

Botón que ejecuta un script y recurre al envío de un formulario para los usuarios sin scripts

Este enfoque pueden usarlo los sitios que no dependen de los scripts, siempre y cuando el envío del formulario ofrezca la misma funcionalidad que el script. El onsubmit="return false;" impide que se envíe el formulario.

<script>
function doStuff() {
  //do stuff
}
</script>
<form action="doStuff.aspx" onsubmit="return false;">
  <input type="submit" value="Do Stuff" onclick="doStuff();">
</form>

Hay disponible un ejemplo funcional de este código. Consulte Creating Action Buttons using JavaScript (crear botones de acción con JavaScript).

Botón que ejecuta un script, implementado con input type="image"

Tenga en cuenta que debe añadirse un atributo alt al input para proporcionar un equivalente textual de la imagen. Este enfoque solo debe usarse cuando se confía en los scripts.

<script>
function doStuff() {
  //do stuff
  return false;
}
</script>
<input type="image" src="stuff.gif" alt="Do stuff" onclick="return doStuff();">

Botón que ejecuta un script, implementado con input type="submit", input type="reset" o input type="button"

Este enfoque solo debe usarse cuando se confía en los scripts.

<input type="submit" onclick="return doStuff();" value="Do Stuff">

Botón que ejecuta un script, implementado con button

Esto resulta útil cuando se desea más control sobre el aspecto del botón. En este ejemplo concreto, el botón contiene tanto un icono como texto. Este enfoque solo debe usarse cuando se confía en los scripts.

<button onclick="return doStuff();">
  <img src="stuff.gif" alt="stuff icon">
  Do Stuff
</button>

Pruebas

Procedimiento

Para todas las acciones de script asociadas a elementos a, button o input:

  1. En un agente de usuario compatible con scripts

    • Hacer clic en el control con el ratón.
    • Comprobar que la acción del script se ejecuta correctamente.
    • Si el control es un elemento de anclaje, comprobar que no se invoca el URI del atributo href del elemento de anclaje.
    • Comprobar que es posible navegar hasta el control y darle el foco mediante el teclado.
    • Situar el foco del teclado en el control.
    • Comprobar que al pulsar INTRO se invoca la acción del script.
    • Si el control es un elemento de anclaje, comprobar que no se invoca el URI del atributo href del elemento de anclaje.
  2. En un agente de usuario no compatible con scripts

    • Hacer clic en el control con el ratón.
    • Si el control es un elemento de anclaje, comprobar que se invoca el URI del atributo href del elemento de anclaje.
    • Comprobar que es posible navegar hasta el control y darle el foco mediante el teclado.
    • Situar el foco del teclado en el control.
    • Si el control es un elemento de anclaje, comprobar que al pulsar INTRO se invoca el URI del atributo href del elemento de anclaje.

Resultados esperados

  • Todas las comprobaciones anteriores son verdaderas.

Recursos

Cómo lo comprobamos en ADDAW

En las auditorías de accesibilidad de ADDAW revisamos cada criterio de conformidad siguiendo este catálogo de técnicas: comprobamos si la web aplica una técnica suficiente y documentamos cada fallo común con capturas y el código afectado, para que el equipo de desarrollo sepa exactamente qué corregir. Los informes siguen la metodología del Observatorio de Accesibilidad y la norma UNE-EN 301 549.

Solicitar una auditoría

Fuente y licencia

Traducción al español, no oficial, realizada por ADDAW a partir de la técnica SCR35 del documento «Techniques for WCAG 2.2» del W3C (versión del repositorio público del W3C a 22/10/2026). Copyright © W3C® (MIT, ERCIM, Keio, Beihang). Se publica conforme a la licencia de documentos del W3C. El texto normativo de referencia es el original en inglés; si detecta un error en la traducción, escríbanos.

Financiado por la unión europea Gobierno de españa red.es Plan de recuperación transformación y resilencia kit digital