如何避免 JavaScript 中自动重复的按键事件?
如果用户按住该键,则会触发多个 keydown 事件。出于可用性原因,我需要使用 keydown,而不是 keyup,但我想避免这种情况。我的相关代码如下:
$(document).keydown(function(e) {
var key = 0;
if (e == null) { key = event.keyCode;}
else { key = e.which;}
switch(key) {
case config.keys.left:
goLeft();
break;
case config.keys.up:
goUp();
break;
case config.keys.right:
goRight();
break;
case config.keys.down:
goDown();
break;
case config.keys.action:
select();
break;
}
});
因此,当用户按住向下键时,例如, goDown() 会被多次触发。即使用户按住按键,我也希望它只触发一次。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
使用
event.repeat
检测事件是否重复。然后,您可以等待“keyup”,然后再允许处理程序第二次执行。Use
event.repeat
to detect whether or not the event is repeating. You could then wait for "keyup" before allowing the handler to execute a second time.对已接受答案的另一个简单调整,以允许多键场景:
Another simple adjustment to the accepted answer to allow for the multiple keys scenario:
很简单
its simple
因此,如果现有的解决方案看起来可疑(它不考虑同时按下 2 个或更多按钮的情况),我建议使用另一种解决方案来考虑它。
_prevKeyDown 对象用于存储当前按下的按键。
So, if the existing solution seems dubious (it doesn't consider the case when 2 or more buttons is pressed simultaneously), I suggest another solution that takes it into account.
The _prevKeyDown object is to store keys that are currently pressed.
(从另一个问题复制而来,结果与这个问题重复。)
dmaurolizer 的 KeyPress 库 给出了很好的结果控制所有键盘事件。您为事件提供回调函数。
keydown
事件发送一个可选的isRepeat
参数,以便您可以忽略自动重复。以下是在视频游戏中使用该功能进行推力控制的示例:(Copied from another question which turned out to be a duplicate of this one.)
dmaurolizer's KeyPress library gives fine control over all keyboard events. You provide callback functions for events. The
keydown
event sends an optionalisRepeat
param so you can ignore auto-repeats. Here's a sample using that functionality for the thrust control in a video game: