JavaScript 按键事件检测:keyCode 与 charCode 详解

作者:竹影时间:2026-10-24 15:00:34浏览:469

本文深入解析 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


image

 

charCode

image 因此,在 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)

作者最新文章