chrome广播消息到内容脚本

chrome broadcast message to content scripts

本文关键字:脚本 广播 消息 chrome      更新时间:2023-09-26

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

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

我认为您的意思是chrome.tabs.sendMessage具有选项卡ID参数。

Chrome API中有2个sendMessage函数:

  • chrome.runtime.sendMessage将广播到在chrome-extension://your-extension-id/原点中运行的所有页面

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

  • chrome.tabs.sendMessage将广播到在提供的选项卡中运行的扩展的所有内容脚本(很快就可以按帧进行筛选),如果没有提供ID,则广播到当前活动选项卡

不幸的是,没有向所有内容脚本广播的功能。所以,你有两种可能的方法:

1-地毯式轰炸

只需一个接一个地广播到所有选项卡!

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

2-选项卡/连接跟踪

您可以更加积极主动地跟踪准备接收邮件的选项卡。然而,维护这个列表可能会很乏味。

在实践中,您可以让内容脚本打开到后台页面的端口连接,然后使用打开端口列表向它们发送命令。不利的一面是,您不能使用事件页面进行此操作,因为它需要保持连接打开。