Chrome 扩展背景激活非活动标签
Chrome extension background activating inactive tab
我正在使用清单 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);
这两个都不成功,直到我真正点击选项卡激活它,然后选项卡将执行删除调用。
这些是我在扩展程序中设置的权限。
"permissions": [
"activeTab",
"tabs",
"notifications",
"contextMenus",
"storage",
"<all_urls>"
]
大家有什么建议吗?
提前致谢,
汤姆
我准备了一个最小清单 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 来识别消息发送者,这需要等待选项卡创建完成才能注册侦听器,然后加载内容脚本,因为内容脚本会立即发送响应。这是一个选择。另一种方法是在清单中指定内容脚本以加载特定匹配模式,在打开选项卡之前注册侦听器,并使用选项卡 ID 以外的其他内容作为识别来自选项卡的响应的条件。
我正在使用清单 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);
这两个都不成功,直到我真正点击选项卡激活它,然后选项卡将执行删除调用。
这些是我在扩展程序中设置的权限。
"permissions": [
"activeTab",
"tabs",
"notifications",
"contextMenus",
"storage",
"<all_urls>"
]
大家有什么建议吗?
提前致谢, 汤姆
我准备了一个最小清单 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 来识别消息发送者,这需要等待选项卡创建完成才能注册侦听器,然后加载内容脚本,因为内容脚本会立即发送响应。这是一个选择。另一种方法是在清单中指定内容脚本以加载特定匹配模式,在打开选项卡之前注册侦听器,并使用选项卡 ID 以外的其他内容作为识别来自选项卡的响应的条件。