按住键时如何避免多个按键上/下/按下事件?

时间:2010-03-08 14:01:23

标签: javascript javascript-events

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

我的问题是,当按下键时,keyup,keydown和keypress事件似乎不断循环。有没有人知道一种方法,只有在第一次按下按键时才能点火,并且当按键被释放时才能触发按键?

- 编辑:我原本忘了提它,但我试过保存按钮的状态。问题是当我按住键时,keydown,keypress和keyup事件反复闪烁。

3 个答案:

答案 0 :(得分:2)

我无法重现问题 - 我没有发现任何从keydown抛出的keyup事件, 无论我按下一把钥匙多久。

此方法侦听keydown,运行一些代码, 在听另一个keydown之前等待一个键盘。

警报仅在密钥上调用。

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)
 }
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

当你的keyup事件触发时,停止机器人并向你添加keypress处理程序。

编辑:实际从keydown事件中删除事件处理程序。你会想要使用keydown和keyup事件......而不是按键。

基本上是这样的:

  1. 指定keydown事件处理程序
  2. 指定keyup事件处理程序
  3. on keydown,删除keydown事件处理程序并启动机器人
  4. on keyup,重新分配keydown事件处理程序