Haciendo clic accesible a través de la estructura de pestañas?

6 minutos de lectura

Así que estoy trabajando en un proyecto que requiere un <div> con un evento onclick. Tengo la funcionalidad principal funcionando, pero hay un problema. Necesito que ocurra el evento onclick cuando el usuario tabula al <div> y presiona enter. Agregué un tabindex al <div> lo que le permite obtener el foco, pero no sucede nada cuando el usuario presiona enter (o cualquier otra tecla).

Puede alguien ayudarme con esto? ¿O lo que quiero ni siquiera es posible?

Aquí hay un jsfiddle que demuestra mi problema.
http://jsfiddle.net/logiwan992/suwq7r09/

Gracias de antemano por cualquier ayuda.

  • Envía tu código por favor.!!!

    – Mxx persa

    18/09/2015 a las 18:52

  • @Mxxpersian: Está en JSFiddle.

    – D4V1D

    18/09/2015 a las 18:53

  • Aprender acerca .enfocar().

    – D4V1D

    18/09/2015 a las 18:53

  • Este trabajo bien para mí !!!!

    – Mxx persa

    18/09/2015 a las 18:55

  • @MatthewDarnell ¿Cómo es más semántico usar un ancla en este caso?

    – jacob

    18/09/2015 a las 19:11

Avatar de usuario de Daniel Beck
daniel beck

Observo que la pregunta está etiquetada como WCAG y “accesibilidad”.

Por lo tanto, la respuesta a su pregunta es “no haga eso”. Las otras respuestas en esta página funcionarán bien, para todos, excepto para las personas que necesitan que funcione, es decir, aquellos que usan lectores de pantalla u otra tecnología de asistencia. Ninguna de las soluciones basadas en javascript aquí es compatible con WCAG.

lo que quieres es un <button>. Eso le da su tabindex y el control del teclado de forma gratuita.

También puede forzar un <div> trabajar como un <button> agregando el marcado ARIA (aunque es mejor y más fácil simplemente usar la etiqueta que ya hace lo que necesita que haga).

Si es absolutamente necesario, una buena introducción al uso de ARIA para pseudo-botones está aquí:
https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_button_role

La esencia de esto es que necesita agregar el role="button" atributo, y gestionar el estado de la aria-pressed atributo manualmente (capturando eventos clave y clics en javascript; otras respuestas han cubierto esto bastante a fondo, por lo que no repetiré los detalles)

  • El problema aquí es que estoy trabajando con código heredado. Si cambio el <div> a un <button> entonces todo el estilo se estropea por completo. No sé nada sobre el marcado ARIA, pero ¿puedes explicar cómo podría usarlo? Estoy de acuerdo en que la “mejor” opción sería cambiarlo a un <button>. Eso es probablemente lo que terminaré haciendo al final. Solo tomará mucho más trabajo.

    – lfitzgibbons

    18/09/2015 a las 19:43


  • Si está trabajando con código heredado, estoy dispuesto a apostar que todo es inaccesible.

    – jacob

    18/09/2015 a las 19:48

  • @Logiwan992: Un <button> puede contener cualquier marcado que desee, por lo que tal vez pueda envolver una etiqueta de botón alrededor de su existente <div> en lugar de reemplazar el div con un botón.

    – Esteban P.

    18/09/2015 a las 21:43

  • Observo que la pregunta está etiquetada como WCAG y “accesibilidad”. Por lo tanto, la respuesta a su pregunta es “no haga eso”. Dios mío, leíste mi mente…

    – Adán

    19 de septiembre de 2015 a las 12:08

  • Terminé cambiándolo a un <button>. Gracias por tu ayuda, creo que esta fue la mejor respuesta.

    – lfitzgibbons

    25/09/2015 a las 18:51

Está perfectamente bien tener un

que funcione como un botón, siempre que especifique las etiquetas ARIA, los roles y los eventos de teclado correctos. Ese es el objetivo de ARIA.

Sin embargo, estoy de acuerdo en que, cuando sea posible, debe usar los elementos html nativos. Esa es la primera regla del uso de ARIA: http://www.w3.org/TR/aria-in-html/#notes-on-aria-use-in-html. Pero entiendo que no siempre es posible.

Hubo una mención del uso de focus(). Eso es incorrecto. Foco () se utiliza para mover el foco al objeto. No se utiliza para manejar un evento. Ahora tal vez se referían a onFocus(), que es un evento que se activa cuando el objeto recibe el foco, pero aún así no es el evento correcto para atrapar. No desea que un botón (ya sea implementado como un

o un

El atributo “onclick” tiene un comportamiento específico en los enlaces, porque se puede activar con la tecla Intro.

Vea la siguiente falla de WCAG:
http://www.w3.org/TR/WCAG20-TECHS/F59.html

Hay que cuidar el “rol” del elemento.

La siguiente página ilustra cómo puede hacer un “enlace accesible” desde un “span”:
https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_link_role

Además, como ya se dijo, la mejor manera es confiar en un botón/un elemento cuando sea posible.

Avatar de usuario de D4V1D
D4V1D

Trate de atar el keypress evento en dicho div y detectar si Enter se presionó la tecla (que tiene el número de código 13).

var div = document.getElementsByTagName('div');
div[0].addEventListener('keypress', function(e) {
    if(e.keyCode == 13) {
        alert('div focused');   
    }
});

JSFiddle de trabajo


También puede, alternativamente, usar jQuery:

jQuery(function($) {

    $('div').on('keypress', function(e) {
        if(e.keyCode == 13) {
            alert('div focused'); 
        }
    });

});

JSFiddle de trabajo

Avatar de usuario de Jacob
jacob

Utilice el mismo controlador de eventos para ambos eventos. Si el evento es keypress verifique que la tecla presionada sea la tecla Enter antes de ejecutar.

var divButton = document.querySelector('#div-button');

divButton.addEventListener('click', activate);
divButton.addEventListener('keypress', activate);

function activate(e) {
  if (e.type === 'keypress' && e.keyCode == 13) {
    alert('activated the div'); 
  }
};
div {
    outline: 1px solid black;
}

div:focus {
    outline: 1px solid red;
}
<div id="div-button" tabindex="0">
    <h1>This is my div!</h1>
</div>    

¿Ha sido útil esta solución?