Chrome扩展背景激活非活动选项卡



我使用清单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'});
});

背景脚本依次做四件事:

  1. 创建非活动选项卡
  2. 注册一个侦听器以接收来自创建的选项卡的响应
  3. 将内容脚本加载到创建的选项卡
  4. 接收到消息后,显示消息值

我使用选项卡id来标识消息发送者,这需要在注册侦听器之前等待选项卡创建完成,然后加载内容脚本,因为内容脚本将立即发送响应。这是一种选择。另一种方法是在manifest中指定加载特定匹配模式的内容脚本,在打开选项卡之前注册侦听器,并使用选项卡id以外的东西作为标识选项卡响应的条件。

相关内容

  • 没有找到相关文章

最新更新