情境:我有一个keydown
处理程序,其中switch
代表按下了什么键,相当标准的东西,但当按下任何键时{{1} } event重复触发(而不是仅在实际按下键时触发一次)。
为什么会出现问题:我想让keydown
侦听器保持活动状态,即能够同时检测到多个键被按下,但每次只触发一次事件keydown
。我希望keydown
根据向下和向上之间的时间对keyup
执行某些操作,但由于多次点击,时间会变得紧张。
我尝试了什么:我目前正在保留一份keyCode
列表,这些列表已关闭,并检查keyCodes
处理程序中的那些以保持默认行为如果keydown
在我的列表中,则会发生。然而,事件仍然经常发生,我担心这个解决方案的效率/优雅。
实际问题:当物理按下键时,是否有一种方法可以将keyCode
事件的触发限制为 ,或仅限于听具体的keyCodes?
答案 0 :(得分:9)
在keydown处理程序中,检查密钥是否与处理的最后一个密钥相同。如果是,请尽早退出。在密钥上,忘记处理的最后一个密钥。
例如:
var lastEvent;
var heldKeys = {};
window.onkeydown = function(event) {
if (lastEvent && lastEvent.keyCode == event.keyCode) {
return;
}
lastEvent = event;
heldKeys[event.keyCode] = true;
};
window.onkeyup = function(event) {
lastEvent = null;
delete heldKeys[event.keyCode];
};
Demo here(点击“结果”面板并按下键)。
答案 1 :(得分:0)
定义一个布尔值来记录是否按下了键。在按键事件中将其设置为true。让主循环检查值是否为true并处理事件,并将按键设置为false。有另一个布尔值来记录密钥是否被释放(最初为假)。如果键入事件触发,则将其设置为已释放。如果“已释放”值也为真,则仅将按键值设置为true(在按键事件中)。
答案 2 :(得分:0)
以下是我想要实现的目标示例:jsFiddle Example
目前,组合CTRL + B是唯一检测到的组合。只需按一些数字即可获得活动记录。当按下键时,它会检测到保持动作。