role="document" 在 role="application" 内无效,因 ARIA 规范禁止嵌套,浏览器忽略该属性;替代方案是使用 role="region"、aria-roledescription 或独立 iframe 实现文档行为。

role="document" 本身不能在 role="application" 区域内“恢复”标准文档阅读模式——这是个常见误解。ARIA 规范明确禁止嵌套 role="document" 到 role="application" 内部,浏览器会直接忽略它,屏幕阅读器也不会切换回文档浏览行为。
为什么 role="document" 在 role="application" 里不生效
ARIA 的角色继承规则决定了:role="application" 是一个强接管型角色,它告诉辅助技术“此处由应用逻辑完全控制交互,禁用默认文档导航(如按 H 跳标题、按 B 跳按钮)”。而 role="document" 属于“文档结构角色”,与 application 在语义层级上互斥,W3C ARIA Authoring Practices 明确将其列为非法嵌套。
- Chrome + NVDA / JAWS 会静默丢弃子级的
role="document" - 即使 DOM 中写上了,
getComputedRole()查询结果仍是application - 没有浏览器实现过“局部退出 application 模式”的机制
真正可行的替代方案:用 aria-roledescription 或降级为 role="region"
如果你的目标是让某块内容(比如富文本编辑器的预览区、模态框里的帮助文档)支持线性阅读、支持标题导航,又不想整个页面脱离 application 上下文,只能绕开 document 角色:
使用 Puppeteer + Chrome 将 HTML 渲染为中文 PDF,自动处理图表等待、Tab 展开、动画、测高、白边消除、防分页,适用于看板、报表、网页和交互图表转 PDF。
- 对需要“类文档”行为的容器,改用
role="region"+aria-labelledby或aria-label,并确保内部有语义化标题(h1–h6),多数屏幕阅读器会在 region 内启用部分文档导航键 - 在关键容器上加
aria-roledescription="document"(仅作提示,不改变行为,但某些阅读器会在语音中读出“document”) - 更可靠的做法:把该内容抽离到独立的
<iframe>中,iframe的srcdoc或独立 HTML 文件可自由使用role="document"—— iframe 是真正的上下文隔离边界
容易被忽略的关键点:键盘焦点与阅读模式切换不是一回事
开发者常以为“能让用户 tab 进去就等于恢复文档模式”,但实际不是:
立即学习“前端免费学习笔记(深入)”;
- 进入
role="application"区域后,NVDA 默认进入“应用程序模式”,按方向键不再朗读文本流,而是交由 JS 处理 - 即使你用
tabindex="0"让某个 div 可聚焦,焦点进入后屏幕阅读器仍处于应用模式,不会自动切回文档浏览 - 唯一强制切换的方式是用户手动按 NVDA+Space 或 JAWS+Z —— 但这不可控,也不应依赖用户操作
所以别试图用 ARIA 角色“覆盖” application 的语义层;要么接受该区域全程由 JS 驱动交互,要么把需文档行为的内容物理隔离(iframe),这是目前所有主流辅助技术链路里唯一稳定可靠的路径。


















