【发布时间】:2020-07-01 18:50:41
【问题描述】:
考虑以下最小设置:
function keyDown(event, element) {
console.log("Down: " + event.code);
}
function keyUp(event, element) {
console.log("Up: " + event.code);
}
<input
type="text"
onkeyup="keyUp(event, this)"
onkeydown="keyDown(event, this)"
/>
现在,当输入字段处于活动状态时,控制台将在每次按下键和每次释放键时显示一条消息,以及相关键的键码。
按下和释放一个键将产生两条消息:
Down: KeyA
Up: KeyA
按住一个键,然后按住另一个键,然后松开第一个键,然后松开第二个键将产生 4 条消息:
Down: KeyA
Down: KeyB
Up: KeyA
Up: KeyB
这符合预期。
现在,就上下文而言,“Shift”键实际上有两个键码,ShiftRight 和 ShiftLeft,分别用于区分大多数键盘上的左右 Shift 键。现在是有趣的部分:
重复与之前相同的双键模式,这次只是使用两个 shift 键,结果如下:
Down: ShiftRight
Down: ShiftLeft
Up: ShiftLeft
即使我在释放左移键之前释放了右移键,也从来没有为它触发过 keyUp 事件。如果我从ShiftLeft开始,反之亦然:
Down: ShiftLeft
Down: ShiftRight
Up: ShiftRight
一开始我以为这可能就是那些在键盘上有多个版本的特殊按钮的处理方式,但似乎没有那么简单。例如,ControlLeft 和 ControlRight 的行为方式与任何其他按钮相同。另一方面,Enter 和 NumpadEnter 的行为方式与两个班次的行为方式相同,每次都省略一个 keyUp-event。
这种行为的原因是什么?有没有办法关闭它?
【问题讨论】:
-
"有没有办法关闭它?" - 你能解释一下你到底想要做什么吗?我认为这个问题很好,但似乎是一个 XY 问题。
-
@chazsolo 我基本上只是在寻找一种单独处理每个键的方法,并确保触发 keyDown 事件的每个按下的键最终也会在释放时触发 keyUp 事件。这不是我现在正在编写的代码遇到的直接问题,我只是注意到了这种行为,并希望消除潜在的边缘情况。
标签: javascript html events keycode