Chrome扩展内容脚本可以访问window.opener吗?

Gre*_*reg 8 javascript google-chrome google-chrome-extension

在我的扩展程序中,我正在尝试确定是否将新选项卡创建为另一个选项卡的弹出窗口,如果是,则选择哪个选项卡.

我以为我可以使用内容脚本中的window.opener来帮助解决这个问题.但看起来window.opener在内容脚本中无法正常工作.

当我手动创建选项卡时,它的window.opener按预期为null.

当选项卡被另一个选项卡创建为弹出窗口时,其window.opener未定义.我可以从中推断出选项卡是作为弹出窗口创建的,但我无法用它来确定哪个选项卡创建了新选项卡.

这是一个已知的问题,有没有人知道任何变通方法?

ser*_*erg 17

我没有仔细研究这个问题,但我想我可以指出你正确的方向.内容脚本无法从父窗口访问变量,因为它是沙箱.解决方法是直接在页面上运行代码,为此,您需要将脚本注入脚本标记:

您的内容脚本如下所示:

function injectJs(link) {
        var scr = document.createElement("script");
        scr.type="text/javascript";
        scr.src=link;
        (document.head || document.body || document.documentElement).appendChild(scr);
}

injectJs(chrome.extension.getURL("inject.js"));
Run Code Online (Sandbox Code Playgroud)

现在,您可以在没有沙箱限制的情况下运行代码,就好像它在页面上一样:

inject.js:

alert(window.opener);
Run Code Online (Sandbox Code Playgroud)

我假设您现在希望将此信息传回背景页面,这是另一项挑战,因为您无法使用Chrome API.好消息是内容脚本可以访问DOM并监听DOM事件,因此您可以使用它们将信息传递到内容脚本,然后将其发送到后台页面.我很确定你应该能够注册一个自定义DOM事件并让你的内容脚本听它(我自己没有试过这个部分).

  • 有机会看到这个`注入脚本 - >内容脚本 - >后台页面`通信的一些例子.来自@Greg或@serg我目前正在努力解决这个问题 (3认同)
  • @kevzettler你可以注入一个脚本,它将`window.desiredData`作为属性存储在`document.body`上,然后从你的内容脚本中读取属性(因为它们共享相同的DOM) (2认同)