我能知道在JavaScript中同时按下的按键数量吗?
如果可以,如何获取它们的keyCode
数组?
我能知道在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/
onkeydown
事件在按键按下时会不断触发,因此它会增加 .length
的值。 - Esailijao
这样的键并等待,keys.length
将不断增加,但你仍然只按下一个键。 - Alexandre KhouryCommand
+Shift
+Z
然后把手指拿开,长度仍旧保持在1。 - Alexandre Khoury这应该能解决问题了。它类似于Neal的代码,但应该修复了一些问题,包括离开窗口时的错误和负数键的错误。我还简化了一下消息编写代码。我用按需系统替换了计时器循环来编写按键数量消息,添加了一个安全机制来减少长度索引,并添加了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;
既然您想要同时按下的按键数量和它们的键码数组,我建议您使用以下函数:
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
,因此它与页面上的其他代码协作工作。我可以同时按下 8 个键 (A
, S
, D
, F
, J
, K
, L
和 ;
)。这个数字似乎是操作系统特定的,因为我只能同时按下左手的 4 个键和右手的 4 个键。例如,在我按下A
、S
、D
和F
之后,再按下另一个左手的键(比如说G
),那么它就无法识别最后一个键。这可能是因为操作系统知道人类打字的方式,所以它只允许每个左手和右手键的中断次数为四次。我使用的操作系统是 Ubuntu 12.04。
您可以在此fiddle上查看代码的运行情况。我使用了Delta Timer而不是setInterval
来在每50毫秒后显示结果。您可能还希望阅读以下答案。
Command
+Shift
+Z
或 Command
+Shift
+X
,然后松开手指时,它仍然显示1个键被按下。(我发现如果在此之后按下并释放一个字母,则结果会返回0)。 - Alexandre KhouryCtrl
相当于Command
。 - Aadit M Shah