键盘按键码相关工具合集

按键码工具合集:区分 keyCode、which 与 code 三套取值体系,说明 keydown 与 keypress 的触发差异、组合键的判定顺序,以及 event.key 与 event.code 各自的适用场景与输入法兼容问题,附按键查询与文本处理工具入口。适合处理快捷键绑定、输入框与国际化键盘布局问题。

键盘事件的取值体系有三套,混用会导致快捷键在不同语言布局下失效。

常见方案对照

维度event.keyevent.code
含义按下的键(语义)按键的物理位置
受键盘布局影响是否
受输入法影响是否
举例(Ctrl+Z)随语言变化恒为 "KeyZ"
适用场景显示、文本处理快捷键、游戏控制、表单
死键与组合字符可能异常稳定
数字键与小键盘无法区分能区分(Numpad1 与 Digit1)
浏览器支持全部现代浏览器全部现代浏览器

边界条件

  • 输入法合成期间(isComposing 为 true)不逐字符触发 keydown,这是 IME 的设计而非缺陷。
  • event.key 的值受操作系统键盘布局影响,同一物理键在不同语言下返回不同字符。
  • 小键盘数字与主键盘数字在 key 下无法区分,code 可以(Numpad1 与 Digit1)。
  • event.keyCode 与 which 已废弃,不要在新代码里使用。

常见坑

  • 用 key 做快捷键,在非英语布局(如德语、法语)上快捷键失效。
  • 在 keydown 里读取输入内容,永远拿到上一次的值。
  • 输入法组合输入(如拼音打字)时逐字符拦截 keydown,打断了候选词上屏。
  • 用已废弃的 keyCode 做比较,浏览器未来版本可能不再支持。

相关工具

常见问题

event.key 和 event.code 该用哪个?

**看你要的是「哪个键」还是「哪个位置」。** event.key 是**语义**取值,表示按下的键是什么(受布局与输入法影响,Ctrl+Z 可能返回 "z" 或日文字符);event.code 是**物理**取值,表示键盘上哪个位置被按(恒为 "KeyZ",与布局无关)。做快捷键、输入框、游戏控制用 code;做显示、文本处理用 key。**表单与快捷键优先用 code**,因为它不受输入法与布局影响。

为什么 keydown 里读不到输入的字符?

因为 keydown 在按键**物理按下**时触发,此时字符还没进入输入框。要读字符应直接读 input 的 value,或用已废弃但仍可用的 keypress。现代做法是:用 keydown 处理快捷键(Ctrl/Cmd 组合),用 input 事件处理文本输入,两者不要混用。此外 IME 输入法合成期间 keydown 只触发一次而不逐字符触发,这是输入法场景的另一个坑。