2012-05-05 35 views
5

情況:我有一個​​處理與switch爲按什麼鍵,相當標準的東西,但是當任何鍵重複(按住​​事件觸發,而不是僅僅一次當鍵被實際按下時)。力keydown事件來觸發每鍵代碼只有一次

爲什麼這是一個問題:我想保持​​聽衆活躍,即能夠檢測被按下一次超過一個關鍵,但每​​只有事件火一次。我想根據從下往上的時間對keyCodekeyup的一些事情,但是由於多次發射,這個時機變得很糟糕。

我已經試過:我目前保留的keyCodes已關閉的列表,並檢查對那些在我​​處理程序,以保持默認行爲的發生,如果keyCode在我的名單。然而,這個事件仍然很頻繁,我擔心這個解決方案的效率/優雅。

實際問題:是否有可以​​事件的發射限制只是當鑰匙被物理按下,或只收聽特定的鍵碼的好辦法?

+0

「即能夠檢測到同時按下多個鍵」這意味着什麼? – epascarello

+0

例如,按住'y'鍵,然後按住'o'鍵。這不包括刪除keydown事件並在keyup之後再次添加它的解決方案。 –

回答

8

在keydown處理程序中,檢查該鍵是否與最後處理的鍵相同。如果是,請儘早退出。在密碼上,忘記最後處理的密鑰。

例如:

var lastEvent; 
var heldKeys = {}; 

window.onkeydown = function(event) { 
    if (lastEvent && lastEvent.keyCode == event.keyCode) { 
     return; 
    } 
    lastEvent = event; 
    heldKeys[event.keyCode] = true; 
}; 

window.onkeyup = function(event) { 
    lastEvent = null; 
    delete heldKeys[event.keyCode]; 
};​ 

Demo here(單擊 「結果」 面板上,然後按鍵)。

0

定義一個布爾值來記錄鍵是否被按下。在關鍵事件中將其設置爲true。讓主循環檢查值是否爲真並處理事件,並將該鍵設置爲false。如果密鑰被釋放(最初爲false),請再次記錄布爾值。如果按鍵事件觸發,則將其設置爲釋放。如果「釋放」值也爲真,則只需將按鍵值設置爲true(在按鍵事件中)。

+0

這是一個很好的答案。只有我可能增加的是,我將定義一個對象數組來存儲每個鍵代碼的布爾值,當它被按下時,那個對象將是[{「43」:true},...],然後按照上面的建議去掉那個鍵碼。 – LocalPCGuy

+0

這實際上是我現在正在做的事情,如果不清楚,很抱歉。我保持'down'keyCodes存儲並在keyup上刪除它們。我對任何替代方法都感興趣,因爲它可能比我的keyCode列表每秒檢查幾次更高效。 –

0

這裏是什麼,我想你想達到一個例子:jsFiddle Example

目前組合鍵Ctrl + B是多數民衆贊成在檢測到的唯一一個。只需按一些數字即可獲得活動日誌。當按鍵已經被按下時,它檢測到保持動作。