使用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事件,以便将计数器(复位后)继续递增。 事实上,这不会发生。 任何想法,为什么和如何做到这一点?
在我尝试这样做的浏览器,我拿着分型键时下跌得到了反复的keydown事件。 我不知道这是否是你真正需要解决的一个问题。
但是,如果你确实认为你需要解决,或者如果你想自己控制的重复率,你可以做这样的:
- 捕获KeyDown和KEYUP的事件。
- 在KEYDOWN,设置火灾但是往往你想知道,关键仍是下降的间隔定时器。
- 在KEYUP该键,停止间隔定时器。
- 你会得到一个跨浏览器的方式,只要键被按下重复通知。
在这里工作演示: 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函数被调用所有这些制造自动重复事件,并通过了为自动重复的关键。
看看这个jQuery插件: fastKeys我想,这是你想要/需要什么?
文章来源: Cross-browser way to get automatically repeating keydown events when key is held down