5

情况:我有一个keydown处理程序,它带有一个switch用于按下什么键的相当标准的东西,但是当按下任何键时,keydown事件会重复触发(而不是在实际按下键时只触发一次)。

为什么会出现问题:我想保持keydown监听器处于活动状态,即能够检测到一次按下多个键,但每次只能触发一次事件keydown。我会想根据上下之间的时间做一些事情,但是由于多次射击,这个时间被搞砸了keyupkeyCode

我已经尝试过:我目前正在保留一个keyCodes已关闭的列表,并检查我的keydown处理程序中的那些,以防止默认行为keyCode在我的列表中发生。但是,该事件仍然经常触发,我担心此解决方案的效率/优雅。

实际问题:有没有一种好方法可以将keydown事件的触发限制在物理按下键时,或者只监听特定的键码

4

4 回答 4

9

在 keydown 处理程序中,检查键是否与最后处理的键相同。如果是,请尽早退出。在 keyup 上,忘记处理的最后一个键。

例如:

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];
};​

演示在这里(单击“结果”面板并按下键)。

于 2012-05-06T01:15:49.517 回答
0

如果按键被按下,定义一个布尔值来记录。在按键事件中将其设置为 true。让你的主循环检查值是否为真并处理事件,并将按下的键设置为假。如果键被释放(最初为假),则有另一个布尔值来记录。如果 key-up 事件触发,请将其设置为已释放。如果“释放”值也为真,则仅将按键值设置为真(在按键事件中)。

于 2012-05-05T23:55:22.603 回答
0

这是我认为您想要实现的示例:jsFiddle Example

目前,组合 CTRL+B 是唯一检测到的组合。只需按一些数字即可获取活动日志。当该键已被按下时,它会检测到保持动作。

于 2012-05-06T00:36:21.263 回答
0

这是一个更简洁的版本,不易出错。当前键是否是最后一个键并不重要,因为如果 keyup 事件尚未触发,则它仍处于 keydown 状态。

var heldKeys = {};

window.onkeydown = function(event) {
    if (heldKeys[event.keyCode]) {
        return;
    }
    heldKeys[event.keyCode] = true;
};

window.onkeyup = function(event) {
    heldKeys[event.keyCode] = false;
};​
于 2021-08-19T05:14:39.873 回答