JavaScript可以准确地跟踪哪些键被按下

JavaScript可以准确地跟踪哪些键被按下,javascript,keyboard-events,dom-events,Javascript,Keyboard Events,Dom Events,我有一个web应用程序,它永远以60帧/秒的速度运行,有时我想检查一下现在是否有按键关闭。所以我做了 var keydown = [] window.addEventListener("keydown", function(e){keydown[e.keyCode]=true}) window.addEventListener("keyup", function(e){keydown[e.keyCode]=false}) function loop() { if(keydown[17])

我有一个web应用程序,它永远以60帧/秒的速度运行,有时我想检查一下现在是否有按键关闭。所以我做了

var keydown = []
window.addEventListener("keydown", function(e){keydown[e.keyCode]=true})
window.addEventListener("keyup", function(e){keydown[e.keyCode]=false})
function loop() {
    if(keydown[17]) console.log("Control is down.")
    if(keydown[71]) console.log("F is down.")
}
setInterval(loop, 16)
问题是,如果用户按下control+F来搜索页面,那么当他们放开时,“查找”窗口具有焦点,因此不会触发keyup。所以我的应用程序认为控制和F永远关闭。因此,我为控制键添加了以下技巧:

// Hack to fix control key being down forever.
window.addEventListener("mousemove", function(e){
    if(keydown[17] && !e.ctrlKey) {
        keydown[17] = false
    }
})
如果认为F键永远掉下去了,我该怎么办?我尝试重置visibilitychange上的所有键,但当用户搜索时,它不会触发

以下是演示和来源:


此错误出现在windows和mac、Chrome和Safari上。

当窗口失去焦点时清除阵列(模糊事件)可能是最好的选择

window.addEventListener("blur", function(e) {
    keydown = [];
});

不幸的是,我认为不能保证浏览器在打开搜索界面时一定会触发模糊事件,但他们可能应该这样做。

您需要停止按键事件以防止组合:

var keydown=[]
window.addEventListener(“向下键”,函数(e){
e、 预防默认值();
keydown[e.keyCode]=真;
});
window.addEventListener(“键控”,函数(e){
e、 预防默认值();
keydown[e.keyCode]=假;
});
函数循环(){
var-comb=“”;
如果(向下键[17])comb+=“CTRL”;
如果(向下键[70]){
if(keydown[17])comb+=“+”;
梳+=“F”;
}
if((keydown[17])| |(keydown[70]))console.log(“I press”+comb);
}

设置间隔(循环,50)检查是否存在窗口模糊事件?另外,请记住Cmd+F适用于macOS用户(
e.metaKey
),以及其他可以切换焦点的功能。谢谢!我用window.addEventListener('blur',function(e){keydown=[]})更新了这个示例,所以现在它是万无一失的了?