| 按键 | keyCode | code | key | 分类 |
|---|
在浏览器中处理键盘输入时,事件对象上有三个属性经常被混用,理解它们的区别是写好键盘交互的前提:
| 属性 | 含义 | 示例值 | 特点 |
|---|---|---|---|
key | 按键的字符值 | "a"、"Enter"、"中" | 受输入法与 Shift 影响,推荐优先使用 |
code | 按键的物理位置 | "KeyA"、"Enter"、"Numpad1" | 与键盘布局无关,适合做游戏控制 |
keyCode | 已废弃的数字编码 | 65、13、97 | 各浏览器实现不一致,仅为兼容而保留 |
本表收录了 152 个按键的完整映射关系,涵盖字母键、数字键、符号键、功能键、编辑控制键、小键盘、多媒体键等 12 个类别。
key 和 code 要分开假设用户在中文输入法下按了字母 A 键:
e.key 可能是 "a"(英文状态)或 "Process"(输入法正在组字);e.code 始终是 "KeyA"。再假设用户用的是 AZERTY 键盘(法国布局),左上角第一个字母键物理位置和 QWERTY 的 Q 相同:
e.code 是 "KeyQ";e.key 是 "a"。结论:需要判断「按了哪个功能」时用 key,需要判断「按了哪个物理键位」时用 code。做 WASD 移动时用 code 才能保证不同键盘布局下手感一致。
keyCode 属于早期的 DOM 事件规范,从未被标准化,且存在明显的跨浏览器差异:
keydown 里返回大写字母的码值(A = 65),keypress 里返回小写(a = 97);因此新项目不应再依赖 keyCode。本表保留它,主要是为了读懂历史代码、兼容旧系统,以及在排障时对照现象。
表中有几个按键的 keyCode 显示为「无」,这是正常现象。这类按键大多是后期新增的:
| 按键 | code | 说明 |
|---|---|---|
| 睡眠 / 唤醒 / 电源 | Sleep / WakeUp / Power | ACPI 电源管理键,由操作系统接管 |
| 亮度减小 / 增大 | BrightnessDown / BrightnessUp | 笔记本功能键,常被厂商驱动拦截 |
| Compose | Compose | Linux 下的组合键,Windows 无对应实现 |
遇到这些键时,应该改用 e.code 或 e.key 判断。
F5、13、ArrowUp;key、code、keyCode 与修饰键状态——这是排查键盘问题最直接的方法。判断是否按下了修饰键组合:不要用 e.key === 'Control' 判断,应该读 e.ctrlKey、e.shiftKey、e.altKey、e.metaKey 这四个布尔值。
阻止默认行为要小心:e.preventDefault() 会连带阻止浏览器的快捷键,例如在 keydown 中无条件阻止 Ctrl 组合键,会让用户无法使用 Ctrl+C 复制。
注意输入法的 composition 阶段:在中文、日文输入法组字过程中,keydown 会被触发但 e.key 为 "Process"。需要配合 compositionstart 与 compositionend 事件判断,否则会出现「打字过程中误触发快捷键」的问题。
数据可以直接用在生产代码里吗?
表里的按键是怎么分类的?
preventDefault 会有什么副作用?
中文输入法下按键事件有什么特殊之处?
页面上的按键检测器怎么用?
小键盘数字键和主键盘数字键的码值一样吗?
怎么判断用户是否按下了 Ctrl 组合键?
同一按键在 keydown 和 keypress 中的 keyCode 不同,正常吗?
为什么有些按键的 keyCode 显示为「无」?
为什么做游戏控制要用 code 而不是 key?
keyCode 已经被废弃了吗?
key、code、keyCode 有什么区别?