我一直在寻找示例和参考,并且没有提出任何建议。我在offscreenTab源代码中发现了一个注释,提到它无法从后台页面实例化(它没有与offscreenTab相关的选项卡)。在其他地方我发现提到弹出窗口也没有与标签相关联。
如何在Chrome扩展程序中成功创建offscreenTab?
答案 0 :(得分:1)
根据文档,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 !
});
要更改网址,请使用chrome.experimental.offscreenTabs.update
。
offscreenTab.id
是一个tabId,应该与chrome.tabs
API一起使用。但是,至少在Chrome 20.0.1130.1中,情况并非如此。 tabs
API的所有方法都无法识别返回的tabID。
解决方法是使用manifest file注入内容脚本,例如:
{"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。但不是全球性的对象。如果要在页面上下文中运行代码,则必须注入脚本(请参阅this answer)。
另一个可能有用的API是chrome.webRequest
API。它可用于修改标头/中止/重定向请求。注意:它不能用于读取或修改响应。
目前,offscreenTabs
API是实验性的。要使用它,您必须通过chrome://flags
启用实验性API,并将"permissions":["experimental"]
添加到清单文件中。一旦它不再是实验性的,请使用"permissions":["offscreenTabs"]
。