我工作的一个Chrome扩展,涉及消息通过消息传递端口从的背景脚本到内容脚本。根据documentation我必须先查询我要连接的内容脚本的标签,然后使用该标签的ID打开一个端口。所以,我的背景剧本和内容脚本如下所示:开放背景和content_script之间的消息端口的Chrome扩展
background.js
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
var port = chrome.tabs.connect(tabs[0].id, { name: "example" });
port.postMessage("hello world");
});
content_script.js
chrome.runtime.onConnect.addListener(function(port) {
port.onMessage.addListener(function(msg) {
console.log(msg);
});
});
而且没有消息打印到控制台。我首先在content_script port.onMessage.addListener(function(msg) {
这条线上放了一个断点,这是从未命中的。这使我相信该端口从未在background.js中打开过。所以接下来,我把一个破发点中background.js在该行var port = chrome.tabs.connect(tabs[0].id, { name: "example" });
通过访问这里
开发者工具和事实证明,我的查询实际上并不返回任何标签步入回调使tabs[0].id
产生了一个错误。我猜测,一旦我得到这个选项卡查询工作消息传递将开始工作,所以没有人知道这里发生了什么,我不能查询当前,活动选项卡?我已经看到了在许多其他StackOverflow响应中使用的确切查询,并且在message passing docs的示例中。
我的解决方案是从内容脚本开始传递消息。谢谢!我仍然很好奇,为什么以其他方式做这件事并不奏效,如果这样做是不可能的,为什么Chrome的文档有一个这样做的例子。 – azrosen92
@ azrosen92,我不是说从背景页面开始时它不起作用。只是因为查询结果是不能用内容脚本注入的'chrome:// extensions'页面,所以时间不适合。你可以尝试第二种方式,添加一个特定的触发点。 –