javascript - "Glitches"当使用 onkeydown 和多个按键时

标签 javascript onkeydown

按住单个箭头键时,该功能可以正常工作。

但是,当我按住第二个箭头键并释放第二个键时,就会出现问题,不再检测到第一个按住的键。

我的函数的简化版本如下:

document.body.onkeyup = function(e){  
  if ([37,38,39,40].indexOf(e.keyCode) > -1){
    var key_pressed = e.keyCode || e.which;
    console.log(key_pressed + " is UP")
  }

  if([32, 37, 38, 39, 40].indexOf(e.keyCode) > -1) {
    e.preventDefault();
  }
};


document.body.onkeydown = function(e){  
  if ([37,38,39,40].indexOf(e.keyCode) > -1){
    var key_pressed = e.keyCode || e.which;
    console.log(key_pressed + " is DOWN")
  }

  if([32, 37, 38, 39, 40].indexOf(e.keyCode) > -1) {
    e.preventDefault();
  }

};

因此,如果我按住向上箭头键,当我按住该键时,它会重复显示38 is DOWN
然后,如果我按向右箭头键,当我按住两个键时,它会重复显示39 is DOWN
然后,如果我放开右箭头键,它会显示 39 is UP

我的期望是它会继续重复说38 is DOWN,因为我仍然按住向上箭头。但它并没有这样做。

为什么会发生这种情况?我应该如何解决此问题,以便仍检测到我的箭头键被按住?

最佳答案

为每个箭头键初始化一个间隔计时器,该计时器在按下箭头键时运行。

在释放每个箭头时清除其间隔计时器:

var timer = [];
    
document.body.onkeyup = function(e){  
  let key = e.keyCode || e.which;
  if ([37,38,39,40].includes(key)) {
    console.log(key + " is UP");
    clearTimeout(timer[key]);      // stop this key's timer
    timer[key] = null;             // clear it so it can be initialized again
  }

  if ([32, 37, 38, 39, 40].includes(e.keyCode)) {
    e.preventDefault();
  }
};

document.body.onkeydown = function(e) {
  let key = e.keyCode || e.which;
  if ([37,38,39,40].includes(key) && !timer[key]) {
    clearTimeout(timer[key]);
    timer[key] = setInterval(() => {  // create a timer for this key
      console.log(key + " is DOWN")
    }, 100);
  }

  if ([32, 37, 38, 39, 40].includes(key)) {
    e.preventDefault();
  }
};

关于javascript - "Glitches"当使用 onkeydown 和多个按键时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56588787/

相关文章:

php - 性能基准 : PHP Generated content VS. javascript 和 AJAX 上的 DOM

Javascript onkeyup 也是 "slow"吗? .hide() 仅适用于 onkeydown

javascript - 在 React 中检测 2 个键的 onKeyPress

angular - 在浏览器的输入中检测 Ctrl + C 和 Ctrl + V

javascript - 如何在文本框为空时返回焦点

Javascript 正则表达式禁用 Shift、Alt 和 Ctrl 键

php - 为什么这个 Ajax 渲染需要这么长时间?

php - 使用 jQuery 每 10 秒用 php 数据刷新一个 div

javascript - 为什么 jQuery 在应用函数之前不清空 div?

javascript - angularjs $rootscope 事件不会在父指令上触发