event.key 返回按键语义值(如"a"、"Enter"),自动处理大小写与布局差异;event.code 返回物理键位标识(如"KeyA"、"ShiftLeft"),用于游戏控制等需位置识别场景。

keydown 事件里用 event.key 获取可读键名
多数现代场景下,event.key 是最直接的选择:它返回按键的语义值,比如按 A 得到 "a",按 Enter 得到 "Enter",按 Shift 得到 "Shift"。它自动处理大小写、修饰键状态和布局差异(如美式键盘 vs 法语 AZERTY),比老式 keyCode 更可靠。
注意点:
-
event.key在keydown和keyup中都可用,但不要在keypress(已废弃)中依赖它 - 组合键单独触发时(如只按
Ctrl),event.key是"Control";若同时按下Ctrl+C,event.key仍是"c"(小写),但event.ctrlKey为true - 某些特殊键(如浏览器快捷键 F5、Alt+D)可能被系统或浏览器拦截,
keydown事件根本不会触发
需要区分物理位置?用 event.code
当你要识别“用户按的是键盘上左数第三个键”,而不是“这个键当前输入什么字符”时,event.code 才是答案。它返回物理按键的标识符,例如无论 CapsLock 是否开启,按主键盘区的 A 键都返回 "KeyA";按左侧 Shift 返回 "ShiftLeft",右侧则返回 "ShiftRight"。
典型用途:
- 游戏控制(WASD 或方向键绑定不随输入法/布局变化)
- 快捷键配置界面,需显示“按哪个位置的键”而非“输什么字符”
- 调试键盘硬件映射问题
⚠️ 注意:event.code 不反映当前字符输出,比如在俄语输入法下按 A 键(实际输出“ф”),event.code 还是 "KeyA",但 event.key 是 "ф"。
兼容旧浏览器?避免 keyCode 和 charCode
keyCode 和 charCode 已被标准弃用,Chrome 51+、Firefox 67+ 等新版浏览器虽仍支持,但会发警告,且行为不一致(比如 keyCode 对 Enter 返回 13,对 ArrowUp 返回 38,但对 Meta 键返回 91 —— 这些数字没文档、难记忆、跨浏览器有偏差)。
如果真要兼容 IE11 或极老环境:
- 优先检测
event.key,存在就用 - 回退到
event.code(IE11 不支持,但 Edge 12+ 支持) - 最后才用
event.keyCode,并手动建一个最小映射表(如{13: "Enter", 27: "Escape", 32: " "}),别试图覆盖全部
监听时机选 keydown 还是 keyup?
绝大多数交互逻辑应绑定在 keydown:它在按键按下瞬间触发,响应及时;而 keyup 要等松开才触发,对长按重复输入、组合键判断都不友好。
但有两个例外必须用 keyup:
- 检测“按键是否已释放”,比如实现“按住空格跳跃,松开落地”的游戏逻辑
- 过滤粘滞键(Sticky Keys)或辅助功能导致的异常重复触发 ——
keydown可能因系统设置连续触发,keyup更稳定
另外,别忘了加 preventDefault():比如阻止 Tab 切换焦点、Space 滚动页面,否则自定义行为会被干扰。
物理键位和字符语义的分离是现代键盘事件的核心设计,混淆二者是大多数键值误判的根源。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











