键盘按键测试

按任意键看它上报的位置、字符和键码,虚拟键盘会跟着亮。还能顺手测同时按键数和长按重复速度。

  • 先把输入法切到英文。中文输入法激活时,按键会被输入法先拿走(这叫 IME 组字),网页收到的 keydown 会少一大半,甚至一个都收不到。测试前请按 Shift 或 Ctrl+Space 切到英文状态,否则会误判成键盘坏了。
  • 笔记本的 Fn 组合键。很多笔记本把 F1 到 F12 的默认行为改成了调节亮度、音量。这时候按 F5 可能只是刷新失败,需要按住 Fn 再按才发出真正的 F5。测试时按不出反应,先试试 Fn 组合。

code 和 key 的区别,以及为什么这件事重要

code 是物理位置,key 是实际产出。code 描述的是「键在键盘上的哪一格」,比如 KeyY 永远指 QWERTY 布局里 Y 那一格,不管系统装的是哪国布局;key 描述的是「这一格在当前布局下产出了什么字符」。所以按同一个物理键,在英文布局下产出 y,在德文布局下会产出 z。这个页面的虚拟键盘按 code 高亮,而「实际产出」那一栏显示 key,把两者并排放在一起,它们的差异一眼就能看出来——这正是键盘布局装错时最典型的现象。

中文输入法会让一大半按键「消失」。输入法激活时,按键会先被输入法接管去做组字,浏览器收到的 keydown 会大幅减少,有些键甚至一个事件都收不到。这会让人误以为键盘坏了。所以测试前一定要按 Shift 或者 Ctrl+Space 把输入法切到英文状态。同理,笔记本上的 Fn 组合键:很多机器把 F1 到 F12 的默认行为改成了亮度、音量调节,要按出真正的 F5 得同时按住 Fn。

「同时按键数」测到的是整条链路的上限。从键盘到网页,中间隔着键盘硬件、USB 轮询、系统驱动、浏览器四层,任何一层先到上限,表现出来都一样。所以按住五个键发现某个键从列表里消失了,只能说明「这条链路在五个键时丢了键」,没法归因到具体是哪一层的限制。薄膜键盘在这个区间最容易冲突,带 N 键无冲设计的键盘会明显更好,但最终还是要看系统的脸色。

长按重复速率由系统决定,跟键盘硬件无关。按住一个键不动,先是延迟一小段时间,然后开始连续触发。这个「首次延迟」和随后的重复频率,完全来自系统设置里的「重复延迟」和「重复速度」,Windows 和 macOS 的默认值差别不小。所以你换一把键盘,这两个数字不会变;想让光标移动得更快,该调的是系统设置,不是买新键盘。

关于卡键和失焦。如果某个键按下后一直亮着不灭,说明它的 keyup 没有被收到。最常见的原因是中途弹出了系统对话框、或者切到了别的窗口,抢走了焦点。这个页面在失去焦点时会自动把所有按键状态清空,避免留下「一直按着」的假象;但如果你看到某个键反复卡住,而键盘在别的程序里正常,那就要怀疑浏览器本身在忙或者有插件在抢事件了。