Google chrome Chrome消息传递错误:试图使用断开连接的端口对象
我的chrome扩展使用长寿命的“端口”对象在“内容脚本”和“弹出”页面之间传递消息。“弹出窗口”能够向“内容脚本”事件侦听器发送消息。但是,“内容脚本”中的“端口”对象无法将消息发送到“弹出”页面Google chrome Chrome消息传递错误:试图使用断开连接的端口对象,google-chrome,google-chrome-extension,Google Chrome,Google Chrome Extension,我的chrome扩展使用长寿命的“端口”对象在“内容脚本”和“弹出”页面之间传递消息。“弹出窗口”能够向“内容脚本”事件侦听器发送消息。但是,“内容脚本”中的“端口”对象无法将消息发送到“弹出”页面 var port = chrome.extension.connect({"name":"swap"}); // listener for incoming connections chrome.extension.onConnect.addListener(function( incomingP
var port = chrome.extension.connect({"name":"swap"});
// listener for incoming connections
chrome.extension.onConnect.addListener(function( incomingPort ){
// listener on incoming messages
incomingPort.onMessage.addListener(function( msg ){
if( msg.command === 'get_scripts' ){
//do work
}
var scrs = { 'scripts' : 'name' };
var result = port.postMessage( scrs );
});
});
执行“port.postMessage(Object obj)”时,插件抛出以下错误:
Error in event handler for 'undefined': Attempting to use a disconnected port object Error: Attempting to use a disconnected port object
at PortImpl.postMessage (miscellaneous_bindings:54:5)
at chrome-extension://loiamkgdhfjdlkcpehnebipeinpcicfj/swap.js:27:31
at [object Object].dispatch (event_bindings:203:41)
at Object.<anonymous> (miscellaneous_bindings:250:22) event_bindings:207
事件处理程序中“未定义”的错误:尝试使用断开连接的端口对象错误:尝试使用断开连接的端口对象
在PortImpl.postMessage(杂项绑定:54:5)
在铬-extension://loiamkgdhfjdlkcpehnebipeinpcicfj/swap.js:27:31
在[object object].dispatch(事件绑定:203:41)
反对
这个插件出了什么问题?我已经浏览了你的代码,但它对我来说毫无意义:
- 您知道端口两边都有
和onMessage
方法吗?一个端口足以在两个方向上进行通信postMessage
- 以您的方式在弹出窗口和内容脚本之间进行通信将非常困难。很难同时启动内容脚本和弹出窗口
popup.html
和popup.js
。
- 将事件侦听器添加到,以接收端口请求
- 用于在“当前”选项卡中选择当前窗口。(-2是常数)
接收一个参数:选项卡数组。因为当前窗口不可能没有选项卡,所以选择数组的第一个元素:回调函数
var tab=tabs[0]代码>
- 现在,使用来执行内容脚本
- 在内容脚本中,使用连接到弹出窗口
- 你的逻辑在这里
port==null
检查端口是否有效。如果这样做,请确保在断开端口连接时通过使变量无效来进行比较:
var port;
chrome.runtime.onConnect.addListener(function(_port) {
// ...optional validation of port.name...
port = _port;
port.onMessage.addListener(function(message) { /* .. logic .. */});
port.onDisconnect.addListener(function() {
port = null;
});
});
感谢您通读代码并展示方法。我尝试了一个带有“回调”的“端口”方法。请参阅和。但是,我在这个例子中也遇到了同样的错误?@Nambi您仍然在通过清单文件执行内容脚本。确保你按照我回答的所有步骤去做。你的建议很有效。现在插件已经工作了,我想在插件弹出窗口和内容脚本之间使用适当的消息传递。是不是设计不好?还是不是chrome插件的首选设计模式?@Nambi为什么会是糟糕的设计?这是一种工作正常的固溶体。@RafiqueMohammed有一个
chrome.extension.onConnect
,但建议使用chrome.runtime.onConnect
(有关此API的历史记录,请参阅)。缺少文档是一个缺陷: