同时按下按键
回答
您可以收听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/
这应该做的伎俩。它与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;
不超过6个键不是问题,但它有我在这里描述的错误:http://stackoverflow.com/questions/11438668/keys-pressed-at-the-same-time/11490193#comment15177132_11490193 – Mageek 2012-07-15 09:24:38
既然你想,我建议你使用下面的函数,同时按键的数量和他们的关键代码数组:
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)。
我能够在同一时间(A
,S
,D
,F
,J
,K
,L
和;
)按8个键。这个数字似乎与操作系统相关,因为我只能同时按下4个左手键和4个右手键。例如,在我按A
,S
,D
和F
,然后再按另一个左手(比如说G
),然后它不会识别最后一个键。这可能是因为操作系统知道人类是如何键入的,所以它只允许每个左右键有四个中断。我使用的操作系统是Ubuntu 12.04。
您可以在此fiddle上看到实际的代码。我用Delta Timer而不是setInterval
来显示每隔50毫秒后的结果。您也可以阅读以下answer。
这是非常好,但仍然有一个错误:(当我按住'Command' +'Shift' +'Z'或'Command' +'Shift' +'X'时,然后松开手指,仍然显示1个按键。 (而且我发现如果你在那之后按下一个字母然后释放它,结果会回到0) – Mageek 2012-07-15 09:22:10
我看到你使用的是Macintosh,好像这是一个操作系统特定的问题,我尝试了相同的键在Ubuntu上它的组合就像一个魅力一样。注意''Ctrl''等同于IBM键盘上的'Command'。 – 2012-07-15 09:34:23
- 1. 当按下一个键时,多次按下不同的按键?
- 2. 同时按下两个键时检测
- 3. 按下键盘上相应键时如何按下按钮? JavaFX
- 4. 如何按下另一个键时按下按键?
- 5. 如何在按下美元键时找出按下按键或按键事件时的按键
- 6. iphone - 同时按下按钮
- 7. 如何在按下键盘按键时更改焦点不同的J按钮?
- 8. 区分按下按键和按键
- 9. C++在任何时候按键按下
- 10. C#和Unity3D按键被按下时
- 11. 线程运行时按下按键 - 如何捕捉按键?
- 12. 在按键上按下按键(按下按键后),跳转到奇怪行为
- 13. GDK/GTK可以同时按下两个按键吗?
- 14. 当按下默认键时显示按钮按下效果
- 15. 当按下Enter键时
- 16. 按键模拟键盘按下“Shift”键
- 17. 用Java按下按键
- 18. WinForm:按下多个按键
- 19. 两个按钮同时按下输入
- 20. 同时按下按钮播放声音
- 21. 在Ruby中按下键盘按键
- 22. 如何将按下的按键转换为不同的按键pygtk
- 23. 按键时按键找到关键字
- 24. 当3个按键被同时按下时,PyGame没有收到事件
- 25. 按下删除键时无法触发按键事件
- 26. Objective-C:在按下另一个键时检测到“shift”按键
- 27. 计算按键在键盘上按下的时间长度
- 28. 如何在没有按下c#键的情况下按下键?
- 29. 同时按住两个键时
- 30. 如何按下键盘上的按键时更改按钮的外观。 JavaFx
为了完成起见,应该注意的是,在* SAME *时按下两个键是不可能的。本质上讲,Javascript是同步的(这同样会在同一时间内完成某些事情的极端困难)。两个keyPress事件不可能同时被触发。这意味着什么是以下几个建议之一是正确的方法:跟踪每次按键。当您想要按下的两个键被连续按下时,并且在每次按下之间的最短时间内,您都可以进行击键。 – 2012-07-15 16:50:25
@JasonL。 - “应该指出,仅仅为了完成,在同一时间按两个键是不可能的。”你会同时按下F4和Alt吗? – 2012-07-20 21:18:19
@TravisJ我刚刚做到了,什么都没有发生 - Mac用户 – Mageek 2012-07-20 21:23:52