2010-09-01 92 views
7

在我的扩展中,我试图确定一个新标签是否被创建为另一个标签的弹出框,如果是,哪个标签。Chrome扩展内容脚本可以访问window.opener吗?

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

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

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

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

+0

可能的重复http://stackoverflow.com/questions/3124543/is-it-possible-to-determine-a-tabs-opener-within-a-google-chrome-extension – npdoty 2010-09-11 02:34:35

+0

是的,看起来像它。但是,这两个问题都没有得到解答。 – Greg 2010-09-13 16:42:40

+0

[我们现在倾向于让类似的问题站起来。](http://blog.stackoverflow.com/2010/11/dr-strangedupe-or-how-i-learned-停止担忧和爱复制/) – Will 2011-01-28 13:41:51

回答

16

我没有仔细研究这个问题,但我想我可以指出你在正确的方向。内容脚本不能从父窗口访问变量,因为它是沙盒。一种解决方法是直接在网页上运行的代码,要做到这一点,你需要注入一个脚本标签中脚本:

你的内容脚本应该是这样的:

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

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

+0

我最终解决了我的问题,使用这样的方法;在页面中注入大量代码并使用'postMessage'在框架之间以及页面和我的内容脚本之间进行通信。这很痛苦,但似乎大部分时间都在工作。 – Greg 2011-01-31 20:04:47

+3

任何机会看到这个'注入的脚本 - >内容脚本 - >背景页面'通信的一些例子。来自@Greg或@serg我正在努力解决当前确切的问题 – kevzettler 2012-07-19 19:29:40

+2

@kevzettler您可以注入一个脚本,它将'window.desiredData'作为属性存储在'document.body'中,然后从内容中读取属性 - 脚本(因为他们共享相同的DOM) – levi 2014-06-30 23:47:50

相关问题