gpt4 book ai didi

javascript - 跨浏览器的方式来在按下键时自动重复 keydown 事件

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:26:37 25 4
gpt4 key购买 nike

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

我真正想要的是能够检查一个键是否按下,但从这里的其他问题来看,这似乎是不可能的。建议的解决方法似乎是记录 keydown 和 keyup 事件,如果记录了 keydown 事件并且没有后续的 keyup,则假设键已按下。

该解决方案在我的案例中遇到了问题。我正在设计一个在线实验。用户应该在整个实验过程中按住“T”键,永远不要松开。该实验由多个试验组成,每个试验都无法访问之前试验记录的信息。因此,试验 1 可以记录 T 的按键按下,但试验 2 无法访问该记录,因此不知道 T 是否按下。

现在,如果按住 T 键会为 T 自动重复按键事件,我不会有任何问题,因为试验 2 只会捕获 T 的下一个按键事件。但看起来我不会通过按住键自动重复 keydown 事件,至少在 Firefox 中是这样。据我所见,不同浏览器处理按住键的方式似乎有所不同。解决我的问题的跨浏览器的好方法是什么?

顺便说一下,如果这很重要,我还需要能够在所有这一切进行时检测其他键的 keyup 和 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 事件。我不知道这是否是您实际需要解决的问题。

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

  1. 捕获 keydown 和 keyup 的事件。
  2. 在按键按下时,设置一个间隔计时器,无论您希望知道按键仍处于按下状态的频率如何,它都会触发。
  3. 在按下该键时,停止间隔计时器。
  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;
}
});

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

工作演示: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 函数并传递自动重复的键。

关于javascript - 跨浏览器的方式来在按下键时自动重复 keydown 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14027818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com