4

我可以知道在 Javascript 中同时按下的键数吗?

如果是这样,我怎样才能拥有他们的数组keyCode

4

3 回答 3

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/

于 2012-07-11T18:04:10.063 回答
1

这应该可以解决问题。它类似于 Neal 的,但应该修复一些问题,包括离开窗口错误和负数的键错误。我还稍微简化了消息编写代码。我用按需系统替换了用于编写键数消息的计时器循环,添加了用于减少长度索引的安全机制,并添加了 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;
于 2012-07-15T06:07:08.020 回答
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)。

我能够同时按 8 个键(、ASDFJK)。这个数字似乎是特定于操作系统的,因为我只能同时按 4 个左手键和 4 个右手键。例如,在我按、和,然后按另一只左手(比如说)之后,它就无法识别最后一个键。这可能是因为操作系统知道人类的打字方式,因此它只允许左右手键中的每个键有四个中断。我使用的操作系统是 Ubuntu 12.04。L;ASDFG

您可以在这个fiddle上看到正在运行的代码。我使用Delta Timer而不是setInterval每 50 毫秒显示一次结果。您可能还希望阅读以下答案

于 2012-07-15T07:16:35.573 回答