JavaScript 按键事件检测:keyCode 与 charCode 详解
本文深入解析 JavaScript 中检测按键事件的 keyCode 与 charCode 属性。重点阐述两者在区分物理按键与字符编码上的差异,并详细对比 IE、Opera、Safari 等浏览器在 keypress、keydown 和 keyup 事件中的行为差异,提供跨平台(Windows/Mac)及特殊功能键的检测策略与兼容方案。
关于按键事件,目前尚缺乏统一的标准。根据规范说明,涉及键盘等输入设备的事件模型将在未来的 DOM 规范中进行详细解释。
回顾浏览器早期设计,由于缺乏统一标准,各厂商如同进行实验般开发,虽然最终产品具备实用价值,却不可避免地导致了兼容性问题。按键检测亦不例外:尽管存在两个用于检测用户按下键的属性,且各有其存在的理由,但并非所有浏览器都完全支持这些属性。
此外,在 keypress 与 keydown、keyup 事件之间,还存在一些重要的区别需要注意。
最后需考虑 Windows 与 Mac 系统的差异。在 Mac 系统下检测用户按下的键,其难度远高于 Windows 系统。
keyCode 和 charCode
用于检测用户按下键的两个关键属性是 keyCode 和 charCode。简而言之,keyCode 用于检测用户实际按下的物理键盘按键,而 charCode 则返回键入字符的 ASCII 码。需要注意的细节包括:大写字母 A 和小写字母 a 的 keyCode 是相同的,因为它们在物理键盘上是同一个键;但它们的 charCode 不同,因为代表两个不同的字符。
IE 和 Opera 浏览器不支持 charCode 属性。然而,在 onkeypress 事件触发时,它们会将字符信息保存在 keyCode 中;而在 onkeydown/up 事件中,keyCode 包含的是键位信息。
字符和数字键
让我们通过一个简单的例子开始。小写 a 的 ASCII 码是 97,大写 A 是 65。那么,当用户在键盘上按下相同的物理键时,何时得到的键值是 65(对应大写 A)呢?
keyCode

charCode
因此,在 onkeydown/up 事件中,你可以从 keyCode 中获取键值。而在 onkeypress 事件中,若要获取字符值,应使用:evt.charCode || evt.keyCode。
标点符号
我决定不对标点符号键进行详细测试。我怀疑这不仅与浏览器和操作系统有关,还可能受键盘布局设置和默认语言的影响。我通常使用荷兰语版 Windows,如果与美国版 101 键键盘的结果有巨大出入,我也不会感到意外。
例如,Shift+, 键输出的应该是 <,但我测试得到的 ASCII 码结果却是 '?'。发现这一问题后,我决定不再在标点符号键的问题上浪费时间。
特别键
功能键是指那些不可打印但具有特定功能的键,如 Shift、Esc、Enter 等。
一些说明:
1. 一般来说,Mac 系统的检测可靠性低于 Windows,某些键可能无法被检测到。
2. IE 浏览器不会触发以下按键的 keypress 事件:delete, end, enter, escape, 功能键, home, insert, pageUp/Down 和 tab。
3. 在 onkeypress 事件中,Safari 会对以下按键给出异常的 keyCode 值:delete, end, 功能键, home 和 pageUp/Down。但在 onkeydown/up 事件中则表现正常。
4. 在 Mac 上,Alt、Cmd、Ctrl 和 Shift 键无法通过常规方式探测,但 Opera 浏览器是例外。不过,你可以使用 altKey、ctrlKey、shiftKey 这些属性来检测。
如果你需要探测这些特殊键,建议在 onkeydown/up 事件中直接探测 keyCode,这样可以省去处理 onkeypress 和 charCode 的麻烦。
原文后面附有一个详细的键值列表以及测试框,感兴趣的读者可以访问查看。
翻译地址:http://www.quirksmode.org/js/keys.html
转载请保留以下信息
作者:北玉(tw:@rehawk)
网页开发三者分工:HTML结构、CSS样式与JavaScript交互怎么协作
2026-11-05 12:51:22
JS解析URL参数时怎么处理中文乱码和特殊字符
2026-11-05 12:47:23
js-cookie 存储 JSON 对象:自动序列化与反序列化技巧
2026-11-05 12:36:26
marked.js 快速上手:安装与基础 Markdown 转 HTML 示例
2026-11-05 09:32:53
Phaser.js 与 PixiJS、Cocos Creator 的技术选型对比
2026-11-05 08:36:30
