簡體   English   中英

按鍵同時按下

[英]Keys pressed at the same time

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

如果是這樣,我怎么能有他們的keyCode數組?

您可以收聽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,但應該解決一些問題,包括離開窗口的bug和負數密鑰錯誤。 我還簡化了編寫代碼的消息。 我用定時系統替換了用於寫入密鑰消息數量的定時器循環,添加了用於遞減長度索引的安全機制,並添加了clearKeys以在用戶離開窗口時將所有鍵切換為向上。 代碼仍有兩個錯誤:它不會識別在打開和關閉新窗口后仍然按下的鍵(它們必須被釋放並重新推送),我無法識別超過六個鍵(我懷疑這與此代碼無關,而是計算機/瀏覽器......)。

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;

由於您需要同時按下的鍵數和一組鍵碼,我建議您使用以下功能:

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)。

我能夠同時按下8個鍵( ASDFJKL; )。 這個數字似乎特定於操作系統,因為我只能同時按下4個左手鍵和4個右手鍵。 例如,在我按下ASDF ,然后我按下另一只左手(讓我們說G )然后它將無法識別最后一個鍵。 這可能是因為操作系統知道人類是如何輸入的,所以它只允許每個左右鍵有四個中斷。 我使用的操作系統是Ubuntu 12.04。

你可以在這個小提琴上看到代碼。 我使用Delta Timer而不是setInterval來顯示每50 ms后的結果。 您可能還希望閱讀以下答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM