Javascript 当iframe聚焦时,不会调用父窗口事件。如何预防?

Javascript 当iframe聚焦时,不会调用父窗口事件。如何预防?,javascript,events,iframe,Javascript,Events,Iframe,我在主DOM中添加了一些窗口'keydown'事件侦听器。 我在DOM中还有一个youtube apiiframe。当我单击DOM中的任何元素时,都会调用所有的keydown侦听器,但当我单击youtube iframe(例如增大音量)时,所有的keydown侦听器都停止工作 我知道,iframe有自己的文档和窗口对象,也许浏览器会切换窗口并侦听iframe侦听器,但是当iframe被聚焦时,有没有办法保持父窗口键盘侦听器的工作事件?没有办法侦听这些事件“当iframe聚焦时” 然而,如果你真的

我在主DOM中添加了一些
窗口
'keydown'
事件侦听器。 我在DOM中还有一个youtube api
iframe
。当我单击DOM中的任何元素时,都会调用所有的
keydown
侦听器,但当我单击youtube iframe(例如增大音量)时,所有的
keydown
侦听器都停止工作


我知道,
iframe
有自己的
文档和
窗口
对象,也许浏览器会切换窗口并侦听iframe侦听器,但是当iframe被聚焦时,有没有办法保持父窗口键盘侦听器的工作事件?

没有办法侦听这些事件“当iframe聚焦时”

然而,如果你真的不需要这个iframe有焦点,那么你可以试着强迫它不要获得焦点

这样做有点不妥,不同的浏览器似乎有不同的行为,但要点很简单:
监听主窗口的
blur
事件,然后从那里调用它的
focus()
方法

如前所述,这主要是一个黑客攻击,需要对不同的浏览器进行调整;Firefox需要立即调用它,Chrome需要一点超时(幸运的是两者并不冲突)

还要注意,这显然会破坏YoubeTube自己的按键侦听器,从而破坏它们的键盘控制

使用风险自负,并确保在各种环境中进行测试

document.onkeydown=e=>{
e、 预防默认值();
控制台日志(e.key);
}
onblur=e=>{
如果(e.currentTarget==e.target){
focus();//FF
setTimeout(焦点,20);//Chrome
}
};
overlay.onclick=函数(){
这个。删除()
};
#覆盖{
位置:绝对位置;
文本对齐:居中;
背景:白色;
宽度:100vw;
高度:100vh;
}
开始演示

当iframe聚焦时,无法收听这些事件

然而,如果你真的不需要这个iframe有焦点,那么你可以试着强迫它不要获得焦点

这样做有点不妥,不同的浏览器似乎有不同的行为,但要点很简单:
监听主窗口的
blur
事件,然后从那里调用它的
focus()
方法

如前所述,这主要是一个黑客攻击,需要对不同的浏览器进行调整;Firefox需要立即调用它,Chrome需要一点超时(幸运的是两者并不冲突)

还要注意,这显然会破坏YoubeTube自己的按键侦听器,从而破坏它们的键盘控制

使用风险自负,并确保在各种环境中进行测试

document.onkeydown=e=>{
e、 预防默认值();
控制台日志(e.key);
}
onblur=e=>{
如果(e.currentTarget==e.target){
focus();//FF
setTimeout(焦点,20);//Chrome
}
};
overlay.onclick=函数(){
这个。删除()
};
#覆盖{
位置:绝对位置;
文本对齐:居中;
背景:白色;
宽度:100vw;
高度:100vh;
}
开始演示

不,没有。这将是一个巨大的安全问题。当iframe被聚焦时,无法收听这些事件“,但是你真的需要这个iframe来集中精力吗?否则,请注意,这显然会破坏YT自己的按键侦听器,从而破坏他们的键盘控制。@kaido这就是我要找的。谢谢你,如果你愿意的话,用这条评论回答我的问题,我将投票表决并标记为解决方案。不,没有。这将是一个巨大的安全问题。当iframe被聚焦时,没有办法倾听这些事件,但是你真的需要这个iframe被聚焦吗?否则,请注意,这显然会破坏YT自己的按键侦听器,从而破坏他们的键盘控制。@kaido这就是我要找的。谢谢你,如果你愿意的话,用这个评论回答我的问题,我将投票表决并标记为解决方案。