我可以在Javascript中知道同时按下的键数吗?
如果是这样,我怎么能有他们keyCode
的数组?
答案 0 :(得分: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/
答案 1 :(得分:1)
这应该可以解决问题。它类似于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;
答案 2 :(得分: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个键(A
,S
,D
,F
,J
,K
,L
和;
)。这个数字似乎特定于操作系统,因为我只能同时按下4个左手键和4个右手键。例如,在我按A
,S
,D
和F
之后,我按另一个左手(让我们说G
)然后它不会识别最后一把钥匙。这可能是因为操作系统知道人类是如何输入的,所以它只允许每个左右键有四个中断。我使用的操作系统是Ubuntu 12.04。
您可以在此fiddle上查看代码。我使用Delta Timer代替setInterval
来显示每50毫秒后的结果。您可能还希望阅读以下answer。