Chrome扩展程序“接收端不存在。”错误

时间:2019-05-09 09:13:33

标签: javascript google-chrome-extension

我正在使用Chrome扩展程序,但是最近我发现我遇到了以下错误(指向popup.html的第一行):

  

未经检查的runtime.lastError:无法建立连接。接收   结束不存在。

我发现了类似的问题here。但是那里的错误是由我未在清单中声明的​​background属性引起的。

我正在chrome.extension.onMessage.addListener脚本上使用contents.js监听事件,并在chrome.tabs.sendMessage脚本上使用popup.js发送事件。在大多数情况下,一切正常,但有时我会遇到上述错误,并且所有请求都无济于事。

manifest.json的格式如下:

{
    "manifest_version": 2,
    "name": "APP_NAME",
    "description": "APP_DESCRIPTION",
    "version": "APP_VERSION",
    "browser_action": {
        "default_icon": "icon.png",
        "default_popup": "popup.html"
    },
    "permissions": [
        "activeTab",
        "storage",
        "clipboardRead",
        "clipboardWrite"
    ],
    "content_scripts": [
        {
            "matches": [
                "<all_urls>"
            ],
            "js": [
                "content.js"
            ],
            "css": [
                "content.css"
            ]
        }
    ]
}

消息侦听器示例:

chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
  if (request.action === "this") console.log({
    dom: doThis()
  });
  if (request.action === "that") sendResponse({
    dom: doThat()
  });
  else if (request.action === "other") doOther();
  else sendResponse({});
});

邮件发件人示例:

function getSelectedTab() {
  return new Promise(function(resolve) {
    chrome.tabs.getSelected(null, resolve);
  });
}

function sendRequest(data) {
  data = data || {
    action: undefined
  };
  return new Promise(function(resolve) {
    getSelectedTab().then(function(tab) {
      chrome.tabs.sendMessage(tab.id, data, resolve);
    });
  });
}

发送请求调用示例:

document.querySelector("#this").addEventListener("click", function() {
  sendRequest({
    action: "this"
  }).then(function(res) {
    console.log(res);
  });
});

document.querySelector("#that").addEventListener("hover", function() {
  sendRequest({
    action: "that"
  });
});

addEventListener("blur", function() {
  sendRequest({
    action: "other"
  });
});

1 个答案:

答案 0 :(得分:0)

我不确定我的答案是否适合给定的情况,但是如果您阅读它,就会遇到此类问题,也许我的答案会为您提供帮助。

我花了很多时间,试图了解为什么在我使用开发版本时有时会引发此错误,而对于我的扩展的发行版却不这样做。然后我了解到,每次保存代码后,它都会在chrome上更新,并创建脚本的新内容版本。因此,如果您不重新加载页面,则使用先前版本的代码创建context.js并使用更新的版本再次尝试,则会引发此错误。

我只是花了整整一天的时间来弄清楚,这很简单,但是关于这种情况,stackoverflow中有很多答案,所以您过去常常尝试一下,而不用脑子思考。不要像我:)