2010-03-08 64 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) 
} 
} 
相關問題