Javascript 同时按下按键

Javascript 同时按下按键,javascript,keydown,Javascript,Keydown,我可以知道Javascript中同时按下的键数吗 如果是这样的话,我如何拥有他们的keyCode数组?您可以监听keydown和keydup事件 var keys = { length: 0 }; document.onkeydown = function(e){ if(!keys[e.keyCode]) { keys[e.keyCode] = true; keys.length++; } } document.onkeyup = func

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


如果是这样的话,我如何拥有他们的
keyCode
数组?

您可以监听keydown和keydup事件

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:

这应该可以实现。它与Neal的类似,但应该修复一些问题,包括离开窗口错误和键的负数错误。我还稍微简化了消息编写代码。我用一个按需系统替换了用于写入键数消息的计时器循环,添加了一个用于减少长度索引的安全机制,并添加了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);
    }
}();
var getKeys=函数(){
var键=[];
addEventListener(“模糊”,模糊,假);
window.addEventListener(“keyup”,keyup,false);
window.addEventListener(“keydown”,keydown,false);
返回函数(){
返回键。切片(0);
};
函数blur(){
keys.length=0;
}
功能键控(事件){
var index=keys.indexOf(event.keyCode);
如果(索引>=0)键。拼接(索引,1);
}
功能键控(事件){
var keyCode=event.keyCode;
if(键索引OF(键代码)<0)
按键。按键(按键代码);
}
}();
当您调用
getKeys
时,它将返回同时按下的所有键的数组。您可以使用该数组的
length
属性来查找同时按下的键数。由于它使用了
addEventListener
,因此它也可以与页面上的其他代码协同工作

我测试了上面的函数,它总是返回正确的按键,即使你在按下一个键的同时切换到另一个窗口(它会从数组中删除该键)。如果您按住一个键并向后切换,则它会识别出按下了一个键并将其推入阵列。因此,我可以证明上述代码中没有bug。至少不是在我测试它的浏览器上(Opera 12.00)

我可以同时按8个键(
A
S
D
F
J
K
L
)。这个数字似乎是操作系统特有的,因为我只能同时按4个左手键和4个右手键。例如,当我按下
A
S
D
F
,然后我按下另一只左手(比如说
G
),它将无法识别最后一个键。这可能是因为操作系统知道人类是如何打字的,所以它只允许左右键各有四次中断。我使用的操作系统是Ubuntu 12.04


您可以在这个页面上看到正在运行的代码。我使用了一个而不是
setInterval
来显示每50毫秒后的结果。您可能还希望阅读以下内容。

请注意,
onkeydown
在按住键时不断激发,因此如果您按下
o
等键并等待,
.length
会膨胀,
keys.length
会越来越高,但你还是按了一个键。@Esailija我修复了它,这样它就不会这么做了。^ Neal很好,但我有一个bug。如果我按下
Command
+
Shift
+
Z
,然后我会移开手指,长度保持在1。我在MAC OSX(10.7)和你的小提琴上尝试了这一点,看看会发生什么。因此,cmd键是某种系统键,它的行为似乎是这样的:当按下cmd+anykey然后释放anykey时,JavaScript不会启动。当按下cmd+anykey并释放cmd键,然后再释放anykey时,它工作正常。系统似乎正在锁定内容的密钥,因为它认为您可能希望与浏览器的密钥命令交互。这很好,但仍然存在一个bug:(当我按住
命令
+
Shift
+
Z
命令
+
Shift
+
X
,然后我松开手指,它仍然显示按下了一个键。(我发现,如果在按下一个字母后再松开它,结果返回到0)。我看到你在使用Macintosh。这似乎是操作系统特有的问题。我在Ubuntu上尝试了相同的组合键,效果非常好。请注意,
Ctrl
相当于IBM键盘上的
Command
。不超过6个键不是问题,但它有我在这里描述的错误:应该注意,只针对c为了完成,不可能同时按下两个键。Javascript本质上是同步的(这也省去了物理上同时做某事的极端困难)。不可能同时触发两个按键事件。这意味着下面为数不多的建议之一是正确的方法:每次按下一个键时都进行跟踪。当您要按下的两个键连续按下时,并且在每次按下之间的最短时间内,您就有了击键。@JasonL.-“为了完成,需要注意的是,不可能同时按下两个键。”请同时按下F4和Alt。@TravisJ我刚刚按下了,什么也没发生-MacUser@Mageek-没什么,嗯?你试过Q+⌘?@TravisJ:你可以同时按住两个键,但是JavaScript无法检测到同时按下的两个键。你指的是一个Metak
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);
    }
}();