我正在写一个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
。
答案 0 :(得分:4)
好的,我找到了解决问题的两个方法。
1)添加一个背景页面,打开一个带有chrome.tabs.create()
的弹出窗口。然后将内容脚本中的消息发送到后台页面,然后通过chrome.tabs.sendMessage()
将其重新发送到相应的选项卡。它看起来有点难看,但很有效。
2)更好的一个,没有背景页面。扩展(弹出)页面为长期连接创建一个侦听器。然后内容脚本向此连接发送消息。这里的问题是在打开页面后不会立即创建侦听器,因此应该有一种机制让内容脚本等到加载弹出窗口。它可以是一个简单的setTimeout
,也可以是弹出窗口通过相同的长期连接发出的通知。
如果有人有更好的解决方案,我也很乐意检查出来。