You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按住SHIFT时按键释放未被正确检测的技术问题求助

键盘按键检测数组移除异常问题修复

问题现象

实现按住按键按顺序存入数组、松开时从数组移除的功能时,出现以下异常:

  • 按住"w"后按下SHIFT,保持SHIFT按住状态下松开"w",数组中的"w"并未被移除。

问题原因

当SHIFT处于按住状态时,松开"w"触发的keyup事件中,event.key的值会变为大写的"W",而数组中存储的是小写的"w"。由于indexOf()是严格匹配,无法找到对应元素,导致无法执行移除操作。

解决方案

在处理keydown和keyup事件时,统一将event.key转为小写(或大写),确保按键的存储和移除逻辑使用一致的格式。

修复后的完整代码

JavaScript

let keysPressed = [];

document.addEventListener('keydown', (event) => {
  const key = event.key.toLowerCase(); // 统一转为小写
  if (!keysPressed.includes(key)) {
    keysPressed.push(key)
  }
});

document.addEventListener('keyup', (event) => {
  const key = event.key.toLowerCase(); // 统一转为小写
  const keyIndex = keysPressed.indexOf(key);
  if (keyIndex !== -1) {
    keysPressed.splice(keyIndex, 1)
  }
});

function update() {
  if (keysPressed.length > 0) {
    document.getElementById('status').innerHTML = `Pressed keys: ${keysPressed.join(', ')}<br>Last pressed key: ${keysPressed[keysPressed.length - 1]}`;
  } else {
    document.getElementById('status').textContent = 'No keys pressed'
  }
  requestAnimationFrame(update)
}

requestAnimationFrame(update)

CSS

body { 
  font-family: Arial, sans-serif; 
}

.status { 
  font-size: 1.5em; 
  color: green; 
}

HTML

<body>
  <h2>Hold a key pressed</h2>
  <p class="status" id="status">No key pressed</p>
</body>

补充说明

如果需要区分大小写按键(比如大写W和小写w),可以改用event.code代替event.key。event.code会返回按键的物理编码(比如KeyW),不受修饰键影响,能更精准地匹配物理按键。示例如下:

document.addEventListener('keydown', (event) => {
  const key = event.code;
  if (!keysPressed.includes(key)) {
    keysPressed.push(key)
  }
});

document.addEventListener('keyup', (event) => {
  const key = event.code;
  const keyIndex = keysPressed.indexOf(key);
  if (keyIndex !== -1) {
    keysPressed.splice(keyIndex, 1)
  }
});

内容的提问来源于stack exchange,提问作者Sleep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 17:03:15