0

我工作的一个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" });通过访问这里

enter image description here

开发者工具和事实证明,我的查询实际上并不返回任何标签步入回调使tabs[0].id产生了一个错误。我猜测,一旦我得到这个选项卡查询工作消息传递将开始工作,所以没有人知道这里发生了什么,我不能查询当前,活动选项卡?我已经看到了在许多其他StackOverflow响应中使用的确切查询,并且在message passing docs的示例中。

回答

3

请确保当前的活动标签允许注入内容脚本,也就是说,当您在背景页面中调用chrome.tabs.query时,活动标签页不是chrome://extensions页面。这通常发生在重新加载扩展程序时,在这种情况下,在调用chrome.tabs.query({active: true, currentWindow: true})后,您将得到带有chrome://extensions url的选项卡,而此页面不允许默认注入内容脚本。

为了避免这种情况,你可以调整你的消息传递方式:

  1. 你可以starting the message passing from content scripts
  2. 您还可以添加一些其他触发点来启动消息传递。例如,单击browserAction时调用chrome.tabs.query
+0

我的解决方案是从内容脚本开始传递消息。谢谢!我仍然很好奇,为什么以其他方式做这件事并不奏效,如果这样做是不可能的,为什么Chrome的文档有一个这样做的例子。 – azrosen92

+1

@ azrosen92,我不是说从背景页面开始时它不起作用。只是因为查询结果是不能用内容脚本注入的'chrome:// extensions'页面,所以时间不适合。你可以尝试第二种方式,添加一个特定的触发点。 –

相关问题