我有一个扩展程序,希望将标签页在不同时间聚焦几秒钟。
我可以更改选项卡,但是,我希望在焦点指向选项卡时传递回调函数。
我尝试将函数传递给sendMessage
,但它似乎立即执行(如下所示)。标签集中后,如何传递回调函数以在内容脚本中执行?
content_script.js
chrome.runtime.sendMessage("Do something", function(resp) {
console.log(resp)
})
background.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
});
});
答案 0 :(得分:1)
Return true
from onMessage listener保持响应通道打开,然后从chrome API回调中调用sendResponse
。请注意,Chrome API回调始终运行asynchronously,即在主要功能完成后运行。
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'};
});