aria-busy="true"在DOM更新前设于动态容器上时起作用,告知屏幕阅读器暂停播报该区域内容,避免读出不完整或中间态;必须配对设为false,且不可与aria-live混用。
aria-busy="true" 什么时候起作用
是一个 ARIA 状态属性,用于向辅助技术(如屏幕阅读器)表明某个区域的内容正在动态更新、尚未稳定。它本身
不会阻止 DOM 更新或暂停 JavaScript
,只是传递语义信号。主流屏幕阅读器(NVDA、JAWS、VoiceOver)在遇到
的容器时,会暂缓对该区域内节点变更的播报,避免读出中间态、不完整或重复的内容。
必须用在
容器元素
上(如
、
),不能加在按钮或输入框等交互控件上
值只能是
或
(字符串字面量,不是布尔值)
不要和
冲突:若同时设了
和
,多数读屏会优先尊重
并静音该区域
如何正确设置和清除 aria-busy
关键在于
时机精准
:必须在数据请求开始后、DOM 更新前设为
;在新内容完全渲染并可安全播报时,再设回
。
不要在
里才设
——太晚了,请求已发,UI 可能已开始闪烁
清除时不要依赖
模拟“等待”,而应基于真实渲染完成点(如 React 的
、Vue 的
、或
监听目标节点变化)
避免设完
后忘记恢复:残留的
会让该区域永久“失声”
与 aria-live 配合使用的注意事项
通常和
成对出现,构成完整的“加载中静音 → 加载完成播报”流程:
必须始终存在且值不变(
或
),否则
失效
若内容更新后需主动触发播报(比如加载完自动读出“找到 12 条结果”),应在设
后,
再修改一次区域内的文本或插入带的临时提示元素
不要给子元素单独加
:这会绕过父级
的控制,导致中间状态被意外朗读
常见失效场景和调试方法
看似简单,但实际中容易因 DOM 结构或读屏配置失效:
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
立即学习
“
前端免费学习笔记(深入)
”;
屏幕阅读器未启用“智能暂停”模式(如 NVDA 默认开启,但某些企业定制版可能关闭)
容器元素被设了
或
:此时整个区域不可访问,
无意义
使用了
替换整个容器内容:若新 HTML 片段没带
,重绘后状态丢失
测试时只看视觉反馈,没开读屏验证:务必用 NVDA + Firefox 或 VoiceOver + Safari 实测语音流
最可靠的验证方式:打开读屏,触发加载,在加载过程中观察是否
完全不读任何中间文字或 loading 提示
;完成后是否自然播报最终内容。如果仍有杂音,先检查
是否真的在 DOM 上实时切换,再确认容器是否被意外移出可访问树。
aria-busyaria-busy="true"divsection"true""false"aria-livearia-live="polite"aria-busy="true"aria-busy"true""false"// 示例:React 中控制 loading 状态
useEffect(() => {
if (isLoading) {
regionRef.current?.setAttribute('aria-busy', 'true');
} else {
regionRef.current?.setAttribute('aria-busy', 'false');
}
}, [isLoading]);fetch().then()aria-busy="true"setTimeoutuseLayoutEffectnextTickMutationObserveraria-busy="true"aria-busy="true"aria-busyaria-live
aria-live"polite""assertive"aria-busyaria-busy="false"aria-livearia-livearia-busyaria-busydisplay: nonevisibility: hiddenaria-busyinnerHTMLaria-busy="false"aria-busy