我一直在寻找示例和参考,但一无所获。我在 offscreenTab 源代码中发现了一条注释,提到它不能从背景页面实例化(它没有与 offscreenTab 相关的选项卡)。在其他地方我发现提到弹出窗口也与选项卡没有关系。
如何在 Chrome 扩展程序中成功创建 offscreenTab?
我一直在寻找示例和参考,但一无所获。我在 offscreenTab 源代码中发现了一条注释,提到它不能从背景页面实例化(它没有与 offscreenTab 相关的选项卡)。在其他地方我发现提到弹出窗口也与选项卡没有关系。
如何在 Chrome 扩展程序中成功创建 offscreenTab?
根据文档,offscreenTabs.create
不会在后台页面中运行。尽管没有明确提及,API 也不能在内容脚本中使用。通过一个简单的测试,弹出窗口似乎与背景页面有相同的限制。
唯一剩下的选项是在 Chrome 扩展程序的上下文中运行的选项卡。最简单的方法是在后台/弹出窗口中使用以下代码:
chrome.tabs.create({url: chrome.extension.getURL('ost.htm'), active:false});
// active:false, so that the window do not jump to the front
ost.htm
是一个帮助页面,它创建选项卡:
chrome.experimental.offscreenTabs.create({url: '...'}, function(offscreenTab) {
// Do something with offscreenTab.id !
});
要更改 URL,请使用chrome.experimental.offscreenTabs.update
.
offscreenTab.id
是一个 tabId,应该与chrome.tabs
API 一起使用。但是,至少在 Chrome 20.0.1130.1 中,情况并非如此。API的所有方法tabs
都无法识别返回的 tabID。
一种解决方法是使用清单文件注入内容脚本,例如:
{"content_scripts": {"js":["contentscript.js"], "matches":["<all_urls>"]}}
// contentscript.js:
chrome.extension.sendMessage({ .. any request .. }, function(response) {
// Do something with response.
});
背景页面的附录:
chrome.extension.onMessage.addListener(function(message, sender, sendResponse) {
// Instead of checking for index == -1, you can also see if the ID matches
// the ID of a previously created offscreenTab
if (sender.tab && sender.tab.index === -1) {
// index is negative if the tab is invisible
// ... do something (logic) ...
sendResponse( /* .. some response .. */ );
}
});
使用内容脚本,您可以完全访问页面的 DOM。但不是全局对象。如果要在页面上下文中运行代码,则必须注入脚本(请参阅此答案)。
另一个可能有用的 API 是chrome.webRequest
API。它可用于修改标头/中止/重定向请求。注意:它不能用于读取或修改响应。
目前,该offscreenTabs
API 是实验性的。要使用它,您必须通过 启用实验性 API chrome://flags
,并将其添加"permissions":["experimental"]
到您的清单文件中。一旦不再是实验性的,请使用"permissions":["offscreenTabs"]
.