Chrome扩展程序中接收错误:未选中runtime.lastError:无法建立连接。接收端不存在

时间:2019-12-06 13:34:10

标签: google-chrome google-chrome-extension

我正在尝试创建一个非常简单的Chrome扩展程序,该扩展程序将使我能够突出显示网页上的单词,右键单击以打开上下文菜单,然后在单词Whitaker's Words的数据库中进行搜索,只需将单词附加到搜索网址。我继续收到

  

“未选中的runtime.lastError:无法建立连接。接收端不存在。”

每次运行代码并尝试使用上下文菜单时都会出现错误。

目前,我已经采取了禁用所有其他扩展程序的步骤,并且尝试使用Chrome Messaging Docs上的端口文档,但无法以这种方式解决问题。

background.js

    chrome.contextMenus.create({
    title: "Search Whitaker's Words",
    contexts: ["selection"]
});


chrome.contextMenus.onClicked.addListener(function() {
    chrome.runtime.sendMessage({ method: "getSelection" }, function (response) {
        sendToWW(response.data);
    });
});

function sendToWW(selectedText) {
    var serviceCall = 'http://archives.nd.edu/cgi-bin/wordz.pl?keyword=' + selectedText;
    chrome.tabs.create({ url: serviceCall });
}

在这里,我创建一个上下文菜单,单击菜单项后,我会向上下文脚本发送一条消息,要求高亮显示选择。然后,将其返回给background.js中的另一个函数,该函数将使用搜索查询创建一个新标签。

content.js

chrome.runtime.onMessage.addListener(function (message) {
    if (message.method === "getSelection"){
        var word = window.getSelection().toString().trim();
        console.log(word);
        chrome.runtime.sendMessage({ data: word });
    }
    else
        chrome.runtime.sendMessage({}); // snub them.
});

我在这里听消息,然后从窗口中进行选择,修剪并发回。

manifest.json

{
  "manifest_version": 2,
  "name": "Latinate",
  "version": "0.1",
  "description": "Aid in Latin translation using Whitaker's Words",
  "content_scripts": [
    {
      "matches": [
        "<all_urls>"
      ],
      "js": [
        "jquery-3.4.1.min.js",
        "content.js"
      ]
    }
  ],
  "background": {
    "scripts": [
      "background.js"
    ]
  },
  "permissions": [
    "contextMenus",
    "tabs"
  ],
  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  }
}

任何人和所有帮助将不胜感激!我已经尝试了几乎所有我发现可以应用的东西。

1 个答案:

答案 0 :(得分:1)

错误消息指出另一侧没有消息侦听器。确实没有,因为消息侦听器是在chrome.runtime.onMessage.addListener中注册的功能-在您的扩展程序中,只有内容脚本才具有这样的侦听器。

使用sendResponse函数发送响应,而不是发送回新消息,该函数作为参数传递给onMessage侦听器
(另请参见messaging tutorial)。

另一个问题是,要向选项卡发送消息,您需要使用其他方法:chrome.tabs.sendMessage,其中选项卡ID为第一个参数。

后台脚本:

chrome.contextMenus.onClicked.addListener((info, tab) => {
  chrome.tabs.sendMessage(tab.id, {method: 'getSelection'}, response => {
    sendToWW(response.data);
  });
});

内容脚本:

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  if (message.method === 'getSelection') {
    var word = window.getSelection().toString().trim();
    console.log(word);
    sendResponse({ data: word });
  } else {
    sendResponse({});
  }
});