当前位置: 首页 > 知识库问答 >
问题:

当按键被按下时,通过跨浏览器方式自动重复按键事件

羊舌诚
2023-03-14

使用Javascript / jQuery,当有人按下某个键时,我如何获得自动重复的keydown事件或等效事件?

我真正想要的是能够检查一把钥匙是否已关闭,但从这里的其他问题来看,这是不可能的。建议的解决方法似乎是记录键降和键控事件,然后假设键关闭(如果已记录键关闭事件并且没有后续键控)。

这个解决方案在我的案例中遇到了一个问题。我正在设计一个在线实验。用户应该在整个实验中按住“T”键,永远不要让它启动。这个实验由多个试验组成,每个试验都无法访问先前试验记录的信息。所以,试验1可以记录T的键入,但试验2无法访问该记录,因此不知道T是否已关闭。

现在,如果按住T键会产生自动重复的按键事件,我不会有问题,因为试验2会捕捉到下一个按键事件,让T出现。但是看起来我不会因为按住键而自动重复按键事件,至少在火狐中是这样。从我所看到的来看,不同的浏览器处理按住键的方式有所不同。什么是解决我的问题的好的跨浏览器方法?

顺便说一句,如果这很重要,我还需要能够检测其他键的键上键下事件,而这一切都在进行。

编辑:在阅读了一些评论后,我回去验证了我在正常情况下确实会收到重复的按键事件。但是我真的没有在我需要的特定情况下收到它们。我有一些简单的代码,我认为可以隔离这个问题:

<!DOCTYPE html>
<html>

<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
</head>

<body>
<div id="target"></div>
</body>

<script type="text/javascript">

var i;
function foo() {
    i++;
    $('#target').html(i);
}

function doTrial() { // do trial
    i=0;
    $(document).keydown(foo);
    $(document).keyup(endTrial);
}

function endTrial() { // end trial
    $('#target').html('');
    $(document).unbind('keydown',foo);
    $(document).unbind('keyup',endTrial);
    doTrial();
}

doTrial();

</script>

</html>

如果你按下一个键并按住它,然后松开,然后再按,行为就像预期的那样,即有一个计数器,它在按住键时递增,在松开键时消失,然后在再次按下键时再次开始递增。

但是如果你按下两个键,然后释放一个,我会认为另一个(未释放)键会继续发送按键事件,这样计数器(重置后)会继续递增。事实上,这不会发生。知道为什么以及如何实现吗?

共有2个答案

楚流觞
2023-03-14

看看这个jQuery插件:我认为快速键,这是你想要/需要的...

甘骞尧
2023-03-14

在我尝试这样做的浏览器中,当按住可键入的键时,我遇到了重复的按键事件。我不知道这是否是你真正需要解决的问题。

但是,如果你认为你需要解决这个问题,或者如果你想自己控制重复率,你可以这样做:

    < li >捕获keydown和keyup的事件。 < li >在keydown上,设置间隔计时器,只要您想知道该键是否仍按下,该计时器就会触发。 < li >在该键的keyup上,停止间隔计时器。 < li >只要按住该键,您就会以跨浏览器的方式得到重复通知。

这里的工作演示:http://jsfiddle.net/jfriend00/XbZYs/

var downTimer;
var lastKey;
$(document.body).keydown(function(e) {
    // if not still the same key, stop the timer
    if (e.which !== lastKey) {
        if (downTimer) {
            clearInterval(downTimer);
            downTimer = null;
        }
    }
    // remember previous key
    lastKey = e.which;
    if (!downTimer) {
        // start timer
        downTimer = setInterval(function() {
            $("#result").append("+");
        }, 125);
    }
}).keyup(function(e) {
    // stop timer
    if (downTimer) {
        clearInterval(downTimer);
        downTimer = null;
        lastKey = 0;
    }
});

如果您希望某个键永远自动重复,直到它被抬起,即使同时按下并释放其他键,并且您希望这些其他键自己自动重复,那么操作系统不会实现该行为,因此您必须自己实现它。您可以这样做,为每个按键重复事件调用一个回调函数:

工作演示:http://jsfiddle.net/jfriend00/aD3Eg/

// this is called for every manufactured repeat event
// the frequency of the repeat event is determined by the time value set
// on setInterval() below
function repeatCallback(key) {
    $("#result").append(key + " ");
}

var repeatState = {};
$(document.body).keydown(function(e) {
    var key = e.which;
    // if no time yet for this key, then start one
    if (!repeatState[key]) {
        // make copy of key code because `e` gets reused
        // by other events in IE so it won't be preserved
        repeatState[key] = setInterval(function() {
            repeatCallback(key);
        }, 125);
    } else {
        // nothing really to do here
        // The key was pressed, but there is already a timer
        // firing for it
    }
}).keyup(function(e) {
    // if we have a timer for this key, then stop it 
    // and delete it from the repeatState object
    var key = e.which;
    var timer = repeatState[key];
    if (timer) {
        clearInterval(timer);
        delete repeatState[key];
    }
});
​

对于所有这些制造的自动重复事件,将调用 repeatCallback 函数,并传递自动重复的密钥。

 类似资料:
  • 问题内容: 我想按一下软键盘上的任何键。我不想在Activity中使用EditView或TextView,必须从Activity内部的扩展View处理该事件。 我只是试过这个: 1)覆盖活动方法。该功能不适用于软键盘,只能捕获很少的硬键盘。 2)创建我的并在我的视图中注册该视图,其中包含已注册并正在运行的。这对于软键盘根本不起作用。 3)覆盖View方法。如果我设置我的OnKeyListener或

  • 问题内容: 我想使用JavaScript和jQuery处理F1-F12键。 我不确定应该避免什么陷阱,并且我目前无法在Internet Explorer 8,Google Chrome和Mozilla FireFox 3之外的任何其他浏览器中测试实现。 对完整的跨浏览器解决方案有什么建议吗?像经过良好测试的jQuery库,还是仅仅是普通的jQuery / JavaScript? 问题答案: 我同意

  • 我正在创建一个脚本,如果用户按下f7,它将开始记录鼠标点击,当他释放按钮,它应该停止,这发生,除非用户关闭程序。 我写了一个代码,在按下f7的时候开始记录按键,但是当释放它的时候仍然记录按键,因为按键处于连续按下的位置,它继续启动多个监听器,数据不断冗余。 在发布f7之后,listener也没有停止 这是密码

  • 嗨,在用pygame开发游戏时,有一个问题其实并不重要,但它一直困扰着我一段时间。 所以上面是一个工作代码,我相信 同样有效。 然而,当我只是尝试类似“event.key==pyplay。K_RIGHT:",python给我一个错误,说没有属性'key'。虽然我知道选择以上2个代码会更合理,而不仅仅是“event.key==pyplay。K_RIGHT:",我不知道为什么pyplay会说事件没有属

  • 问题内容: 我想知道redis中是否有一个功能可以让我获取所有过期的密钥(我的意思是某种事件,这使我有机会取回所有过期的记录)。其目的是将旧值保存到另一个数据库中。我听说有可能使用发布机制,但是google不能帮助我们实现这一想法。 问题答案: Redis的当前开发版本包含一个新功能:键空间通知。文档:http : //redis.io/topics/notifications 密钥空间通知允许客

  • 问题内容: 我有以下方法可以在Angular中捕获按键: 我听着 但是,我想检测何时同时按下两个键,例如和同时按下(不是一个一个又一个又一个的组合)。 最好的方法是什么? 编辑 我当时想的是: 因此,如果我有多个按键,那么我将创建正确的。但是,问题在于,现在顺序很重要(即,如果我按then ,则按is ;如果我按另一种方式按,则得到) 问题答案: 我认为广播使用过多。而是使用自定义指令?这是一个用