javascript - aria-live="polite" 不读取与其关联的元素的角色
问题描述
我有一个需要完全访问的网站。我们拥有位于单个页面上的动态内容(不会重新加载)并在屏幕上发生变化。
为了让屏幕阅读器跟上这一点,我添加了一些 JS 逻辑,其中添加了属性aria-hidden="true"
oraria-live= "polite"
以隐藏和显示目标元素。
虽然元素aria-label
被读出,但我遇到了一个role
属性被遗漏的问题。
情况一
<div role="button" aria-label="This is a label" aria-hidden="true"></div>
我用js去掉属性,在页面需要读取这个按钮的时候aria-hidden
添加aria-live="polite"
这使得屏幕阅读器然后阅读“这是一个标签”
情况2
<div role="button" aria-label="This is a label"></div>
但是,如果从一开始就读取内容而没有隐藏,即没有aria-hidden="true"
,它读作“这是一个标签,按钮”
我想要这种行为,但我能够控制这种情况何时发生。
我在最新的 Chrome 上使用 iOS 屏幕阅读器。
我已经尝试了很多技巧来解决这个问题:
- 设置
aria-hidden="true"
为父元素和单个元素会导致角色仍然被省略 - 不是
aria-live="polite"
用来显露而是相反aria-hidden="false"
。然而,这甚至不会被屏幕阅读器接收到
非常感谢任何帮助或指导。
附加的 JSFiddle,带有一个简化的示例(您可以使用 Apple 屏幕阅读器并点击进入窗口以收听阅读内容):
解决方案
到目前为止,所有评论都不错,但都在避免这个问题。不管你用的是真货<button>
还是<div role="button">
无所谓。使用 a<div>
肯定需要做更多的工作,因为您需要tabindex
事件处理程序aria-label
等,但如果所有这些都存在,那么您使用哪种辅助技术并不重要。
关于aria-live
,它并不意味着是一个动态属性。也就是说,它不是您要即时添加的属性。当页面加载并且元素已经aria-live
设置时,它的效果最好。
的目的aria-live
是宣布对元素(或子元素,如果aria-live
在容器上设置)的更改。因此,当页面加载并且正确的元素具有 aria-live 时,无论何时您向元素(或子元素)添加文本或添加/删除子元素或隐藏/取消隐藏子元素,这些更改都会被宣布。但只公布了文本。(请参阅aria-relevant
以控制宣布的更改类型。)
aria-live
如果您动态添加一个元素,然后将子元素添加到该新的活动区域,您可能会遇到时间问题。新添加的孩子是应该马上公布,还是显示/刷新周期需要经过一次,“live-ness”才会生效?很难说,因为浏览器和操作系统组合的工作方式略有不同。
我发现,当我不动态添加该属性时,aria-live 的效果非常好。
您的小提琴示例根本不适用于 PC 上的 NVDA。也就是说,当显示新按钮时,不会宣布任何内容,这是我所期望的,因为您正在取消隐藏按钮并添加aria-live
到它。所以我认为 的目的aria-live
有点被误解了。如果您在隐藏按钮周围添加一个容器并且该容器具有aria-live
,那么当按钮取消隐藏时,它将被宣布。
我把你的小提琴改成了:
<div aria-live="polite">
<button aria-hidden="true" class="newButton hidden" role="button">
New Content
</button>
</div>
我更改了 JS 以删除该aria-live
行
activeButton.addEventListener('click',function testFunc() {
//newButton.setAttribute("aria-live","polite");
newButton.removeAttribute("aria-hidden");
newButton.classList.remove("hidden");
}
现在,当我单击“显示”按钮时,我会听到“新内容”。我没有听到“按钮”,但没关系。 aria-live
旨在宣布文本更改,而不是元素的作用。
推荐阅读
- r - 因为和直到参数导致R中的错误
- c - Cooja - C 中的预期声明说明符
- android - 如果我使用 Google 的日历 API,我可以访问此屏幕吗?
- python - Python 记录链接、模糊匹配和去重
- json - 如何获取 https://stocks.exchange/api2/ticker
- android - 无法使用 DownloadManager 下载文件
- python - Django使用非数据库字段创建客户管理视图
- iframe - 改进具有相同源的多个 iframe 的页面加载
- python - subprocess ,打开 exe 文件并使用命令。Python
- python - Python Random.Choice 除了一个选项