chrome广播消息到内容脚本

时间:2015-03-03 06:33:18

标签: javascript google-chrome google-chrome-extension

有没有办法将Chrome消息广播到Chrome扩展程序的所有内容脚本?

chrome.runtime.sendMessage()将tabId作为输入。但是,如果有多个选项卡与内容脚本一起运行,那么如何向所有选项卡广播?

1 个答案:

答案 0 :(得分:5)

我假设你的意思是chrome.tabs.sendMessage有标签ID参数。

Chrome API中有2个sendMessage个功能:

  • chrome.runtime.sendMessage将广播到chrome-extension://your-extension-id/来源的所有网页。

    这将是后台页面,弹出窗口(如果打开),选项页面(如果打开)以及您自己打开的扩展页面的任何选项卡。

  • chrome.tabs.sendMessage将广播到所提供的标签中运行的扩展程序的所有内容脚本(很快可能会逐帧过滤),或者如果未提供ID,则会显示当前活动标签。

遗憾的是,没有功能可以广播到所有内容脚本。所以,你有两种可能的方法:

地毯式轰炸

只需逐个播放所有标签!

chrome.tabs.query({}, function(tabs) {
  tabs.forEach(function(tab) {
    chrome.tabs.sendMessage(tab.id, message);
  });
});

如果您想通过匹配模式缩小范围,可以:

// Even accepts arrays of patterns!
chrome.tabs.query({url: "*://*.example.com/*"}, function(tabs) {
  tabs.forEach(function(tab) {
    chrome.tabs.sendMessage(tab.id, message);
  });
});

标签/连接跟踪

您可以更加主动,并跟踪准备接收邮件的标签。但是,维护该列表可能会很乏味。

实际上,您可以改为使内容脚本打开到后台页面的端口连接,然后使用开放端口列表向它们发送命令。缺点是您不能使用事件页面,因为它需要保持连接打开。