keydown在按键按下时立即触发(长按重复),keyup仅在松开时触发一次;keydown不区分大小写,keyup的key值受shift状态影响;获取物理键应使用event.code而非已废弃的keycode或which。

keydown 和 keyup 事件的基本行为差异
两者都监听键盘动作,但触发时机不同:keydown 在按键被按下时立即触发(长按会重复触发),keyup 只在按键松开时触发一次。注意:keydown 不区分大小写判断(比如按 Shift+a 和 a 都可能返回 key: "a"),而 keyup 的 key 值通常与当前 Shift 状态一致。
如何准确获取按下的物理键(不依赖输入法/大小写)
用 event.code 而不是 event.key。前者表示键盘上那个物理位置的键(如 "KeyA"、"Digit1"、"Escape"),后者表示实际输入的字符(受 CapsLock、Shift、输入法影响)。长按 Tab 时,key 可能是 "Tab",但 code 始终是 "Tab"。
常见误用:event.keyCode 和 event.which 已废弃,不要用。
监听组合键(如 Ctrl+S)的正确写法
必须同时检查修饰键状态和目标键,不能只靠 key 或 code 字符串匹配。例如保存操作:
document.addEventListener('keydown', (e) => {
if (e.ctrlKey && e.code === 'KeyS') {
e.preventDefault(); // 阻止浏览器默认保存行为
console.log('Ctrl+S 捕获');
}
});
-
e.ctrlKey判断 Ctrl 是否按下(Mac 下对应e.metaKey,需兼容) - 用
===严格比较code,避免"s"和"S"混淆 - 务必调用
e.preventDefault(),否则浏览器可能执行默认行为(如刷新、保存、前进) - 不要在
keyup中判断组合键——松开 Ctrl 和 S 的顺序不确定,容易漏判
为什么监听 document 而不是 input 元素?
如果只给某个 <input> 绑定事件,焦点不在它上面时就收不到事件。全局快捷键必须绑定到 document 或 window。但要注意:当焦点在可编辑元素(如 contenteditable、textarea)内时,某些组合键(如 Ctrl+Z)会被原生行为拦截,keydown 可能根本不会触发——这是浏览器限制,无法绕过。
一个易忽略的点:移动端没有传统键盘事件,keydown/keyup 在 iOS/Android 的软键盘上基本无效,别指望它们响应虚拟键盘输入。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











