键盘事件
2025年1月10日大约 2 分钟
keydown/keyup
当按键被按下时,触发
keydown事件当按键被释放时,触发
keyup事件
event.code/event.key
事件对象的
key属性允许获取字符,而事件对象的code属性则允许获取物理按键代码
| Key | event.key(随位置改变) | event.code(保持不变) | 
|---|---|---|
| Z | z(小写) | KeyZ | 
| Shift+Z | Z(大写) | KeyZ | 
自动重复
如果按下一个键足够长的时间,它就会开始“自动重复”:
keydown会被一次又一次地触发当按键被释放时,最终会得到
keyup。因此,有很多keydown却只有一个keyup是很正常的对于由自动重复触发的事件,
event对象的event.repeat属性被设置为true
默认行为
阻止对
keydown的默认行为可以取消大多数的行为,但基于系统的特殊按键除外,例如系统快捷键等
出现在屏幕上的一个字符
一个字符被删除(Delete 键)。
滚动页面(PageDown 键)。
浏览器打开“保存页面”对话框(Ctrl+S)
...等
其他
- 过去有一个 
keypress事件,还有事件对象的keyCode、charCode和which属性,大多数浏览器对它们都存在兼容性问题,以致使该规范的开发者不得不弃用它们并创建新的现代的事件 - 键盘逻辑并不能保证适用于移动端设备
 
例子
输入控制
允许数字、某些特殊字符、左右方向键、删除
<script>
function checkPhoneKey(key) {
  return (key >= '0' && key <= '9') ||
    ['+','(',')','-','ArrowLeft','ArrowRight','Delete','Backspace'].includes(key);
}
</script>
<input onkeydown="return checkPhoneKey(event.key)" placeholder="Phone, please" type="tel">同时按下Q和W按键时触发
<!DOCTYPE HTML>
<html>
<body>
  <script>
    function runOnKeys(func, ...codes) {
      let pressed = new Set();
      document.addEventListener('keydown', function(event) {
        pressed.add(event.code);
        for (let code of codes) { // 所有的按键都在集合中?
          if (!pressed.has(code)) {
            return;
          }
        }
        
        // 在 alert 期间,如果访客松开了按键,
        // JavaScript 就不会获得 "keyup" 事件
        // 那么集合 pressed 会保持假设这些按键是被按下的状态
        // 为避免“粘滞”键,对状态进行了重置
        // 如果用户想再次运行热键 —— 他们需要再次按下所有键
        pressed.clear();
        func();
      });
      document.addEventListener('keyup', function(event) {
        pressed.delete(event.code);
      });
    }
    runOnKeys(
      () => alert("Hello!"),
      "KeyQ",
      "KeyW"
    );
  </script>
</body>
</html>