看看offscreenTabs
API(目前是实验性的)。
使用 创建选项卡后chrome.experimental.offscreenTabs.create
,您可以使用chrome.tabs.sendMessage
或chrome.tabs.executeScript
做任何您想做的事情。
如果您需要灵感,请查看此完整演示。
根据规范,只能在真实选项卡中创建离屏选项卡(否则,您将收到“Experimental.offscreenTabs.create 期间出错:未找到当前选项卡”)。在我的另一个演示中,我为此使用了一个选项页面。如果您不想使用这样的页面,请使用 创建一个新选项卡chrome.tabs.create
,做任何您想做的事情,然后使用window.close()
关闭选项卡。
因此,您毕竟将打开一个(隐藏的)选项卡(尽管页面本身不可见)。使用当前的 API,没有其他方法可以在不打开选项卡的情况下呈现隐藏选项卡(除非您想在后台页面的 iframe 中呈现页面......)。如果您不介意实际的选项卡显示在选项卡栏中,请使用chrome.tabs.create({active:false, url:'...'})
. 如果保持标签对用户真正不可见很重要,请继续以下演示:
使用 offscreenTabs API 进行演示
在此示例中,我将显示一个包含不可见选项卡标题的警报。我可以立即从内容脚本中显示此警报,但是,我将把数据传递到后台页面,以演示该功能:
后台脚本(background.js
):
chrome.extension.onMessage.addListener(function(message, sender, sendResponse) {
var tab = sender.tab;
if (tab && tab.index === -1) { // <-- Detect offscreen tab
if (message.method == 'title') {
// Close helper tab:
chrome.extension.sendMessage({method: 'finishedTab', id: tab.id});
alert('Got title from ' + tab.url + ' :\n' + message.result);
}
}
});
chrome.browserAction.onClicked.addListener(function() {
chrome.tabs.create({
active: false,
url: chrome.extension.getURL('launcher.html')
});
});
内容脚本(contentscript.js
):
chrome.extension.sendMessage({
method: 'title',
result: document.title
});
launcher.html
包含<script src="launcher.js"></script>
. launcher.js
:
var offscreenTabId;
// Close the tab when the stuff is done
chrome.extension.onMessage.addListener(function(message) {
if (message.method == 'finishedTab' && message.id === offscreenTabId) {
window.close();
}
});
// Create invisible tab
var createProperties = {url: "https://stackoverflow.com/"};
chrome.experimental.offscreenTabs.create(createProperties, function(offscreenTab) {
offscreenTabId = offscreenTab.id;
});
清单文件:
{
"name": "Get information from DOM in an invisible tab",
"description": "See https://stackoverflow.com/q/13714002",
"version": "1",
"manifest_version": 2,
"permissions": ["experimental", "<all_urls>"],
"background": {"scripts": ["background.js"] },
"content_scripts": [{
"js": ["contentscript.js"],
"matches": ["<all_urls>"]
}],
"browser_action": {}
}