Il existe une norme émergente pour exactement ce type de problème: ARIA (Accessible Rich Internet Applications). C'est encore un brouillon de travail, mais le support commence à apparaître dans les récents lecteurs d'écran (JAWS 9, versions récentes de NVDA) lorsqu'il est utilisé avec les navigateurs récents (IE 9, Firefox 3.6 (partiel) et 4.0, Chrome). Dans ce cas particulier, consultez aria-label et aria-labelledby. Ce sont des attributs qui seraient ajoutés à l'élément BODY dans le widget de TinyMCE - ou à l'IFRAME, celui des deux qui prend réellement le focus lorsque l'utilisateur entre des données. Ainsi:
<body aria-label="Edit document">
L'attribut aria-label spécifie simplement une chaîne qui sert de label. L'aria-labelledby (notez les deux L, selon l'orthographe britannique) fonctionne comme l'élément traditionnel LABEL à l'envers. Autrement dit, vous nourrir un ID:
<body aria-labelledby="edit-label">
Et vous auriez ce quelque part ailleurs dans le code:
<label id="edit-label">Edit document</label>
Il ne doit pas nécessairement être un élément LABEL, vous pouvez utiliser un SPAN ou autre, mais LABEL semble sémantiquement approprié.
Les attributs ARIA ne seront pas validés sous HTML 4 ou DTD XHTML. Cependant, ils vont valider sous HTML 5 (lui-même encore en développement).Si la validation est importante pour vous sous une DTD plus ancienne, vous pouvez ajouter les attributs par programmation en utilisant JavaScript lorsque la page a été chargée.
Idéalement, si vous avez déjà une étiquette visible pour le widget, vous devriez utiliser aria-labelledby pour éviter la redondance. Cependant, je n'ai aucune idée si cela fonctionnera au-delà des limites du document. C'est-à-dire, si le BODY est dans un IFRAME, et l'étiquette visible est définie dans le document parent d'IFRAME, je ne sais pas si cela fonctionnera. Le navigateur/lecteur d'écran peut traiter les deux comme des documents distincts qui ne se parlent pas. Vous devrez expérimenter pour le savoir. Mais s'il s'avère qu'ils ne fonctionnent pas, essayez http://www.w3.org/TR/wai-aria/states_and_properties#aria-hidden. Ainsi, dans le document parent:
<label aria-hidden="true">Edit document</label>
Et dans le document TinyMCE:
<body aria-label="Edit document">
L'attribut caché aria-empêchera l'étiquette dans le document parent d'être lu, et l'attribut label aria dans le document enfant (qui n'est pas visible) prendra sa place. Voila, un widget étiqueté de manière visible et audible sans aucune lecture redondante. Si vous utilisez aria-hidden de cette façon, faites très attention à ce que le bit que vous cachez (ou un équivalent) soit toujours disponible pour lire quelque part ailleurs.
Cette solution ne fonctionne que pour les personnes utilisant des navigateurs Web et des lecteurs d'écran prenant en charge ARIA. Les personnes avec des lecteurs d'écran ou des navigateurs plus âgés n'auront pas de chance, ce qui est longuement discuté dans l'article récent sur A List Apart, The Accessibility of WAI ARIA. L'auteur présente un bon argument en faveur de la préférence pour les solutions HTML sémantiques traditionnelles chaque fois que cela est possible; mais dans votre cas, je ne pense pas que vous ayez d'autre choix. À tout le moins, l'ajout d'attributs ARIA vous permettra raisonnablement d'affirmer que vous avez fait preuve de diligence raisonnable et que vous avez fait un effort de bonne foi pour le rendre aussi accessible que possible.
Bonne chance! Note à l'intention des futurs lecteurs: Les liens vers la spécification ARIA donnés ici renvoient à l'avant-projet de septembre 2010. Si cela fait plus de quelques mois, vérifiez les spécifications les plus récentes.
Merci @Pekka, j'avais essayé pointant vers l'étiquette au textarea, mais je pense que cela ne fonctionne pas parce que le textarea est rendu invisible (JAWS, par exemple, ne lit généralement pas display: none ou visibility: hidden elements). –
@Stephen ouais, je pense que vous êtes un peu foutu avec ce :) Je suppose que vous pourriez faire pointer vers id de l'iframe lorsque TinyMCE l'a remplacé, mais ce n'est pas valide en tant que tel. Peut-être encore mieux que l'alternative, je ne peux pas juger cela –