【问题标题】:Can Chrome extension content scripts access window.opener?Chrome扩展内容脚本可以访问window.opener吗?
【发布时间】:2011-04-07 00:55:25
【问题描述】:

在我的扩展程序中,我试图确定一个新选项卡是否是由另一个选项卡作为弹出窗口创建的,如果是,是哪个选项卡。

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

当我手动创建一个选项卡时,它的 window.opener 为空。

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

这是一个已知问题吗?有人知道任何解决方法吗?

【问题讨论】:

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


【解决方案1】:

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

您的内容脚本如下所示:

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"));

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

注入.js:

alert(window.opener);

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

【讨论】:

  • 我最终用这样的方法解决了我的问题;将大量代码注入页面并使用postMessage 在框架之间以及页面与我的内容脚本之间进行通信。这很痛苦,但似乎大部分时间都有效。
  • 有机会看到这种injected script -> content script -> background page 通信的一些例子。来自@Greg 或@serg 我目前正在努力解决这个确切的问题
  • @kevzettler 您可以注入一个脚本,该脚本将window.desiredData 作为属性存储在document.body 上,然后从您的内容脚本中读取该属性(因为它们共享相同的 DOM)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 2016-11-19
  • 2012-07-04
  • 2013-05-20
  • 2011-04-25
相关资源
最近更新 更多