在顶级文档/窗口上注册"global listener"与事件侦听器



这是一个有点奇怪的情况,但请听我说出来。

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

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

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

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

总的来说,我是Javascript和Web开发的新手,所以如果这是一个愚蠢的问题,请道歉。

(大部分(完整的代码在这里:https://pastebin.com/b6qnCMdL

提前感谢!

编辑:经过更多的挖掘,这可能与Tampermonkey如何匹配URL与Chrome扩展程序如何匹配URL

的差异有关。

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

最新更新