-->

当键被按下跨浏览器的方式来自动获取重复的keydown事件(Cross-browser way to

2019-07-17 13:30发布

使用Javascript / jQuery的,我怎么能得到自动重复的keydown事件,或等效的,当有人按住钥匙?

我真正想要的是能够检查某个键是否下降,但在这里的其他问题看起来这是不可能的。 建议的解决办法似乎是记录的keydown和KeyUp事件,然后假设该键一次,如果keydown事件已被记录,并没有后续KEYUP。

该解决方案运行到我的情况的问题。 我设计一个网上实验。 用户应该按住整个实验的“T”键,从来没有让它。 这项实验由多个试验,每个试验必须由以前的试验记录信息的访问权限。 因此,审判1可以记录的keydown为T,但试验2将不能访问该记录,因此不知道T是否下降或没有。

现在,如果按住T键会自动重复对于T的keydown事件的产生,我也没问题,因为审判2只想赶下keydown事件对于T一起去。 但它看起来像我没有得到自动按住按键后,至少在Firefox中重复的keydown事件。 从我可以看到它似乎还有在各种浏览器手柄保持键按下变化。 什么是一个很好的跨浏览器的方式来解决我的问题?

顺便说一句,如果它很重要,我也需要能够检测KEYUP和的keydown事件等按键,而这一切是怎么回事。

编辑:阅读一些我回去,并证实了我的确得到一般情况下重复的keydown事件的意见后。 但我真的不中,我需要他们的具体情况得到他们。 我有一些简单的代码,我认为隔离问题:

<!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>

如果你按一个键,并按住不放,然后松开,然后再次按,按预期的行为,即不存在,而键被按下该计数器加一,消失时,它的发布,然后再启动时,它再次按下递增再次。

但是,如果你按下两个键了下来,然后释放一个,我本来以为其他(未公布)键会继续发送的keydown事件,以便将计数器(复位后)继续递增。 事实上,这不会发生。 任何想法,为什么和如何做到这一点?

Answer 1:

在我尝试这样做的浏览器,我拿着分型键时下跌得到了反复的keydown事件。 我不知道这是否是你真正需要解决的一个问题。

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

  1. 捕获KeyDown和KEYUP的事件。
  2. 在KEYDOWN,设置火灾但是往往你想知道,关键仍是下降的间隔定时器。
  3. 在KEYUP该键,停止间隔定时器。
  4. 你会得到一个跨浏览器的方式,只要键被按下重复通知。

在这里工作演示: 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;
    }
});

如果你想一键永远自动重复,直到它被提升,即使被压在此期间发布的其他按键,你想与其他键做自己的自动重复,则OS并不ipmlement这种行为,所以你必须实现它自己。 你可以做这样的事情这就要求每一个按键重复事件的回调函数:

工作演示: 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函数被调用所有这些制造自动重复事件,并通过了为自动重复的关键。



Answer 2:

看看这个jQuery插件: fastKeys我想,这是你想要/需要什么?



文章来源: Cross-browser way to get automatically repeating keydown events when key is held down