Google 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

我的chrome扩展使用长寿命的“端口”对象在“内容脚本”和“弹出”页面之间传递消息。“弹出窗口”能够向“内容脚本”事件侦听器发送消息。但是,“内容脚本”中的“端口”对象无法将消息发送到“弹出”页面

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的历史记录,请参阅)。缺少文档是一个缺陷: