强制keydown事件每个keyCode只触发一次

时间:2012-05-05 23:39:44

标签: javascript jquery

情境:我有一个keydown处理程序,其中switch代表按下了什么键,相当标准的东西,但当按下任何键时{{1} } event重复触发(而不是仅在实际按下键时触发一次)。

为什么会出现问题:我想让keydown侦听器保持活动状态,即能够同时检测到多个键被按下,但每次只触发一次事件keydown。我希望keydown根据向下和向上之间的时间对keyup执行某些操作,但由于多次点击,时间会变得紧张。

我尝试了什么:我目前正在保留一份keyCode列表,这些列表已关闭,并检查keyCodes处理程序中的那些以保持默认行为如果keydown在我的列表中,则会发生。然而,事件仍然经常发生,我担心这个解决方案的效率/优雅。

实际问题:当物理按下键时,是否有一种方法可以将keyCode事件的触发限制为 ,或仅限于听具体的keyCodes?

3 个答案:

答案 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是唯一检测到的组合。只需按一些数字即可获得活动记录。当按下键时,它会检测到保持动作。