首页 > 解决方案 > 选项卡处于活动状态后的 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
  });
});

标签: google-chromegoogle-chrome-extension

解决方案


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'};
});

推荐阅读