有没有办法向chrome扩展的所有内容脚本广播chrome消息?chrome.runtime.sendMessage()接受一个tabId作为输入。2但是如果有多个标签在内容脚本中运行,那么如何广播到所有的标签呢?
osh3o9ms1#
我假设您指的是具有选项卡ID参数的chrome.tabs.sendMessage。Chrome API中有2个sendMessage函数:
chrome.tabs.sendMessage
sendMessage
chrome.runtime.sendMessage
chrome-extension://your-extension-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); }); });
你可以更积极主动地跟踪那些准备接收你的消息的标签,但是维护这个列表可能会很乏味。在实践中,你可以让内容脚本打开连接到后台页面的端口,然后使用打开端口列表向它们发送命令。缺点是你不能使用事件页面,因为它需要保持连接打开。
1条答案
按热度按时间osh3o9ms1#
我假设您指的是具有选项卡ID参数的
chrome.tabs.sendMessage
。Chrome API中有2个
sendMessage
函数:chrome.runtime.sendMessage
将广播到在chrome-extension://your-extension-id/
源中运行的所有页面。这将是背景页,弹出窗口(如果打开),选项页(如果打开)和任何标签的扩展页您打开自己。
chrome.tabs.sendMessage
将广播到在提供的选项卡中运行的扩展的所有内容脚本(很快就可以按帧过滤),如果没有提供ID,则广播到当前活动的选项卡。遗憾的是,没有向所有内容脚本广播的函数。因此,您有两种可能的方法:
1 -地毯式轰炸
只需广播到所有标签一个接一个!
如果要按匹配模式缩小范围,可以:
2 -翼片/连接跟踪
你可以更积极主动地跟踪那些准备接收你的消息的标签,但是维护这个列表可能会很乏味。
在实践中,你可以让内容脚本打开连接到后台页面的端口,然后使用打开端口列表向它们发送命令。缺点是你不能使用事件页面,因为它需要保持连接打开。