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

时间:2010-09-01 21:15:38

标签: javascript google-chrome google-chrome-extension

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

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

当我手动创建一个标签时,它的window.opener按预期为空。

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

这是一个已知问题,是否有人知道任何变通办法?

1 个答案:

答案 0 :(得分: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"));

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

inject.js:

alert(window.opener);

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