[英]aria-live=“polite” not reading roles of elements it is associated with
我有一个需要完全访问的网站。 我们拥有位于单个页面上的动态内容(不会重新加载)并在屏幕上发生变化。
为了让屏幕阅读器跟上这一点,我添加了一些 JS 逻辑,其中添加了属性aria-hidden="true"
或aria-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"
,它会显示为“这是一个 label,按钮”
我想要这种行为,但我能够控制这种情况何时发生。
我在最新的 Chrome 上使用 iOS 屏幕阅读器。
我已经尝试了很多技巧来解决这个问题:
aria-hidden="true"
设置为父元素和单个元素会导致角色仍然被省略aria-live="polite"
来显示,而是使用相反的aria-hidden="false"
。 然而,这甚至不会被屏幕阅读器接收到非常感谢任何帮助或指导。
附加的 JSFiddle,带有一个简化的示例(您可以使用 Apple 屏幕阅读器并单击 window 以收听阅读内容):
到目前为止,所有评论都不错,但都在避免这个问题。 无论您使用真正的<button>
还是<div role="button">
都无关紧要。 使用<div>
肯定需要更多的工作,因为您需要tabindex
和事件处理程序以及aria-label
等,但如果所有这些都存在,那么您使用哪种辅助技术并不重要。
关于aria-live
,它并不是一个动态属性。 也就是说,它不是您要即时添加的属性。 当页面加载并且元素已经设置了aria-live
时,它的效果最好。
aria-live
的目的是宣布对元素(或子元素,如果aria-live
设置在容器上)的更改。 因此,当页面加载并且正确的元素具有 aria-live 时,无论何时您向元素(或子元素)添加文本或添加/删除子元素或隐藏/取消隐藏子元素,这些更改都会被宣布。 但只公布了文本。 (请参阅aria-relevant
以控制宣布哪些类型的更改。)
如果您使用aria-live
动态添加元素,然后将子元素添加到该新的活动区域,则可能会遇到时间问题。 新添加的孩子是否应该立即宣布,或者显示/刷新周期是否需要 go 在“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
旨在宣布文本更改,而不是元素的作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.