键码查询 - 按键 key/code/keyCode 在线查看
key、code、keyCode 三个字段该用哪个?+写新代码一律用 key 或 code,keyCode 已经废弃。key 是"按出来的字符",受布局、输入法、Shift 影响——按 Shift+2 得到的是 "@" 而不是 "2"。code 是"按下了键盘上哪个物理位置",和布局无关,AZERTY 键盘上左上角那个键永远是 KeyQ。判断快捷键用 key(用户想按的是那个字符),做游戏 WASD 控制用 code(要的是那四个位置,法语键盘上是 ZQSD 也照样能玩)。
keyCode 废弃了,为什么还显示?+因为老代码里还有一大堆。keyCode 在规范里标记为 deprecated,浏览器出于兼容不会删,但它的值在不同浏览器、不同布局下并不一致(尤其是符号键),新代码不该再用。工具照样显示它,是为了让你读懂 e.keyCode === 13 这种老判断,以及做迁移时能对照——不是推荐你用。
为什么按 Ctrl / ⌘ 组合键没被拦截?+刻意放行的。捕获区聚焦时会 preventDefault() 掉默认行为,否则按 Tab 会跳走焦点、按空格会滚页、按 / 会触发浏览器的页内查找。但 Ctrl / ⌘ 开头的组合一律不拦:拦掉 Cmd+R、Ctrl+W、Ctrl+T 会让人以为浏览器坏了,代价远大于收益。单独按下 Ctrl 或 ⌘ 本身仍然会被记录。按 Esc 可以退出捕获。
为什么有些键按了没反应,或者 key 显示 "Unidentified"?+常见三种原因:① 被操作系统或浏览器吃掉了——F11 全屏、Cmd+Tab 切应用、部分厂商的媒体键,网页根本收不到事件;② 输入法在中间,中文输入法组字期间的按键会走 composition 事件,key 可能是 "Process";③ 键盘固件上报的是非标准扫描码,浏览器映射不出来就给 Unidentified,多见于带宏的机械键盘和部分笔记本的功能键。
长按不放为什么记录里只出现一次?+因为自动重复的按键被排除在历史之外。按住不放时浏览器会持续派发 keydown,event.repeat 为 true。上方的实时结果照常更新(repeat 标记会亮起来,方便你确认这个字段),但历史列表只记第一次——否则按住一秒就把八条记录全刷成同一个键。
对照表里的 code 和我的键盘对不上?+表里按 US QWERTY 布局给出,这也是 code 的定义基准:它描述的是物理位置,不是键帽上印的字符。所以 AZERTY 键盘按左上角第一个字母键,code 仍然是 KeyQ,而 key 会是 "a"。修饰键统一列了左键(ShiftLeft、ControlLeft、AltLeft、MetaLeft),右边那颗把 Left 换成 Right 即可,可以自己按一下验证。