使用“SHIFT”时停止检测按键的问题

问题描述 投票:0回答:1

我正在做测试来检测键盘按键,我想到将其保存在一个数组中,并按照按下的顺序添加按键。例如,如果保留“w”和“a”,则数组将为[“w”,“a”]。当您按住“w”然后按住“SHIFT”时会出现问题。当您停止按住“w”时,该键不会从数组中删除。

注意:要复制问题,请先按住“w”,然后按住“SHIFT”。然后按住“SHIFT”的同时释放“w”。

let keysPressed = [];

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

document.addEventListener('keyup', (event) => {
  const keyIndex = keysPressed.indexOf(event.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)
body { 
  font-family: Arial, sans-serif; 
}

.status { 
  font-size: 1.5em; 
  color: green; 
}
<body>
  <h2>Hold a key pressed</h2>
  <p class="status" id="status">No key pressed</p>
</body>

javascript keydown requestanimationframe keyup
1个回答
0
投票

是的。您按下“w”并释放“W”。

如果您想透明地移动,请同时删除“w”。

如果你想在按键级别而不是字符串级别进行交互,也就是说,只需注册任何按下的键(无论按下时的修饰符是什么),然后取消注册任何键(无论释放时的修饰符是什么),然后你应该关注键码,而不是按键。

或者你可以两者都做。如果您想为显示的按键指定一个“字符串”名称,同时能够将释放与先前的按下相匹配,则应保留

key
用于显示,
keycode
用于注册。这可能是最好的做法(而不是使用
lower
upper
,只有当修饰符的先入之见恰好为真时,这才有效。毕竟,用户可以映射“Shift+W”关于“Q”。更不用说其他修饰符了)。

let keysPressed = [];
let keysCodes = [];

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

document.addEventListener('keyup', (event) => {
  const keyIndex = keysCodes.indexOf(event.keyCode);
  if (keyIndex !== -1) {
    keysPressed.splice(keyIndex, 1);
    keysCodes.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)
body { 
  font-family: Arial, sans-serif; 
}

.status { 
  font-size: 1.5em; 
  color: green; 
}
<body>
  <h2>Hold a key pressed</h2>
  <p class="status" id="status">No key pressed</p>
</body>

© www.soinside.com 2019 - 2024. All rights reserved.