chrome广播消息到内容脚本

Kev*_*ang 4 javascript google-chrome google-chrome-extension

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

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

Xan*_*Xan 5

我假设您的意思是chrome.tabs.sendMessage使用标签ID参数.

sendMessageChrome API中有两个功能:

  • 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);
  });
});
Run Code Online (Sandbox Code Playgroud)

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

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

标签/连接跟踪

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

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