2012-07-11 162 views
4

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

如果是这样,我怎么能有他们的keyCode阵列?

+3

为了完成起见,应该注意的是,在* SAME *时按下两个键是不可能的。本质上讲,Javascript是同步的(这同样会在同一时间内完成某些事情的极端困难)。两个keyPress事件不可能同时被触发。这意味着什么是以下几个建议之一是正确的方法:跟踪每次按键。当您想要按下的两个键被连续按下时,并且在每次按下之间的最短时间内,您都可以进行击键。 – 2012-07-15 16:50:25

+0

@JasonL。 - “应该指出,仅仅为了完成,在同一时间按两个键是不可能的。”你会同时按下F4和Alt吗? – 2012-07-20 21:18:19

+1

@TravisJ我刚刚做到了,什么都没有发生 - Mac用户 – Mageek 2012-07-20 21:23:52

回答

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/

+3

ProTip:addEventListener – rlemon 2012-07-11 18:08:57

+1

请注意,'onkeydown'不断激发,因为它们的键被按下,所以它会使''length'膨胀。 – Esailija 2012-07-11 18:09:06

+0

如果按下'o'这样的键并等待,'keys.length'将继续更高,但你仍然按一个键。 – Mageek 2012-07-11 18:09:13

1

这应该做的伎俩。它与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; 
+0

不超过6个键不是问题,但它有我在这里描述的错误:http://stackoverflow.com/questions/11438668/keys-pressed-at-the-same-time/11490193#comment15177132_11490193 – Mageek 2012-07-15 09:24:38

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

我能够在同一时间(ASDFJKL;)按8个键。这个数字似乎与操作系统相关,因为我只能同时按下4个左手键和4个右手键。例如,在我按A,S,DF,然后再按另一个左手(比如说G),然后它不会识别最后一个键。这可能是因为操作系统知道人类是如何键入的,所以它只允许每个左右键有四个中断。我使用的操作系统是Ubuntu 12.04。

您可以在此fiddle上看到实际的代码。我用Delta Timer而不是setInterval来显示每隔50毫秒后的结果。您也可以阅读以下answer

+0

这是非常好,但仍然有一个错误:(当我按住'Command' +'Shift' +'Z'或'Command' +'Shift' +'X'时,然后松开手指,仍然显示1个按键。 (而且我发现如果你在那之后按下一个字母然后释放它,结果会回到0) – Mageek 2012-07-15 09:22:10

+0

我看到你使用的是Macintosh,好像这是一个操作系统特定的问题,我尝试了相同的键在Ubuntu上它的组合就像一个魅力一样。注意''Ctrl''等同于IBM键盘上的'Command'。 – 2012-07-15 09:34:23