我正在编写一个 nwjs 游戏,我想为其添加辅助功能。
我当前正在使用
aria-live
属性与屏幕阅读器进行通信。
document.getElementById("game").setAttribute("aria-live", "assertive")
我通过这样做来宣布消息
document.getElementById("game").setAttribute("aria-label", "my text")
这可行,但我需要一种方法来中断它。
“自信”和“礼貌”的 aria-live 设置都不起作用。
我尝试将标签文本设置为“”或“.!”但它也不起作用。
有办法做到这一点吗?或者也许有更好的方法在 nwjs javascript 应用程序中与屏幕阅读器进行通信?
首先,不考虑 live 属性,因此如果在创建元素后添加 aria-live 属性,则该属性不起作用。 为了使其正常工作,该属性必须在元素添加到 DOM 时存在。
如果在页面加载后将元素添加到 DOM,它甚至也不会一直工作(某些屏幕阅读器 + 浏览器 + 操作系统组合不支持它)。 最安全/最兼容的是让 自页面加载以来已经存在活动元素。
其次,要说出的文本必须作为内容/子元素添加到实时元素中。使用appendChild、insertAdjacentHTML等
标签和/或描述的更改不会自动读取,无论是真正的
<label>
、aria-label还是aria-labelledby都是一样的。
仅读取元素的内容。
另请注意,页面加载时元素内存在的内容将不会被读取。至少,它也不是普遍适用的。如果您需要在页面加载时说一些话,诀窍是在页面加载后不久(即几百毫秒后)添加内容。
最后,要回答实际问题,不,您不能打断屏幕阅读器当前所说的内容。清除实时区域的内容可以在少数 SR+浏览器+操作系统组合中使用,但只是少数。 它并不是在所有地方都适用,所以你不应该依赖它。
但是,如果您使用 Elektron 或 nw.js 制作应用程序,则可以调用将直接与屏幕阅读器交互的本机库。
优点:发消息说话延迟小一些,可以有效控制什么时候打断语音。
缺点:它不可移植,并且您可能需要调用与支持的屏幕阅读器+操作系统组合一样多的不同 API。
如果你有兴趣,我是这样一个 Windows 库的作者,它叫做 UniversalSpeech。它可以从 nw.js/Elektron 调用。