Que signifie role = button?

J'ai trouvé que dans la page du projet Google+, les boutons sont tous fabriqués à partir de divs comme:

<div role="button"></div>  

J'aimerais savoir, est-ce juste pour sémantique, tout cela influence-t-il le style ou le handle d'événement de la div? J'ai essayé de simuler cliquez sur le bouton avec jQuery click, mais cela ne fonctionne pas.

38
demandé sur wong2 2011-07-03 14:42:13

3 réponses

Il indique à l'accessibilité (et à d'autres) logiciels Quel est le but du div. Plus ici dans le projet de role spécification d'attribut.

Oui, c'est juste sémantique. L'envoi d'un événement click au bouton devrait fonctionner.


Une version antérieure de cette réponse (en 2011) disait:

...mais la fonction click de jQuery ne le fait pas; elle ne déclenche que les gestionnaires d'événements qui ont été connectés à l'élément avec jQuery , Pas les gestionnaires accrochés d'autres façons.

...et fourni l'exemple de code et de sortie ci-dessous.

Je ne peux pas reproduire la sortie maintenant (deux ans plus tard). Même si je reviens aux versions antérieures de jQuery, ils déclenchent tous les gestionnaires jQuery, les gestionnaires DOM0 et les gestionnaires DOM2. L'ordre n'est pas nécessairement le même entre un clic réel et la fonction click de jQuery. J'ai essayé les versions jQuery 1.4, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5, 1.5.1, 1.5.2, 1.6, et des versions plus récentes telles que 1.7.1, 1.8.3, 1.9.1 et 1.11.3 (le courant 1.X version à partir de cette écriture). Je ne peux que conclure que c'était une chose browser , et je ne sais pas quel navigateur j'utilisais. (En ce moment, J'utilise Chrome 26 et Firefox 20 pour tester.)

Voici un test qui montre qu'en effet, les gestionnaires jQuery, les gestionnaires DOM0 et les gestionnaires DOM2 sont tous(à ce jour!) déclenchée par click de jQuery:

jQuery(function($) {
  var div;

  $("<p>").text("jQuery v" + $.fn.jquery).appendTo(document.body);

  // Hook up a handler *not* using jQuery, in both the DOM0 and DOM2 ways
  div = document.getElementById("theDiv");
  div.onclick = dom0Handler;
  if (div.addEventListener) {
    div.addEventListener('click', dom2Handler, false);
  } else if (div.attachEvent) {
    div.attachEvent('onclick', dom2Handler);
  }

  // Hook up a handler using jQuery
  $("#theDiv").click(jqueryHandler);

  // Trigger the click when our button is clicked
  $("#theButton").click(function() {
    display("Triggering <code>click</code>:");
    $("#theDiv").click();
  });

  function dom0Handler() {
    display("DOM0 handler triggered");
  }

  function dom2Handler() {
    display("DOM2 handler triggered");
  }

  function jqueryHandler() {
    display("jQuery handler triggered");
  }

  function display(msg) {
    $("<p>").html(msg).appendTo(document.body);
  }

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<div id="theDiv">Try clicking this div directly, and using the button to send a click via jQuery's <code>click</code> function.</div>
<input type='button' id='theButton' value='Click Me'>
21
répondu T.J. Crowder 2015-09-27 13:23:20

L'attribut role est utilisé par le logiciel d'accessibilité pour savoir ce que fait le div. Pour plus d'informations, voir cette page.

5
répondu EdoDodo 2011-07-03 10:46:05

C'est juste de la sémantique.

Il est recommandé d'utiliser des boutons HTML natifs à l'aide de la balise <button>. Toutefois, si vous avez des contrôles personnalisés utilisant les balises <a> ou <div>, les informations suivantes sur le role='button' sont fortement recommandées.

  1. Déclencher une Réponse

Si vous créez des contrôles personnalisés, ils devraient fonctionner comme un bouton. Si vous cliquez sur l'élément, il devrait déclencher une réponse. Par exemple, cette réponse ne modifie pas le texte de le bouton c'est à dire un contrôle personnalisé. Si c'est le cas, ce n'est pas un bouton.

  1. mise au point du clavier

Ces contrôles personnalisés agissant comme des boutons devraient être focusables en tabulant à travers un clavier et devraient également être focusables par programme pour les lecteurs d'écran.

  1. l'Opérabilité

Le contrôle personnalisé doit implémenter {[5] } ainsi que onKeyDown événements. Les boutons peuvent être activés via la barre d'Espace . Donc, si vous ajoutez le rôle à un contrôle personnalisé, vous devez gérer ces événements vous-même. Autre chose, la sémantique perd de sa signification. Un utilisateur de lecteur d'écran va essayer d'activer le bouton en utilisant la barre d'espace, mais ne peut pas.

La syntaxe standard pour un contrôle personnalisé avec le role='button' est

<div role="button" tabindex="0" onclick="click_handler()" onKeyDown="keyhandler_for_space()">

Le tabindex="0" n'est pas nécessaire si vous utilisez la balise <a>, mais est nécessaire si vous utilisez une balise non focalisable comme <span> ou <div> pour autoriser manuellement la mise au point.

Un autre conseil utile est si vous êtes toujours en ayant recours à un bouton personnalisé, il est préférable d'utiliser la balise <a> car vous pouvez éviter les gestionnaires onclick.

2
répondu KannarKK 2015-11-29 12:51:35