【问题标题】:How do I avoid multiple key up/down/press events when holding a key?按住键时如何避免多个键向上/向下/按下事件?
【发布时间】:2010-03-08 14:01:23
【问题描述】:

我正在创建一个 Web 前端来控制一个小型机器人。 Ajax 调用将在 keydown 时进行,以启动机器人,并在 keyup 时停止它。

我的问题是,当一个键被按住时,keyup、keydown 和 keypress 事件似乎不断循环。有谁知道只有在第一次按下键时才触发 keydown 并在释放键时触发 keyup 的方法?

--edit:我最初忘记提及它,但我已尝试保存按钮的状态。问题是当我按住键时,keydown、keypress 和 keyup 事件会一遍又一遍地触发。

【问题讨论】:

  • 出现此行为时您使用的是什么浏览器?
  • Chrome 和 Firefox 都试过了

标签: javascript javascript-events


【解决方案1】:

我无法重现该问题- 我没有找到从 keydown 抛出的任何 keyup 事件, 不管我按住一个键多久。

这个方法监听按键,运行一些代码, 并在监听另一个 keydown 之前等待一个 keyup。

警报仅在按键时调用。

var A=[], who=// I used a textarea, substititute your own target
who.onkeydown= who.onkeyup= function(e){
 e=window.event || e;
 var t= e.type, target= e.target || e.srcElement;
 A.push(t);
 if(t== 'keydown'){
  // start robot and stop listening to keydown
  target.onkeydown= '';
 }
 else if(t== 'keyup'){
  // stop robot and listen for keydown
  target.onkeydown= arguments.callee;
  alert(A)
 }
}

【讨论】:

    【解决方案2】:

    您可以尝试保存密钥的状态。当按键按下时,检查按键是否已经按下,如果没有,启动机器人并将按键标记为按下。如果它已经被按下,不要做任何事情。在按键上,执行相同的操作来停止机器人并将按键标记为未按下。

    【讨论】:

      【解决方案3】:

      启动机器人时,从 keypress 事件中移除事件处理程序,并为 keyup 事件添加事件处理程序以停止机器人。

      当您的 keyup 事件触发时,停止机器人并重新添加您的按键处理程序。

      编辑:通过实际从您的 keydown 事件中删除事件处理程序。您需要使用 keydown 和 keyup 事件...而不是按键。

      所以基本上:

      1. 分配 keydown 事件处理程序
      2. 分配 keyup 事件处理程序
      3. 在 keydown 上,移除 keydown 事件处理程序并启动您的机器人
      4. 在 keyup 时,重新分配 keydown 事件处理程序

      【讨论】:

      • 正如您从编辑中看到的那样,问题实际上是事件只是不断循环。在 keydown 被触发后不久,即使物理键被按住,keyup 也会触发。
      • 您是否使用任何类型的库(dojo、jQuery 等)来处理这些事件?你能分享你的代码吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 2014-08-10
      • 2017-07-07
      • 2012-07-04
      • 2016-10-11
      • 1970-01-01
      相关资源
      最近更新 更多