同時按下按鍵
回答
您可以收聽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/
這應該做的伎倆。它與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;
不超過6個鍵不是問題,但它有我在這裏描述的錯誤:http://stackoverflow.com/questions/11438668/keys-pressed-at-the-same-time/11490193#comment15177132_11490193 – Mageek 2012-07-15 09:24:38
既然你想,我建議你使用下面的函數,同時按鍵的數量和他們的關鍵代碼數組:
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)。
我能夠在同一時間(A
,S
,D
,F
,J
,K
,L
和;
)按8個鍵。這個數字似乎與操作系統相關,因爲我只能同時按下4個左手鍵和4個右手鍵。例如,在我按A
,S
,D
和F
,然後再按另一個左手(比如說G
),然後它不會識別最後一個鍵。這可能是因爲操作系統知道人類是如何鍵入的,所以它只允許每個左右鍵有四個中斷。我使用的操作系統是Ubuntu 12.04。
您可以在此fiddle上看到實際的代碼。我用Delta Timer而不是setInterval
來顯示每隔50毫秒後的結果。您也可以閱讀以下answer。
這是非常好,但仍然有一個錯誤:(當我按住'Command' +'Shift' +'Z'或'Command' +'Shift' +'X'時,然後鬆開手指,仍然顯示1個按鍵。 (而且我發現如果你在那之後按下一個字母然後釋放它,結果會回到0) – Mageek 2012-07-15 09:22:10
我看到你使用的是Macintosh,好像這是一個操作系統特定的問題,我嘗試了相同的鍵在Ubuntu上它的組合就像一個魅力一樣。注意''Ctrl''等同於IBM鍵盤上的'Command'。 – 2012-07-15 09:34:23
- 1. 當按下一個鍵時,多次按下不同的按鍵?
- 2. JavaScript兩鍵同時按下
- 3. 同時按下多個按鍵
- 4. 模擬按住Ctrl鍵同時按下
- 5. 當鍵盤按鍵被按下時,顯示按鈕被按下
- 6. 同時按下兩個鍵時檢測
- 7. 同時按下多個按鍵後釋放按鍵時,未觸發KeyListener
- 8. 按下按鈕的同時按下了
- 9. 如何按下另一個鍵時按下按鍵?
- 10. 按下鍵盤上相應鍵時如何按下按鈕? JavaFX
- 11. 如何在按下美元鍵時找出按下按鍵或按鍵事件時的按鍵
- 12. 當按下鼠標左鍵的同時按下了SFML 2.0
- 13. iphone - 同時按下按鈕
- 14. 按下按鍵時使用計時器
- 15. 如何在按下鍵盤按鍵時更改焦點不同的J按鈕?
- 16. 區分按下按鍵和按鍵
- 17. iOS - 按下按鈕時關閉鍵盤
- 18. C#和Unity3D按鍵被按下時
- 19. C++在任何時候按鍵按下
- 20. 按鍵不工作時被按下
- 21. 按下按鍵時錯誤獲取值
- 22. 按下按鍵時播放聲音
- 23. jQuery按下按鍵時單擊錨點
- 24. 按鍵時按下打印文字
- 25. 按下按鍵時停止'丁'聲
- 26. 線程運行時按下按鍵 - 如何捕捉按鍵?
- 27. 在按鍵上按下按鍵(按下按鍵後),跳轉到奇怪行爲
- 28. 計算在JavaScript中同時按下多少個按鍵
- 29. 顯示按鈕提示,同時鍵被按下
- 30. GDK/GTK可以同時按下兩個按鍵嗎?
爲了完成起見,應該注意的是,在* SAME *時按下兩個鍵是不可能的。本質上講,Javascript是同步的(這同樣會在同一時間內完成某些事情的極端困難)。兩個keyPress事件不可能同時被觸發。這意味着什麼是以下幾個建議之一是正確的方法:跟蹤每次按鍵。當您想要按下的兩個鍵被連續按下時,並且在每次按下之間的最短時間內,您都可以進行擊鍵。 – 2012-07-15 16:50:25
@JasonL。 - 「應該指出,僅僅爲了完成,在同一時間按兩個鍵是不可能的。」你會同時按下F4和Alt嗎? – 2012-07-20 21:18:19
@TravisJ我剛剛做到了,什麼都沒有發生 - Mac用戶 – Mageek 2012-07-20 21:23:52