我正在尝试创建一个非常简单的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"
}
}
任何人和所有帮助将不胜感激!我已经尝试了几乎所有我发现可以应用的东西。
答案 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({});
}
});