有没有办法检测 JavaScript 中的某个键当前是否已关闭?
我知道“keydown”事件,但这不是我需要的。按下键后的一段时间,我希望能够检测它是否仍然被按下。
PS 最大的问题似乎是在一段时间后,键开始重复,像恶魔一样触发 keydown 和 keyup 事件。希望只有一个简单的 isKeyDown(key) 函数,但如果没有,则需要克服/解决此问题。
有没有办法检测 JavaScript 中的某个键当前是否已关闭?
我知道“keydown”事件,但这不是我需要的。按下键后的一段时间,我希望能够检测它是否仍然被按下。
PS 最大的问题似乎是在一段时间后,键开始重复,像恶魔一样触发 keydown 和 keyup 事件。希望只有一个简单的 isKeyDown(key) 函数,但如果没有,则需要克服/解决此问题。
除了使用keyup
和keydown
听众进行跟踪时是关键的下降和备份,也有实际一些属性告诉你,如果某些键下降。
window.onmousemove = function (e) {
if (!e) e = window.event;
if (e.shiftKey) {/*shift is down*/}
if (e.altKey) {/*alt is down*/}
if (e.ctrlKey) {/*ctrl is down*/}
if (e.metaKey) {/*cmd is down*/}
}
这是适用于所有浏览器生成的事件对象,如从keydown
,keyup
和keypress
,所以你不必使用鼠标移动。
我尝试使用document.createEvent('KeyboardEvent')
and生成我自己的事件对象document.createEvent('KeyboardEvent')
并寻找e.shiftKey
等等,但我没有运气。
我在 Mac 上使用 Chrome 17
有没有办法检测 JavaScript 中的某个键当前是否已关闭?
不。唯一的可能性是监控每个keyup
和keydown
并记住。
一段时间后,键开始重复,像恶魔一样触发 keydown 和 keyup 事件。
它不应该。你肯定会得到keypress
重复,在许多浏览器中你也会得到重复keydown
,但如果keyup
重复,那就是一个错误。
不幸的是,这并不是一个完全闻所未闻的错误:在 Linux、Chromium 和 Firefox 上(当它在 GTK+ 下运行时,它在流行的发行版中,例如 Ubuntu)都为保持的键生成重复的 keyup-keypress-keydown 序列,这是不可能与某人快速敲击钥匙区分开来的。
我的解决方案:
var pressedKeys = {};
window.onkeyup = function(e) { pressedKeys[e.keyCode] = false; }
window.onkeydown = function(e) { pressedKeys[e.keyCode] = true; }
我现在可以通过检查来检查是否在脚本中的其他任何地方按下了任何键
pressedKeys["code of the key"]
如果为真,则按下该键。
我不相信有类似 isKeyDown 函数的东西,但您可以编写自己的函数。
基本上,创建一个数组,其长度是您要监视的键数。然后使用文档/页面/控件 keyUp 和 keyDown 事件,使用该键的状态更新数组。
然后编写一个函数来检查某个键是否按下并返回一个布尔值。
var keyEnum = { W_Key:0, A_Key:1, S_Key:2, D_Key:3 };
var keyArray = new Array(4);
function onKeyDown()
{
// Detect which key was pressed
if( key == 'w' )
keyArray[keyEnum.W_Key] = true;
// Repeat for each key you care about...
}
function onKeyUp()
{
// Detect which key was released
if( key == 'w' )
keyArray[keyEnum.W_Key] = false;
// Repeat for each key you care about...
}
function isKeyDown(key)
{
return keyArray[key];
}
那应该完成你想要的。
在这里结束是为了检查浏览器是否已经内置了一些东西,但似乎没有。这是我的解决方案(与罗伯特的回答非常相似):
"use strict";
const is_key_down = (() => {
const state = {};
window.addEventListener('keyup', (e) => state[e.key] = false);
window.addEventListener('keydown', (e) => state[e.key] = true);
return (key) => state.hasOwnProperty(key) && state[key] || false;
})();
然后,您可以使用 来检查是否按下了某个键is_key_down('ArrowLeft')
。