情况
我有一个可以通过 JavaScript 显示和隐藏的屏幕区域(类似于“显示/隐藏高级搜索选项”)。在此区域内有表单元素(选择、复选框等)。对于使用屏幕阅读器(在本例中为 JAWS)等辅助技术的用户,我们需要将这些表单元素与标签链接或使用“标题”属性来描述每个元素的用途。我使用 title 属性是因为没有足够的空间放置标签,而且您获得的工具提示对于非屏幕阅读器用户来说很好。
代码看起来像这样:
<div id="placeholder" style="display:none;">
<select title="Month">
<option>January</option>
<option>February</option>
...
</select>
</div>
问题
通常,JAWS 不会读取隐藏的元素……因为它们是隐藏的,它知道这一点。但是,似乎元素有一个标题集,JAWS 无论如何都会读取它。如果我删除标题,JAWS 什么都不会读取,但显然这是不可访问的标记。
可能的解决方案
我的第一个想法是使用隐藏标签而不是标题,如下所示:
<div id="placeholder" style="display:none;">
<label for="month" style="display:none">Month</label>
<select id="month">...</select>
</div>
这导致完全相同的行为,现在我们失去了非屏幕阅读器用户的工具提示。此外,我们最终生成了两倍的 Html。
第二个选项是仍然使用标签,将其放置在屏幕之外。这样它就会被屏幕阅读器阅读,但不会被视觉用户看到:
<div id="placeholder" style="display:none;">
<label for="month" style="position:absolute;left:-5000px:width:1px;">Month</label>
<select id="month">...</select>
</div>
这确实有效,但我们再次丢失了工具提示并仍然生成额外的 Html。
我的第三种可能的解决方案是在 JavaScript 中递归遍历 DOM,在隐藏区域时删除标题,并在显示区域时将其添加回来。这也有效......但由于明显的原因非常难看,并且不能很好地扩展到更一般的情况。
还有其他想法吗?为什么 JAWS 会这样?