【发布时间】:2023-03-25 19:03:01
【问题描述】:
我有一个永远运行 60FPS 循环的 Web 应用程序,我有时想检查一个键现在是否已关闭。所以我做了
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 不会触发。所以我的应用程序认为 control 和 F 永远下降了。所以我为控制键添加了这个技巧:
// Hack to fix control key being down forever.
window.addEventListener("mousemove", function(e){
if(keydown[17] && !e.ctrlKey) {
keydown[17] = false
}
})
如果 F 键永远按下,我该怎么办?我已尝试在 visibilitychange 上重置所有键,但在用户搜索时它不会触发。
这里是演示和来源:http://touchbasicapp.com/testkeyup.html
此错误存在于 windows 和 mac、Chrome 和 Safari。
【问题讨论】:
-
检查窗口模糊事件可能吗?另外,请记住 Cmd + F 用于 macOS 用户 (
e.metaKey),以及其他可以切换焦点的东西。 -
谢谢你的作品!我用 window.addEventListener('blur', function(e){keydown=[]}) 更新了示例,所以现在万无一失?
标签: javascript keyboard-events dom-events