Javascript 注册;“全球听众”;vs顶级文档/窗口上的事件侦听器

Javascript 注册;“全球听众”;vs顶级文档/窗口上的事件侦听器,javascript,iframe,google-chrome-extension,event-listener,tampermonkey,Javascript,Iframe,Google Chrome Extension,Event Listener,Tampermonkey,这个案子有点奇怪,但请听我说完 我正在尝试开发一个扩展,为一个已有的网站添加键绑定。该网站是围绕许多嵌套的iFrame设计的,这些iFrame根据用户反馈加载和更改。我将热键作为用户脚本加载到Tampermonkey中,但当我将完全相同的代码移植到Chrome扩展时,顶级事件侦听器响应iFrame内事件的方式完全不同 在Tampermonkey中,document.onkeydown触发相关回调以响应任何iframe中的任何击键,并且使用Chrome的开发工具,我可以在整个选项卡的“全局侦听器”

这个案子有点奇怪,但请听我说完

我正在尝试开发一个扩展,为一个已有的网站添加键绑定。该网站是围绕许多嵌套的iFrame设计的,这些iFrame根据用户反馈加载和更改。我将热键作为用户脚本加载到Tampermonkey中,但当我将完全相同的代码移植到Chrome扩展时,顶级事件侦听器响应iFrame内事件的方式完全不同

在Tampermonkey中,
document.onkeydown
触发相关回调以响应任何iframe中的任何击键,并且使用Chrome的开发工具,我可以在整个选项卡的“全局侦听器”列表中看到事件侦听器

在未打包的Chrome扩展中,完全相同的代码只在顶级文档对象上注册侦听器,因此如果焦点位于iframe中,则不会执行回调

最终,抛开Tampermonkey和Chrome扩展不谈,是否有一种明确的方法可以在所有元素上设置一个全局侦听器,而不管它们是否在iframe中,而无需递归循环并将侦听器添加到每个元素中

我是Javascript和web开发的新手,如果这是一个愚蠢的问题,我深表歉意

(大部分)完整代码如下:

提前谢谢


编辑:进一步挖掘后,这可能与Tampermonkey如何匹配URL与Chrome扩展如何匹配URL的差异有关。

已解决。将
“all_frames”=true
添加到manifest.json文件会导致与我在Tampermonkey中看到的行为相同的行为。

在源代码A的范围内通常不允许侦听源代码B窗口中的事件,但扩展名当然有更多的权限,但这可能是Tampermonkey的一个原因,document.onkeydown触发相关的回调,以响应任何无法复制的iframe中的任何击键<代码>onkeydown当在iframe内部时,不会向上传播到父级,至少不会使用堆栈片段。您可能需要让每个iframe添加自己的侦听器,然后手动向上传播事件。