正是针对此类问题的新兴标准:ARIA(可访问的富 Internet 应用程序)。它仍然是一个工作草案,但是当与最近的浏览器(IE 9、Firefox 3.6(部分)和 4.0、Chrome)一起使用时,最近的屏幕阅读器(JAWS 9、NVDA 的最新版本)开始出现支持。
在这种特殊情况下,请查看aria-label和aria-labelledby。这些属性将被添加到 TinyMCE 小部件中的 BODY 元素 - 或 IFRAME,当用户输入数据时,两者中的任何一个实际获得焦点。因此:
<body aria-label="Edit document">
aria-label 属性只指定一个用作标签的字符串。aria-labelledby(注意两个 L,根据英式拼写)与传统的 LABEL 元素相反。也就是说,你给它一个 ID:
<body aria-labelledby="edit-label">
然后你会在代码的其他地方有这个:
<label id="edit-label">Edit document</label>
它不一定必须是 LABEL 元素,您可以使用 SPAN 或其他任何东西,但 LABEL 在语义上似乎是合适的。
ARIA 属性在 HTML 4 或 XHTML DTD 下无效。但是,它们将在 HTML 5 下进行验证(本身仍在开发中)。如果在较旧的 DTD 下验证对您很重要,您可以在页面加载时使用 JavaScript 以编程方式添加属性。
理想情况下,如果您已经有一个可见的小部件标签,那么您应该使用 aria-labelledby 来防止冗余。但是,我不知道它是否可以跨文档边界工作。也就是说,如果 BODY 在 IFRAME 中,并且可见标签是在 IFRAME 的父文档中定义的,我不知道它是否会起作用。浏览器/屏幕阅读器可以将两者视为不相互对话的单独文档。您必须进行实验才能找到答案。但如果事实证明它们不起作用,请尝试http://www.w3.org/TR/wai-aria/states_and_properties#aria-hidden。因此,在父文档中:
<label aria-hidden="true">Edit document</label>
在 TinyMCE 文档中:
<body aria-label="Edit document">
aria-hidden 属性将阻止读取父文档中的标签,而子文档(不可见)中的 aria-label 属性将代替它。瞧,一个在视觉和听觉上都标记为没有多余阅读的小部件。
如果您以这种方式使用 aria-hidden,请非常小心,您隐藏的位(或等效位)始终可用于在其他地方阅读。
此解决方案仅适用于使用支持 ARIA 的 Web 浏览器和屏幕阅读器的用户。使用较旧的屏幕阅读器或浏览器的人将不走运,这在最近关于 A List Apart 的文章,WAI ARIA 的可访问性中进行了详细讨论。作者为尽可能首选传统语义 HTML 解决方案提供了一个很好的案例;但就您而言,我认为您别无选择。至少,添加 ARIA 属性可以让您合理地声称您已经尽职尽责,并真诚地努力使其尽可能易于访问。
祝你好运!
远期读者注意:此处给出的 ARIA 规范链接是指 2010 年 9 月的工作草案。如果从那时起已经超过几个月,请检查更新的规格。