Angular 15 项目中 NVDA 将表头读为按钮,是否需要升级?
可以提出 Angular 升级方案,但目前的信息还不足以确认升级是修复该无障碍问题的必要条件。先确认表头是否有排序按钮,再弄清内部组件所说的“17+”指什么,以及包含修复的版本对 Angular 有什么要求。
表头被读成按钮,是否一定有问题?
原始描述只说明 NVDA 将表头朗读为按钮,没有提供模板、最终 DOM、朗读原文或触发方式。因此还不能确定原因,更不能直接归因于 Angular 15。
常见情况有两种:
- 如果表头内有排序按钮,且焦点落在按钮上,NVDA 报告“按钮”可能符合该元素的实际用途。此时需要检查表头关系、按钮名称和排序状态是否清楚。
- 如果普通表头没有任何操作,却被设置为
role="button",或者组件把表头文字包进了按钮,就需要检查组件实现及配置。
还应区分 NVDA 是在逐格浏览表格时朗读,还是在按 Tab 聚焦到控件时朗读。同一张表格在这两种操作下可能读出不同的信息。仅凭出现“按钮”一词,无法判断是否存在无障碍缺陷,也无法判断是否满足 ADA 相关要求。
先收集能够定位问题的信息
建议先补充 ServiceNow 工单中的信息,使问题能够稳定复现:
- 记录浏览器和 NVDA 版本、操作步骤、实际朗读内容及预期行为。
- 确认问题发生在哪个表头,以及该列是否支持排序或其他操作。
- 查看浏览器渲染后的 DOM,检查
<th>、<button>、role、scope、aria-sort和aria-label。 - 在浏览器的无障碍树中检查相关元素的角色、名称及表头关系。
- 用相同环境比较一个普通 HTML 表格与内部组件表格,判断问题是否由组件引入。
对于 Angular 组件,最终 DOM 比组件标签更有助于判断,因为按钮或 ARIA 属性可能由组件内部生成。
表头应如何组织?
普通静态表格可以先用下面的结构作为对照:
<table>
<caption>用户列表</caption>
<thead>
<tr>
<th scope="col">姓名</th>
<th scope="col">部门</th>
</tr>
</thead>
<tbody>
<tr>
<td>张三</td>
<td>研发部</td>
</tr>
</tbody>
</table>
如果表头用于排序,可以保留表头语义,并在其中放置真正的按钮。下面仅展示某列处于升序状态时的结构:
<th scope="col" aria-sort="ascending">
<button type="button">姓名</button>
</th>
实际组件还需要实现排序操作,并在排序变化时同步更新 aria-sort。示例中的按钮本身不包含排序逻辑。
这种结构下,按钮获得焦点时被读作“按钮”是合理的。不要为了消除这个词而移除必要的按钮语义,也不要给真正可操作的控件添加 aria-hidden="true"。
如果表头不支持操作,应检查能否通过组件配置关闭相应功能,或修正多余的按钮和角色。是否需要修改组件源码,取决于内部组件提供的配置和维护方式。
如何确认“17+”是否意味着必须升级?
组件版本号与 Angular 版本号不能直接画等号。需要核实以下信息:
- 项目实际安装的内部组件版本,可结合锁文件确认。
- 哪个组件版本包含相关无障碍修复。
- 该修复版本在
peerDependencies中声明的 Angular 要求。 - 内部组件的兼容说明,以及能否将修复回移到 Angular 15 可用的组件版本。
例如,可以先查看当前 Angular 依赖:
npm ls @angular/core @angular/common
随后检查内部组件的 package.json。当前已安装组件的依赖声明只能说明当前版本的要求;评估候选修复版本时,还需要查看候选版本的声明。
不要通过强制忽略依赖冲突来证明兼容。安装完成并不代表组件能够正常运行,也不代表无障碍问题已经解决。
什么情况下应该提出升级方案?
如果确认无障碍修复只存在于要求更高 Angular 版本的组件中,而且没有可用的配置修正或修复回移方案,提出 Angular 升级就有了明确依据。升级提案应写清楚缺陷如何复现、哪个组件版本修复了它、该版本需要什么 Angular 环境,以及迁移影响和验证范围。
目标版本应结合项目其他依赖、内部支持范围和迁移成本确定,不能仅凭“17+”就选定 Angular 17。实施时应按适用的迁移路径推进,并准备回滚方案。
如果问题来自表头配置或错误的 HTML 语义,可能无需先升级框架。修复后,应使用最初记录的 NVDA 操作步骤复测,同时检查键盘操作、排序状态、焦点和表头关联。
目前最有价值的下一步是获取问题表头的最终 DOM 和内部组件修复版本的依赖要求,作为是否升级的判断依据。
备注:内容仅供参考。
