防止 JavaScript keydown 事件在按住时被多次处理

IT技术 javascript
2021-02-10 09:42:16

我有这个代码:

else if (e.keyCode == 32){
      fired = true;

在 keyDown 函数中(我添加了 document.addEventListener 代码)。现在它工作得很好,并且完全符合我的要求。但问题是:如果你按住这个键,它会一遍又一遍地不断地使 fire = true 直到它被释放。我只是想让它设置 fire = true; 一次,即使按键被按下。

6个回答

编辑:现在每个浏览器都完全支持它。除了 Internet Explorer

如果浏览器兼容性不是您的主要关注点*,您可以尝试访问 的.repeat属性,如下所述KeyboardEventhttps :
//developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/repeat

通过在你的处理函数中做这样的事情:

function keyDown (e) {
  if (e.repeat) { return }

  // do stuff here
}

您可以避免重复击键。


*:在MDN网站上说它可以在Firefox中运行,我在Chrome中成功使用过它,所以两大浏览器应该没有问题

终于有一个干净的解决方案了!
2021-03-29 09:42:16
很高兴你喜欢它,它也来自匈牙利,所以你会觉得它是本地采购的:D
2021-04-05 09:42:16
    var fired = false;

    element.onkeydown = function() {

        if(!fired) {
            fired = true;
            // do something
        }
    };

然后使用 onkeyup 事件

    element.onkeyup = function() {
     fired = false;
    };
@Chris Using addEventListener(对于非旧 IE)是注册处理程序的正确方法。关键是var fired=false;应该在任何一个函数之外,以便它可以被两个函数共享(通过闭包的魔力)。
2021-03-15 09:42:16
我应该把这些东西放在哪里?只是一个新功能还是什么?(抱歉,我对 JavaScript 有点陌生)
2021-03-31 09:42:16

试试这个 :)

您可以通过简单地确定是否keydown为真来确定脚本中的任何其他地方是否已关闭您还可以在按键关闭时执行其他脚本,方法是将 替换为console.log();您想要在按键关闭时关闭的任何内容。

请告诉我这是否可以改进。

var keydown = false;
window.addEventListener('keydown', function() {
  if (!keydown) {
    keydown = true;
    console.log('key down');
  }
  window.addEventListener('keyup', function() {
    keydown = false;
  });
});

上面的解决方案不考虑多次按键(想象一个游戏,用户可以同时向上和向左按下,但都只需要触发一次)。我需要一个通用解决方案来禁用所有键的多个 keyPress 上的重复键:

// create an array with 222 (number of keycodes) values set to true
var keyEnabledArray = Array(222).fill(true);

document.onkeydown = function(e){
    // disable the key until key release
    if(keyEnabledArray[e.keyCode]) {
        keyEnabledArray[e.keyCode] = false;
    }
};

document.onkeyup = function(e){
    // enable the specific key on keyup
    keyEnabledArray[e.keyCode] = true;
}; 

检查下面的片段:

使用keyup事件。当他们的钥匙被提起时它会被触发。

请注意,如果您尝试捕获浏览器使用的键,keyup则不会阻止默认操作(在大多数情况下)。 使用此站点获取有关触发顺序以及浏览器何时触发自己的事件的信息。
2021-03-14 09:42:16