js解决键盘长按输入时会有停顿的问题

6 篇文章 0 订阅
1 篇文章 0 订阅
问题:

长按键盘输入内容时中间会有一个停顿(短暂的)
在这里插入图片描述

个人猜测(如有错误欢迎指正):
  • 这个问题并不是浏览器带来的,因为你在Word、写字板里面连续输入一个字符,同样会出现这个问题。
  • 可能是因为键盘驱动或者操作系统本身为了避免用户连击误输入而故意设计成这样的,毕竟连续输入一个字符的时候并不多。
思路
  • 我们首先监听第一次的keydown事件,然后添加一个定时器,在keydown持续发生的时间里不断的调用相应的函数,直到keyup事件发生,这时清除定时器,不再调用函数。
<style>
  #div1 {
    width: 100px;
    height: 100px;
    background: #CCC;
    position: absolute;
  }
</style>

<script>
  window.onload = function () {
    var oDiv = document.getElementById("div1");
    var direction = {
      left: false,
      top: false,
      right: false,
      bottom: false
    }; //上下左右

    setInterval(function () {
      if (direction.left) {
        oDiv.style.left = oDiv.offsetLeft - 1 + 'px';
      } else if (direction.top) {
        oDiv.style.top = oDiv.offsetTop - 1 + 'px';
      } else if (direction.right) {
        oDiv.style.left = oDiv.offsetLeft + 1 + 'px';
      } else if (direction.bottom) {
        oDiv.style.top = oDiv.offsetTop + 1 + 'px';
      }
    }, 1);

    document.onkeydown = function (ev) {
      var oEvent = ev || event;
      //← 37 ↑38 →39 ↓40
      switch (oEvent.keyCode) {
        case 37:
          direction.left = true;
          break;
        case 38:
          direction.top = true;
          break;
        case 39:
          direction.right = true;
          break;
        case 40:
          direction.bottom = true;
          break;
      }

      document.onkeyup = function () {
        direction = {
          left: false,
          top: false,
          right: false,
          bottom: false
        };
      }
    }
  }
</script>

<body>
  <div id="div1"></div>
</body>
效果图

在这里插入图片描述

  • 这里可以看出移动时是没有明显卡顿的
应用
  • 好像就游戏中控制人物移动的时候用的多一点,其他地方还没怎么见过,算有点鸡肋了
  • 感谢阅读!
  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现键盘调用函数并控制函数的间隔时间,可以使用 JavaScript 的 `setInterval()` 和 `clearInterval()` 函数结合键盘事件来实现。 首先,你需要使用 `keydown` 事件来检测按键是否按下。当按键被按下时,开始定时器,并且在定时器中调用要执行的函数。当按键被释放时,清除定时器。 以下是一个示例代码,可以实现键盘调用函数并控制函数的间隔时间: ```html <!DOCTYPE html> <html> <head> <title>Long Press Demo</title> </head> <body> <p>Press and hold any key to call the function repeatedly with 500ms interval.</p> <script> var intervalId; var delay = 500; // 500ms document.addEventListener('keydown', function(event) { if (event.repeat) { return; } intervalId = setInterval(function() { // Replace the following line with your own function to be called repeatedly. console.log('Function called.'); }, delay); }); document.addEventListener('keyup', function(event) { clearInterval(intervalId); }); </script> </body> </html> ``` 在这个示例中,`keydown` 事件会检测按键是否按下,`event.repeat` 判断事件是否为重复触发。如果是重复触发,则直接返回。如果不是重复触发,则开始定时器并调用要执行的函数。`keyup` 事件会在按键被释放时清除定时器。 你可以将 `console.log('Function called.')` 替换为你自己的需要重复执行的函数。 `delay` 变量设置了函数的时间间隔,可以根据需要进行修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值