我使用清单2。我有一个扩展,需要打开一个"非活动标签";到一个特定的url,收集信息,并发送消息到后台关闭这个选项卡,当我们完成。当我将消息发送到后台时,我尝试使用以下命令之一关闭选项卡。
setTimeout( () => {
chrome.tabs.highlight({ tabs: sender.tab.index }, function () {
chrome.tabs.remove(sender.tab.id);
});
}, 500);
OR
setTimeout(function () {
chrome.tabs.update(sender.tab.id, { active: true }, function () {
chrome.tabs.remove(sender.tab.id);
});
}, 500);
这两个都是不成功的,直到我实际单击选项卡来激活它,然后选项卡将执行remove调用。
这些是我在扩展中设置的权限。
"permissions": [
"activeTab",
"tabs",
"notifications",
"contextMenus",
"storage",
"<all_urls>"
]
有人有什么建议吗?
提前感谢,汤姆
我准备了一个最小的manifest v2示例来展示如何使用回调样式实现此行为。
manifest.json
这里"https://www.google.com/*"
是打开选项卡的url示例;可以是任何东西
{
"name": "EXAMPLE",
"version": "0.0.0",
"manifest_version": 2,
"permissions": [
"activeTab",
"https://www.google.com/*"
],
"background": {
"scripts": ["background.js"]
}
}
content.js
内容脚本将立即发送消息在消息传递注册监听器。
chrome.runtime.sendMessage({msg: document.body.innerText});
background.js
// step 1: create tab
chrome.tabs.create({
// tab properties
active: false,
url: 'https://www.google.com/'
}, ({id: createdTabId}) => {
// step 2: register listener to receive message from tab
chrome.runtime.onMessage.addListener((request, sender) => {
// step 4. using tab id to identify response from same tab
if (createdTabId === sender.tab.id) {
// close the created tab
chrome.tabs.remove(createdTabId);
// do something with the received data
window.alert(`message from tab: ${request.msg}`);
}
}
);
// step 3: programmatically load content script after registering listener
// in MV3 this is called: chrome.scripting.executeScript
chrome.tabs.executeScript(createdTabId, {file: 'content.js'});
});
背景脚本依次做四件事:
- 创建非活动选项卡
- 注册一个侦听器以接收来自创建的选项卡的响应
- 将内容脚本加载到创建的选项卡
- 接收到消息后,显示消息值
我使用选项卡id来标识消息发送者,这需要在注册侦听器之前等待选项卡创建完成,然后加载内容脚本,因为内容脚本将立即发送响应。这是一种选择。另一种方法是在manifest中指定加载特定匹配模式的内容脚本,在打开选项卡之前注册侦听器,并使用选项卡id以外的东西作为标识选项卡响应的条件。