【问题标题】:chrome broadcast message to content scriptschrome 向内容脚本广播消息
【发布时间】:2015-05-03 17:33:37
【问题描述】:

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

chrome.runtime.sendMessage() 将 tabId 作为输入。但是,如果有多个标签与内容脚本一起运行,一个如何广播到所有标签?

【问题讨论】:

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


    【解决方案1】:

    我假设您的意思是 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);
      });
    });
    

    标签/连接跟踪

    您可以更加积极主动地跟踪准备好接收您的消息的标签。但是,维护该列表可能很乏味。

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

    【讨论】:

      猜你喜欢
      • 2014-02-04
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多