【问题标题】:Chrome Extension Port error: Could not establish connection. Receiving end does not existChrome 扩展端口错误:无法建立连接。接收端不存在
【发布时间】:2013-01-19 22:06:21
【问题描述】:

我已尝试浏览此处发布的类似问题,但似乎没有任何效果

Manifest.json

{
    "manifest_version": 2,
    "name" : "A simple Found Text Demo",
    "description" : "Bla",
    "version" : "1.0",
    "background" : {
        "pages" : "background.html"
    },
    "page_action" : {
        "default_icon" : "icon.png"
    },

    "content_scripts" : [{
        "matches" : ["*://*/*"],
        "js" : ["contentscript.js"]
    }]
}

背景.html

<html>
 <script>
    chrome.extension.onMessage.addListener(
            function(request, sender, sendResponse){
            alert(request);

    //chrome.pageAction.show(sender.tab.id);
            sendResponse('Found!');
            }
    )
 </script>
</html>

内容脚本.js

chrome.extension.sendMessage({"name" : "hola"}, function(res){
     console.log(res); })

但是我反复遇到同样的错误:

Port error: Could not establish connection. Receiving end does not exist.

有什么想法吗?

【问题讨论】:

  • 这发生在您加载的每个页面上?
  • 是的,我认为这无关紧要,我实际上允许任何页面调用此扩展程序 (://*/)
  • 这很重要,因为伪协议(chrome:file:view: ...)不允许注入,它们可能会产生像你这样的错误。这就是我问它的原因。但是,@RocketDonkey 是对的。清单版本 2 不允许内联脚本。
  • @Ragnarokkr 提出了一个很好的观点(我记得被骗了) - 很多时候我只是刷新chrome://extensions 选项卡并检查我的更改是否有效。但是我注意到我会一直遇到这些端口错误(因为清单中只有http/https)。因此,我开始养成跳到另一个页面进行测试的习惯。

标签: google-chrome-extension


【解决方案1】:

由于事情更改为manifest 2,实际上不再允许您使用内联脚本(例如您在上面&lt;script&gt; 标记中的background.html 中的内容。请参阅here)。我不确定你的用例,但在大多数情况下是简单的情况(阅读:我做过的东西:)),你实际上不需要用任何东西填充background.html。相反,您可以直接传入一个 background.js 文件,该文件将包含与您上面相同的脚本。因此,您可以尝试将您的 manifest.json 更改为:

{
    "manifest_version": 2,
    "name" : "A simple Found Text Demo",
    "description" : "Bla",
    "version" : "1.0",
    "background" : {
        "scripts" : ["background.js"]
    },
    "page_action" : {
        "default_icon" : "icon.png"
    },

    "content_scripts" : [{
        "matches" : ["*://*/*"],
        "js" : ["contentscript.js"],
        "run_at": "document_end"
    }]
}

请注意,我们在这里做了两件事 - 将 background 内部的 scripts 更改为 scripts 并将其指向 ["background.js"],然后将 "run_at": "document_end" 添加到 content_scripts 部分的末尾。如果忽略,这肯定会导致问题(类似于您现在看到的问题) - 您现在告诉内容脚本在页面加载后运行。如果它立即运行,您将面临后台页面未加载的风险,这意味着它尚未准备好接收消息并为您提供连接错误。下面是background.js,它与您之前在&lt;script&gt; 标签之间的脚本相同:

chrome.extension.onMessage.addListener(
        function(request, sender, sendResponse){
        alert(request);

//chrome.pageAction.show(sender.tab.id);
        sendResponse('Found!');
        }
)

【讨论】:

  • @AshwiniKhare 完全不用担心 - 我记得那个开关为我扔了各种各样的扳手:) 祝一切顺利。
猜你喜欢
  • 2012-08-02
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多