google-chrome - 选项卡处于活动状态后的 Chrome 扩展回调
问题描述
我有一个扩展,我想在不同的时间集中标签几秒钟。
我可以更改选项卡,但是,我想在选项卡聚焦时传递一个回调函数。
我尝试将一个函数传递给,sendMessage
但它似乎立即执行(见下文)。一旦选项卡获得焦点,如何传入要在内容脚本中执行的回调函数?
content_script.js
chrome.runtime.sendMessage("Do something", function(resp) {
console.log(resp)
})
背景.js
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse){
chrome.windows.update(sender.tab.windowId, {"focused": true}, function(window){ });
chrome.tabs.update(sender.tab.id, {"active": true}, function(tab){
// callback function
});
});
解决方案
true
从 onMessage 侦听器返回以保持响应通道打开,然后sendResponse
从 chrome API 回调中调用。请注意,chrome API 回调始终异步运行,即在主函数完成后。
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
let callbackCounter = 2;
chrome.tabs.update(sender.tab.id, {active: true}, function (tab) {
// this callback runs after the parent function has finished
if (--callbackCounter === 0) {
sendResponse({foo: 'bar'});
}
});
chrome.windows.update(sender.tab.windowId, {focused: true}, function (window) {
// this callback runs after the parent function has finished
if (--callbackCounter === 0) {
sendResponse({foo: 'bar'});
}
});
// keep the response channel open
return true;
});
在现代浏览器中,这通常使用 Promise API 来解决。
您可以通过加载Mozilla WebExtension polyfill将其与 Chrome API 一起使用。
browser.runtime.onMessage.addListener((request, sender) => {
return Promise.all([
browser.tabs.update(sender.tab.id, {active: true}),
browser.windows.update(sender.tab.windowId, {focused: true}),
]).then(() => {
// .........
return {foo: 'bar'};
});
});
polyfill 还使您能够使用 await/async 语法:
browser.runtime.onMessage.addListener(async (request, sender) => {
await Promise.all([
browser.tabs.update(sender.tab.id, {active: true}),
browser.windows.update(sender.tab.windowId, {focused: true}),
]);
return {foo: 'bar'};
});
推荐阅读
- python - python,requests,lxml:在 CSS 网格上模拟选项卡更改
- python - 有没有办法从列表中的每个项目中删除相同的字符?
- reactjs - 如何在 React 弹出窗口中显示外部 html
- sql - 具有逐行子查询的 sql 列
- python - 在 Python 中测试期间的 CPU 利用率?
- javascript - React:如何在 API 数据加载到我的 chart.js 图表时显示加载微调器
- sql - Oracle sql检查日期字段的约束
- python - 是否有可能将 NaN 值作为空白写入 txt 文件?
- mongodb - 子查询来计算 MongoDb 中字段的不同值的数量
- json - 在 Azure 数据工厂中解析复杂的 JSON