0

再会。

我在将消息从后台脚本发送到内容脚本时遇到问题。每次用户在浏览器选项卡之间切换时,我都会尝试发送消息。

我得到这个错误。 Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.

下面是扩展程序本身的代码。

背景脚本:

chrome.tabs.onActivated.addListener(function changeTab(activeInfo) {

    var port = chrome.tabs.connect(activeInfo.tabId);
    console.log(port);
    port.postMessage({tabId: activeInfo.tabId});

});

内容脚本:

chrome.runtime.onConnect.addListener(function(port) {
    console.log(11111111);
    port.onMessage.addListener(function(msg) {
        console.log(22222222);
        if(msg == undefined || Object.keys(msg).length == 0) return;
        if(msg.checkExtensionRBPopup)
            port.postMessage({active: window.localStorage.getItem('extension_rb_popup')});
    });
});

显现:

{
  "manifest_version": 2,
  "name": "Rebatemango Extension",
  "description": "Rebatemango",
  "version": "1.0",
  "browser_action": {
    "default_popup": "popup.html"
  },
  "content_scripts": [
    {
      "matches": [
        "<all_urls>"
      ],
      "js": [
        "content.js",
      ]
    }
  ],
  "permissions": [
    "background",
    "tabs",
    "activeTab",
    "declarativeContent",
    "storage",
    "clipboardWrite",
    "cookies",
    "tabCapture",
    "displaySource",
    "webNavigation"
  ],
  "background": {
    "scripts": [
      "js/jquery.js",
      "js/libs.js",
      "background.js"
    ],
    "persistent": false
  },
  "icons": {
    "16": "images/mango.png",
    "48": "images/mango.png",
    "128": "images/mango.png"
  }
}

请告诉我我做错了什么?如何修复或跟踪此错误?

4

1 回答 1

1

您的内容脚本正在使用port.postMessage,但后台脚本中端口的另一侧没有侦听器,这就是显示错误的原因。

解决方案:

使用简单的消息传递。不要使用端口,这里不需要它,并且您的实现会导致内存泄漏,因为它每次都会创建一个新端口而不释放它。简单的消息传递会自动处理这个。

chrome.tabs.sendMessage(activeInfo.tabId, {foo: 1}, response => {
  if (chrome.runtime.lastError) return;
  console.log(response);
});

内容脚本监听器:

chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
  console.log(msg);
  sendResponse({bar: 2});
});

其他原因。

如果在发送消息的确切时刻没有运行内容脚本,也可能会出现错误消息。这可能是因为默认情况下内容脚本在网页中的 DOMContentLoaded 事件之后运行。或者,该选项卡可能包含不受支持的 URL,例如来自扩展页面的 chrome:// 或 chrome-extension:// 或https://chrome.google.com/webstore/或 runtime_blocked_hosts 策略禁止的任何 URL。对于第一个问题,您可以在 manifest.json 中的内容脚本声明中添加“run_at”:“document_start” 。对于其他情况,除了抑制和忽略错误消息外,您无能为力。

后台脚本也会发送{tabId: activeInfo.tabId},但内容脚本中的 onMessage 侦听器不会读取它。相反,如果它不是发布问题的复制粘贴工件,它会读取msg.checkExtensionRBPopup没有任何意义。

于 2019-12-08T14:40:18.870 回答