在我的扩展程序中,不同的内容脚本连接到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中激活了pageport:
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使用类似的脚本。我可以在控制台中看到两个端口的激活工作。但是,我无法从background.js发送消息到端口。
答案 0 :(得分:2)
在background.js上,当您收到onConnect回调时,您需要将该端口存储为变量,以便稍后重用。我看到你丢弃了port.name ==" pageport"下的port变量,这导致它被垃圾收集(和断开连接)。将其存储为window.page_port。
我认为你正试图连接"来自双方,这是没有意义的。
一方连接,另一方等待onConnect事件。