aria-relevant需配合aria-live使用,仅支持additions、removals、text、all;推荐text+polite组合,textContent更新最可靠,innerHTML易失效。
aria-relevant 该设哪些值才真正触发屏幕阅读器播报
设了
却没反应?大概率是值选错了,或者没配合
一起用。这个属性本身不生效,只是告诉屏幕阅读器“关注哪些变更”,必须搭配
才能激活监听。
常见错误现象:
写了,但新增 DOM 后屏幕阅读器静音;或者删掉元素时误以为会读“已移除”,其实默认不读删除动作。
只接受空格分隔的多个值:
、
、
、
(等价于前三者组合)
:只对 append 类操作有效(如
),
或
覆盖不算“新增节点”
极少被支持——NVDA 和 VoiceOver 基本忽略它,别依赖它播报删除
是最稳妥的选择:只要子文本内容变化(包括通过
或
修改),就会触发播报
aria-live 的 polite / assertive 怎么选不翻车
选错
级别,轻则播报延迟,重则打断用户当前操作(比如正在输入,突然弹出提示把焦点抢走)。
使用场景差异明显:
是默认值,适合状态更新(如“已保存”)、表单校验提示;
仅用于紧急中断(如“网络断开,请重连”),且必须慎用——部分读屏会立即暂停当前语音并插播。
立即学习
“
前端免费学习笔记(深入)
”;
:等用户停顿(如读完当前句)再播报,兼容性好,推荐作为首选
:可能打断一切,iOS VoiceOver 对它的处理不稳定,某些版本直接静音
不是合法值,别写;禁用播报请移除属性或设为
后清空内容
动态切换
值无效,必须重新插入元素或用
触发重载
为什么 innerHTML 替换后 aria-relevant 没反应
因为
监听的是 DOM 树结构变化,不是内容字符串变化。
是销毁旧子树 + 创建新子树,但若新内容不含新节点(比如纯文本),屏幕阅读器可能不认为这是“相关更新”。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
性能影响很实际:频繁用
触发重渲染,不仅让
失效,还会导致焦点丢失、事件监听器被清空。
优先用
更新纯文本,它能稳定触发
要插入 HTML 片段,改用
或
(需自行 sanitize),比
更可控
避免在
区域内放可聚焦元素(如
),否则焦点可能跳转,破坏阅读流
React/Vue 里怎么安全更新 aria-live 区域
框架的虚拟 DOM 优化常绕过原生 DOM 变更检测,导致
完全失灵。不是框架 bug,是它根本没走浏览器那套“节点增删”路径。
最容易被忽略的点:框架组件重渲染时,哪怕 DOM 最终一样,
区域也大概率被完整替换,造成播报重复或丢失。
在 React 中,给
容器加
并保持稳定(比如用 status ID),避免无谓重挂载
Vue 用户注意
会彻底卸载元素,改用
配合
控制可见性
所有框架都建议:更新前先清空区域(
),再设新内容,确保变化被识别
别在
或
里直接操作
—— 改用 ref +
,更贴近原生语义
动态区域的可靠性不取决于属性堆得多,而在于每次更新是否真实产生浏览器可感知的 DOM 变化。很多问题,卡在“以为改了,其实没进 DOM”。
aria-relevantaria-livearia-livearia-relevant="additions"aria-relevantadditionsremovalstextalladditionselement.appendChild()innerHTML +=textContentremovalstexttextContentinnerTextaria-livepoliteassertivearia-live="polite"aria-live="assertive"aria-live="off"politearia-liveinnerHTMLaria-relevantinnerHTML = "新内容"innerHTMLaria-relevanttextContentaria-relevant="text"element.replaceChildren(...)element.setHTMLUnsafe()innerHTMLaria-livearia-relevantaria-livearia-livekeyv-ifv-showaria-hiddenel.textContent = ""useEffectwatchinnerHTMLtextContent