繁体   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