不喜欢广告? 无广告 今天

JavaScript 键盘事件一团糟——这里是你会收藏的键盘码参考

更新于

四个属性,其中三个已弃用,完全没有一致性。这是过滤掉噪音的JavaScript键盘事件参考文档——涵盖了event.key、event.code、keyCode以及常见键值的完整表格。

JavaScript按键事件一团糟——这是你一定会收藏的按键码参考1
广告 移除?

在你的JavaScript职业生涯中,某一天你决定处理一个按键事件。这听起来很简单。你打开MDN,却发现有四个不同的属性可供选择: keyCode, which, key,并且 code其中三个已经被弃用。它们对“键”的定义并不一致。恭喜你——你已经来到了网络世界中最混乱的历史角落之一。

本指南将消除噪音。你将了解到哪些属性应该使用,哪些应该避免,并获得一个完整的常见键值表,从而避免盲目猜测。

四个属性——以及为何有四个

JavaScript键盘事件在事件对象上暴露了多个属性。以下是每个属性的实际含义:

财产返回的内容地位
event.key一个可读的字符串,例如 "Enter", "ArrowUp", 或者 "a"✅ 建议使用此属性
event.code物理按键标识符,例如 "KeyA", "Digit1", "ArrowLeft"✅ 建议用于布局无关的检测
event.keyCode一个数值代码,例如 13 用于回车键⚠️ 已弃用——在新代码中避免使用
event.whichkeyCode⚠️ 已弃用——在新代码中避免使用

keyCodewhich 本质上是不同浏览器历史时期的同一事物。两者都返回一个表示键的整数。两者均已弃用。两者在所有浏览器中仍然有效,这就是为什么你在2015年之前的旧代码库中会频繁遇到它们的原因。

为什么 keyCode 已弃用但仍普遍存在

keyCode 是浏览器DOM中检测按键的最初方式,可追溯到Netscape早期的事件模型。它在大多数情况下是有效的,但存在严重不一致性:同一按键在不同浏览器中可能返回不同的代码,大写字符处理不一致,非ASCII字符则一团糟。

W3C在DOM Level 3 Events规范(2016年)中正式弃用了 keyCodewhich ,转而推荐使用 keycode。但弃用意味着“我们建议你停止使用”,而不是“我们将破坏你的网站”。浏览器仍然支持它,而且短期内很可能仍会支持。

结果是,旧代码库中充斥着 event.keyCode === 13 检查,2012年的Stack Overflow答案推荐使用它,你几乎在所有生产代码中都能找到它。它不会很快消失——你只是不应该 编写 新的使用它的代码。

event.key vs event.code ——你需要哪一个?

这是大多数人困惑的地方。两者都是现代的,且都是正确的——它们只是回答了不同的问题。

  • 使用 event.key 当你关心用户想要输入的字符时。在美式键盘上,按下Shift + 2会得到 event.key === "@"。在德式键盘上,同一个物理按键会生成不同的字符。 event.key 反映了实际的逻辑输出。
  • 使用 event.code 当你关心按下的是哪个物理按键,而不考虑键盘布局时。这在游戏控制、不随用户语言变化的快捷键或“Q键”指的是左上角字母键而非字符Q的场景中非常有用。

对于大多数实际应用场景——表单提交、对话框关闭、快捷键—— event.key 是你要选择的。对于游戏控制和基于位置的快捷键,应使用 event.code.

在现代JavaScript中正确处理按键

以下是处理常见情况的正确方法:

回车键(表单提交、确认对话框)

document.addEventListener('keydown', (e) => {
  if (e.key === 'Enter') {
    // handle Enter
  }
});

Esc键(关闭模态框、取消操作)

document.addEventListener('keydown', (e) => {
  if (e.key === 'Escape') {
    closeModal();
  }
});

方向键(导航、滑块、游戏控制)

document.addEventListener('keydown', (e) => {
  switch (e.key) {
    case 'ArrowUp':    moveUp();    break;
    case 'ArrowDown':  moveDown();  break;
    case 'ArrowLeft':  moveLeft();  break;
    case 'ArrowRight': moveRight(); break;
  }
});

修饰键(Ctrl+S,Cmd+K等)

document.addEventListener('keydown', (e) => {
  if ((e.ctrlKey || e.metaKey) && e.key === 's') {
    e.preventDefault();
    saveDocument();
  }
});

使用 e.ctrlKey, e.shiftKey, e.altKey,并且 e.metaKey (Mac上的Cmd) 用于检测修饰键组合。这些属性未被弃用,且行为完全符合预期。

完整的按键参考表

下表列出了你最常使用的按键。对于未列出的按键,使用 按键码信息工具 ——按任意按键即可立即获取 event.key, event.code,以及旧版 keyCode 值。

钥匙event.keyevent.codekeyCode(旧版)
隆重推出"Enter""Enter"13
Escape"Escape""Escape"27
空间" " (空格)"Space"32
标签"Tab""Tab"9
退格键"Backspace""Backspace"8
删除键"Delete""Delete"46
向上箭头"ArrowUp""ArrowUp"38
向下箭头"ArrowDown""ArrowDown"40
向左箭头"ArrowLeft""ArrowLeft"37
向右箭头"ArrowRight""ArrowRight"39
"Home""Home"36
结束"End""End"35
页面向上"PageUp""PageUp"33
页面向下"PageDown""PageDown"34
F1"F1""F1"112
F2"F2""F2"113
F3"F3""F3"114
F4"F4""F4"115
F5"F5""F5"116
F6"F6""F6"117
F7"F7""F7"118
F8"F8""F8"119
F9"F9""F9"120
F10"F10""F10"121
F11"F11""F11"122
F12"F12""F12"123
Shift(左)"Shift""ShiftLeft"16
Ctrl(左)"Control""ControlLeft"17
Alt(左)"Alt""AltLeft"18
Cmd / Win"Meta""MetaLeft"91
大写锁定键"CapsLock""CapsLock"20
a–z(小写)"a"-"z""KeyA"-"KeyZ"65–90
0–9(顶部行)"0"-"9""Digit0"-"Digit9"48–57
0–9(数字小键盘)"0"-"9""Numpad0"-"Numpad9"96–105

你记不住的按键码?立即查找

没有参考表涵盖所有键盘布局下的每一个按键。当你需要某个按键(如数字小键盘键、媒体键、区域性字符)的确切值时,最快的方法是按下该键并查看。

按键码信息工具 正好做到了这一点。按下任意按键,它会立即显示你按下的按键 event.key, event.code, event.keyCode,并且 event.which ——以及修饰键状态。无需从MDN复制粘贴,无需猜测“NumpadEnter”实际叫什么。

简明版

  • 使用 event.key 对于大多数键盘处理场景——它可读性强、现代且支持区域设置。
  • 使用 event.code 当物理按键位置比字符更重要时(如游戏控制、基于位置的快捷键)。
  • 停止编写使用 event.keyCodeevent.which的新代码。它们虽然有效,但已被弃用且可预测性较差。
  • 当你遇到使用 keyCode === 13的旧代码时,这意味着回车键。 keyCode === 27 表示Esc键。上表列出了其余内容。
  • 对于无法在任何参考表中找到的按键,直接在 按键码信息工具 上按下即可立即获得答案。
想要享受无广告的体验吗? 立即无广告

安装我们的扩展

将 IO 工具添加到您最喜欢的浏览器,以便即时访问和更快地搜索

添加 Chrome 扩展程序 添加 边缘延伸 添加 Firefox 扩展 添加 Opera 扩展

记分板已到达!

记分板 是一种有趣的跟踪您游戏的方式,所有数据都存储在您的浏览器中。更多功能即将推出!

广告 移除?
广告 移除?
广告 移除?

新闻角 包含技术亮点

参与其中

帮助我们继续提供有价值的免费工具

给我买杯咖啡
广告 移除?