element.ariaselected 是 w3c aria 规范定义的原生 dom 属性,用于向辅助技术传达可聚焦子项(如 role="option")的选中语义,须与容器角色、焦点管理和应用状态严格同步,不可用于原生控件或普通按钮。

Element.ariaSelected 是 W3C ARIA(Accessible Rich Internet Applications)规范定义的 DOM 元素原生属性,用于声明某个元素在可访问上下文中的选中状态。它不是视觉样式控制属性,而是向辅助技术(如屏幕阅读器)传达语义信息的关键通道。要实现符合 W3C 标准的原始可访问 DOM 渲染,核心在于:**正确使用 ARIA 属性表达意图、不破坏原生语义、与 DOM 状态严格同步、避免手动模拟交互逻辑**。
明确 ariaSelected 的适用场景和限制
ariaSelected 仅适用于具有 roving tabindex 或 listbox / grid / tree 角色的容器中可聚焦的子项(如 role="option"、role="row"、role="treeitem")。它不能用于普通 div 或 button,也不能替代原生表单控件(如 )的 checked 属性。
- ✅ 正确用法:
<div role="option" aria-selected="true">选项一</div> - ❌ 错误用法:
<button aria-selected="true">提交</button>(应使用aria-pressed或原生type="button"+ JS 状态管理) - ⚠️ 注意:若元素已有原生语义(如
通过 Element.ariaSelected 属性直接读写状态
现代浏览器(Chrome 88+、Firefox 79+、Safari 15.4+)支持 Element 接口上的 ariaSelected 属性,它是可读写的 DOM IDL 属性,底层映射到 aria-selected HTML 属性,但更安全、类型明确:
- 获取当前状态:
element.ariaSelected返回字符串"true"或"false"(注意是字符串,不是布尔值) - 设置状态:
element.ariaSelected = "true"或element.ariaSelected = "false" - 清除状态(恢复未定义):
element.ariaSelected = null或element.removeAttribute("aria-selected")
相比 element.setAttribute("aria-selected", "true"),IDL 属性写法更简洁、无拼写风险,且部分浏览器对其变更触发更及时的辅助技术通知。
保持 DOM 状态与应用逻辑严格一致
可访问性失效最常见的原因是“视觉已选中,但 ariaSelected 未更新”或“辅助技术感知已选中,但 UI 未响应”。必须建立单向数据流:
- 用户操作(键盘/鼠标)→ 更新应用状态 → 同步更新
element.ariaSelected和视觉样式(如添加 .selected 类) - 禁止反向操作:不要监听
ariaSelected变化来触发业务逻辑(它不是事件源) - 推荐模式:用一个集中状态对象(如 selectedId)驱动所有视图更新,包括 ariaSelected 设置
示例片段:
function selectItem(itemElement, itemId) {
// 清除之前选中项
document.querySelectorAll('[role="option"][aria-selected="true"]').forEach(el => {
el.ariaSelected = "false";
el.classList.remove('selected');
});
// 设置新选中项
itemElement.ariaSelected = "true";
itemElement.classList.add('selected');
// 同步应用状态(如更新 store 或 dispatch event)
currentState.selectedId = itemId;
}
配合角色(role)和焦点管理构建完整可访问链路
单独设置 ariaSelected 不足以满足 W3C WCAG 2.1 标准。必须配套实现:
-
容器角色:外层包裹元素需设
role="listbox"(下拉列表)、role="grid"(表格)等,并添加aria-labelledby或aria-label -
焦点管理:用
tabindex="0"使可选项可聚焦;键盘导航(↑↓/Home/End)时,动态移动焦点并同步更新ariaSelected -
实时反馈:对屏幕阅读器,建议配合
aria-live="polite"区域播报“已选择 XXX”,增强确认感
W3C 明确要求:当 aria-selected="true" 时,该元素必须是可聚焦的(tabindex ≥ 0),否则构成可访问性缺陷。










