在我的扩展程序中,我正在尝试确定是否已将新标签创建为另一个标签的弹出窗口,如果是,则选择哪个标签。
我以为我可以使用内容脚本中的window.opener来帮助解决这个问题。但看起来window.opener在内容脚本中无法正常工作。
当我手动创建一个标签时,它的window.opener按预期为空。
当选项卡被另一个选项卡创建为弹出窗口时,其window.opener未定义。我可以从中推断该选项卡是作为弹出窗口创建的,但是我不能用它来确定哪个选项卡创建了新选项卡。
这是一个已知问题,是否有人知道任何变通办法?
答案 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事件并让你的内容脚本听它(我自己没有试过这个部分)。