2010-03-08 62 views
3

我正在创建一个Web前端来控制一个小型机器人。 Ajax调用将在keydown上进行,启动机器人,并通过keyup来停止它。如何在按住按键时避免多个按键向上/向下/按下事件?

我的问题是,当按下按键时,keydown和按键事件似乎循环不断。有人知道一种方法,只有当按键被按下时,才会有keydown射击,并且当释放时弹出键控射击?

- 编辑:我忘了最初提到它,但我试过保存按钮的状态。问题在于,当我按下按键时,keydown,按键和keyup事件一遍又一遍地响起。

+0

当你得到这种行为时,你使用了什么浏览器? – 2010-03-08 14:04:17

+0

我在Chrome和Firefox上都试过它 – Rammay 2010-03-08 14:20:04

回答

0

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

0

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

当你的keyup事件触发时,停止机器人并将你的按键处理程序添加回来。

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

所以基本上:

  1. 分配keydown事件处理程序
  2. 分配keyup事件处理程序
  3. 上的keydown,删除keydown事件处理程序,并开始你的机器人
  4. 上KEYUP,重新分配的keydown事件处理程序
+0

正如您从编辑中看到的那样,问题实际上是事件不断循环。即使物理键被按下,在keydown被激活后keyup也会很快被触发。 – Rammay 2010-03-08 15:17:37

+0

您是否在使用任何类型的库(dojo,jQuery等)来处理这些事件?你能分享你的代码吗? – smencer 2010-03-08 15:48:24

2

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

该方法监听keydown,运行一些代码,并在等待另一个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) 
} 
} 
相关问题