2012-07-11 128 views
4

我可以知道在Javascript中同時按下的按鍵數量嗎?同時按下按鍵

如果是這樣,我怎麼能有他們的keyCode陣列?

+3

爲了完成起見,應該注意的是,在* SAME *時按下兩個鍵是不可能的。本質上講,Javascript是同步的(這同樣會在同一時間內完成某些事情的極端困難)。兩個keyPress事件不可能同時被觸發。這意味着什麼是以下幾個建議之一是正確的方法:跟蹤每次按鍵。當您想要按下的兩個鍵被連續按下時,並且在每次按下之間的最短時間內,您都可以進行擊鍵。 – 2012-07-15 16:50:25

+0

@JasonL。 - 「應該指出,僅僅爲了完成,在同一時間按兩個鍵是不可能的。」你會同時按下F4和Alt嗎? – 2012-07-20 21:18:19

+1

@TravisJ我剛剛做到了,什麼都沒有發生 - Mac用戶 – Mageek 2012-07-20 21:23:52

回答

11

您可以收聽keydown和keyup事件。

var keys = { length: 0 }; 

document.onkeydown = function(e){ 
    if(!keys[e.keyCode]) { 
     keys[e.keyCode] = true; 
     keys.length++; 
    } 
} 

document.onkeyup = function(e){ 
    if(keys[e.keyCode]) { 
     keys[e.keyCode] = false; 
     keys.length--; 
    } 
} 

然後一切都true鍵是當前壓制的人。

小提琴演示感謝@Esailija:http://jsfiddle.net/maniator/Gc54D/

+3

ProTip:addEventListener – rlemon 2012-07-11 18:08:57

+1

請注意,'onkeydown'不斷激發,因爲它們的鍵被按下,所以它會使''length'膨脹。 – Esailija 2012-07-11 18:09:06

+0

如果按下'o'這樣的鍵並等待,'keys.length'將繼續更高,但你仍然按一個鍵。 – Mageek 2012-07-11 18:09:13

1

這應該做的伎倆。它與Neal's類似,但應該修復一些問題,包括窗口出錯和鍵盤負數錯誤。我還簡化了消息編寫代碼。我使用按需系統替換了用於寫入密鑰數量消息的計時器循環,添加了用於遞減長度索引的安全機制,並添加了clearKeys以在用戶離開窗口時將所有密鑰切換爲up。該代碼仍然有兩個錯誤:它不會識別在新窗口打開和關閉後仍然按住的鍵(它們必須被釋放並重新推入),並且我無法識別超過六個鍵(我懷疑這和這段代碼沒有關係,但是電腦/瀏覽器......)。

var keys = { 
    length: 0 
}; 

window.onkeydown = function(e) { 
    if (!keys[e.keyCode]) { 
     keys[e.keyCode] = true; 
     keys.length++; 
     document.body.innerHTML = "You are pressing " + keys.length + " keys at the same time."; 
    } 
} 

window.onkeyup = function(e) { 
    if (keys[e.keyCode]) { 
     keys[e.keyCode] = false; 
     if (keys.length) { 
      keys.length--; 
     } 
     document.body.innerHTML = "You are pressing " + keys.length + " keys at the same time."; 
    } 
} 

function clearKeys() { 
    for (n in keys) { 
     n = false 
    }; 
    keys.length = 0; 
    document.body.innerHTML = "You are pressing " + 0 + " keys at the same time."; 
} 

document.body.innerHTML = "You are pressing 0 keys at the same time."; 
window.onblur = clearKeys; 
+0

不超過6個鍵不是問題,但它有我在這裏描述的錯誤:http://stackoverflow.com/questions/11438668/keys-pressed-at-the-same-time/11490193#comment15177132_11490193 – Mageek 2012-07-15 09:24:38

1

既然你想,我建議你使用下面的函數,同時按鍵的數量和他們的關鍵代碼數組:

var getKeys = function() { 
    var keys = []; 

    window.addEventListener("blur", blur, false); 
    window.addEventListener("keyup", keyup, false); 
    window.addEventListener("keydown", keydown, false); 

    return function() { 
     return keys.slice(0); 
    }; 

    function blur() { 
     keys.length = 0; 
    } 

    function keyup(event) { 
     var index = keys.indexOf(event.keyCode); 
     if (index >= 0) keys.splice(index, 1); 
    } 

    function keydown(event) { 
     var keyCode = event.keyCode; 
     if (keys.indexOf(keyCode) < 0) 
     keys.push(keyCode); 
    } 
}(); 

當你調用getKeys它會返回一個數組所有按鍵同時按下。您可以使用該數組的length屬性來查找同時按下的鍵的數量。由於它使用addEventListener,它也與頁面上的其他代碼協同工作。

我測試了上述函數,它總是返回正確的按鍵,即使按住一個鍵(它將從數組中刪除該鍵)切換到另一個窗口時也是如此。如果你按住一個鍵並切換回來,它就會識別出一個鍵被按下,並將它推入陣列。因此我可以證明上面的代碼中沒有錯誤。至少不在我測試過的瀏覽器上(Opera 12.00)。

我能夠在同一時間(ASDFJKL;)按8個鍵。這個數字似乎與操作系統相關,因爲我只能同時按下4個左手鍵和4個右手鍵。例如,在我按A,S,DF,然後再按另一個左手(比如說G),然後它不會識別最後一個鍵。這可能是因爲操作系統知道人類是如何鍵入的,所以它只允許每個左右鍵有四個中斷。我使用的操作系統是Ubuntu 12.04。

您可以在此fiddle上看到實際的代碼。我用Delta Timer而不是setInterval來顯示每隔50毫秒後的結果。您也可以閱讀以下answer

+0

這是非常好,但仍然有一個錯誤:(當我按住'Command' +'Shift' +'Z'或'Command' +'Shift' +'X'時,然後鬆開手指,仍然顯示1個按鍵。 (而且我發現如果你在那之後按下一個字母然後釋放它,結果會回到0) – Mageek 2012-07-15 09:22:10

+0

我看到你使用的是Macintosh,好像這是一個操作系統特定的問題,我嘗試了相同的鍵在Ubuntu上它的組合就像一個魅力一樣。注意''Ctrl''等同於IBM鍵盤上的'Command'。 – 2012-07-15 09:34:23