0

我一直在寻找示例和参考,但一无所获。我在 offscreenTab 源代码中发现了一条注释,提到它不能从背景页面实例化(它没有与 offscreenTab 相关的选项卡)。在其他地方我发现提到弹出窗口也与选项卡没有关系。

如何在 Chrome 扩展程序中成功创建 offscreenTab?

4

1 回答 1

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

要更改 URL,请使用chrome.experimental.offscreenTabs.update.

offscreenTab.id是一个 tabId,应该与chrome.tabsAPI 一起使用。但是,至少在 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.webRequestAPI。它可用于修改标头/中止/重定向请求。注意:它不能用于读取或修改响应。

目前,该offscreenTabsAPI 是实验性的。要使用它,您必须通过 启用实验性 API chrome://flags,并将其添加"permissions":["experimental"]到您的清单文件中。一旦不再是实验性的,请使用"permissions":["offscreenTabs"].

于 2012-07-06T11:14:54.950 回答