2011-06-24 30 views
4

所以,想象一下這個代碼:如何獲得關於按下多長時間的按鍵的信息?

if (navigator.appName == "Opera") 
    document.onkeypress = function (e) { console.log(e.keyCode); }; 
else 
    document.onkeydown = function (e) { console.log(e.keyCode); }; 

它能做什麼是很明顯的,我想。問題是,如果你長時間保持密鑰,它會被記錄很多次。在我的應用程序中,這是一個問題,因爲它會讓我的應用程序執行大量不必要的計算。有沒有可能以某種方式只得到一次按鍵,但有關鍵持有多久的信息?

謝謝。

+0

我不是專家的邏輯或任何東西,但不應該是一個if語句的分支不同? ':)' –

+0

你是否使用類似jQuery的庫? –

+0

糟糕,是的,你說得對,當然他們應該有所不同%) 不,我不使用jQuery或任何其他框架。 –

回答

7

在這裏你去:

var pressed = {}; 

window.onkeydown = function(e) { 
    if (pressed[e.which]) return; 
    pressed[e.which] = e.timeStamp; 
}; 

window.onkeyup = function(e) { 
    if (!pressed[e.which]) return; 
    var duration = (e.timeStamp - pressed[e.which])/1000; 
    // Key "e.which" was pressed for "duration" seconds 
    pressed[e.which] = 0; 
}; 

現場演示:http://jsfiddle.net/EeXVX/1/show/

(刪除URL的 「顯示/」 部分,以查看該演示代碼)

所以你有pressed對象監視哪些鍵當前正在按下,以及它們在什麼時間點被按下。

在keyup處理程序中,您可以確定是否按下了鍵,如果是,則通過減去鍵入/鍵入事件的時間戳來計算持續時間。

+0

它的工作原理。謝謝:) –

+0

@popoffka請注意,此代碼在Opera和IE(IE8及更低版本)的舊版本中不起作用... –

2

你有沒有嘗試過做somethign一樣,

  1. 的onkeydown,刪除KEYDOWN聽衆。
  2. onkeyup,再次附加keydown監聽器和計算機的時間?
+0

當然,您還必須考慮其他可能性。就像onkeyup從未被觸發一樣。 –

+0

這不適用於平行按鍵(同時按下多個按鍵)。 –

相關問題