aria-keyshortcuts仅声明快捷键语义,需配合keydown监听、preventdefault及视觉提示构成闭环;仅对可聚焦元素有效,键名须严格遵循w3c规范。

aria-keyshortcuts 不是快捷键执行开关,它只负责“告诉屏幕阅读器这个按钮支持什么组合键”,按下去没反应是正常的——你必须自己写 keydown 监听逻辑,否则就是一张贴在墙上的说明书。
必须用在可聚焦的交互元素上
它对 <div>、<code><span></span> 或纯文本节点完全无效。只有以下两类能起作用:
-
<button></button>、<input>、<textarea></textarea>这类原生可聚焦元素 - 带
role="button"、role="menuitem"或role="tab"的元素,且必须显式加tabindex="0"
错误示例:<div aria-keyshortcuts="Ctrl+S">保存</div> —— 屏幕阅读器会读出“Ctrl+S”,但用户按了没焦点、没响应,语义和行为彻底脱节。
键名必须严格符合 W3C Key Names 规范
大小写敏感,修饰键与主键之间只能用 + 连接,空格、逗号、中文符号、别名(如 Cmd)都会导致辅助技术不识别或解析失败。
- ✅ 正确:
aria-keyshortcuts="Ctrl+S"、aria-keyshortcuts="Alt+F4"、aria-keyshortcuts="Escape"(不是Esc)、aria-keyshortcuts="Meta+Shift+T"(Mac 用Meta,不用Cmd) - ❌ 错误:
aria-keyshortcuts="ctrl+s"(小写)、aria-keyshortcuts="Ctrl S"(空格)、aria-keyshortcuts="Cmd+S"(Cmd非标准)、aria-keyshortcuts="Ctrl+Shift+T"写成"Ctrl Shift T"
必须配 keydown 监听 + e.preventDefault()
写了 aria-keyshortcuts="Ctrl+S" 后,用户按 Ctrl+S 仍会触发浏览器默认保存页面行为——除非你主动拦截。
- 监听目标建议放在按钮自身(更安全),或
document(需判断e.target是否为该按钮) - 检测逻辑要严格:
e.ctrlKey && e.key === 's'(注意s小写,key值非keyCode) - 务必调用
e.preventDefault(),否则 Ctrl+S 会弹出浏览器保存对话框 - 如果按钮在
<input>或<textarea></textarea>内获得焦点,通常应禁用快捷键(避免干扰输入)
示例片段:<button aria-keyshortcuts="Ctrl+S">保存</button> + JS 中监听并执行保存函数。
视觉提示必须同步提供,不能只靠 aria-keyshortcuts
仅写属性, sighted 键盘用户根本看不到快捷键存在;屏幕阅读器用户换设备也可能漏掉。可靠做法:
- 按钮文字中嵌入
<kbd>Ctrl</kbd> + <kbd>S</kbd>(不能写成<kbd>Ctrl+S</kbd>,否则屏幕阅读器读作 “C-T-R-L-plus-S”) -
<kbd></kbd>内容必须属于无障碍名称的一部分(不要只靠title,因部分浏览器仅鼠标悬停才显示) - 若需区分平台,可用
<kbd>Cmd</kbd> / <kbd>Ctrl</kbd> + <kbd>S</kbd>,斜杠分隔,不嵌套
真正容易被忽略的是:键盘快捷键不是“加个属性就完事”,它是语义声明(aria-keyshortcuts)、视觉提示(<kbd></kbd>)、行为实现(keydown + preventDefault)三者缺一不可的闭环。少任何一环,对某类用户就是不可用的。











