使用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>
如果你按下一个键并按住它,然后松开,然后再按,行为就像预期的那样,即有一个计数器,它在按住键时递增,在松开键时消失,然后在再次按下键时再次开始递增。
但是如果你按下两个键,然后释放一个,我会认为另一个(未释放)键会继续发送按键事件,这样计数器(重置后)会继续递增。事实上,这不会发生。知道为什么以及如何实现吗?
看看这个jQuery插件:我认为快速键,这是你想要/需要的...
在我尝试这样做的浏览器中,当按住可键入的键时,我遇到了重复的按键事件。我不知道这是否是你真正需要解决的问题。
但是,如果你认为你需要解决这个问题,或者如果你想自己控制重复率,你可以这样做:
这里的工作演示: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 ;如果我按另一种方式按,则得到) 问题答案: 我认为广播使用过多。而是使用自定义指令?这是一个用