从内容脚本打开并将数据传递到弹出窗口(新选项卡)

时间:2012-07-05 07:52:33

标签: google-chrome-extension

我正在写一个chrome扩展程序并有一个问题。

我的扩展程序中有一些.html页面,让它成为'popup.html'。我将一个内容脚本注入到某个页面中,这个脚本在一个新选项卡中打开一个'popup.html',其中包含'var p = window.open(chrome.extension.getURL('/ popup.html'),“popup”) )',它完美地运作。接下来,我需要将一些数据传递给这个窗口,我无法用简单的方法来解决这个问题。

出于某种原因,我无法通过

的内容脚本调用子窗口的函数
var p = window.open(chrome.extension.getURL('/popup.html'), "popup");
p.foo(data);

在控制台中,我看到 Uncaught TypeError:无法调用未定义消息的方法'foo'。

我无法在查询字符串中传递数据,因为数据太大了。

是否有一种优雅而简单的方法将数据传递给这种窗口?我考虑过消息传递,但是如何使用背景页面有效地获取新打开的窗口的标签ID?

提前多多感谢。

UPD: 我尝试反转逻辑并使用'window.opener.foo()'从父窗口获取数据,但在新打开的选项卡window.opener中返回null

1 个答案:

答案 0 :(得分:4)

好的,我找到了解决问题的两个方法。

1)添加一个背景页面,打开一个带有chrome.tabs.create()的弹出窗口。然后将内容脚本中的消息发送到后台页面,然后通过chrome.tabs.sendMessage()将其重新发送到相应的选项卡。它看起来有点难看,但很有效。

2)更好的一个,没有背景页面。扩展(弹出)页面为长期连接创建一个侦听器。然后内容脚本向此连接发送消息。这里的问题是在打开页面后不会立即创建侦听器,因此应该有一种机制让内容脚本等到加载弹出窗口。它可以是一个简单的setTimeout,也可以是弹出窗口通过相同的长期连接发出的通知。

如果有人有更好的解决方案,我也很乐意检查出来。