Chrome 扩展 - 多端口消息传递

Chrome extension - Messaging with multiple ports

在我的扩展中,不同的内容脚本连接到 background.js 以相互通信。我遇到的问题是,当我在一个端口上收到一条消息时,我无法将此信息转发到另一个端口。我得到的错误是:

Error: Attempting to use a disconnected port object

我的代码在background.js

chrome.runtime.onConnect.addListener(function(port) {
  if(port.name === "menuport") {
    port.onMessage.addListener(function(msg) {
      console.log('BGJS from menuport')
      console.log(msg)
      var page_port = chrome.runtime.connect({name: "pageport"});
      page_port.postMessage(msg);
    });
  } else if (port.name === "pageport") {
    port.onMessage.addListener(function(msg) {
      console.log('BGJS from pageport')
      console.log(msg)
    });
  }
});

页面端口在 content.js 中激活:

var page_port = chrome.runtime.connect({name: "pageport"});
page_port.postMessage({source: "page", status: "ready"});
page_port.onMessage.addListener(function(msg) {
    console.log(msg)
});

menuport 使用类似的脚本。两个端口的激活都有效,我可以在控制台中看到。但是我无法 post 从 background.js.

向端口发送消息

在 background.js,当您收到 onConnect 回调时,您需要将该端口存储为一个变量,以便您以后可以重用它。我看到您丢弃了 port.name=="pageport" 下的端口变量,这导致它被垃圾收集(并断开连接)。将其存储为 window.page_port.

我认为你试图从两方面"connect",这没有意义。

一侧连接,另一侧等待 onConnect 事件。