我正在尝试从一个后台脚本将一个变量发送到与HTML页面相关联的内容脚本。内容脚本使用从后台脚本收到的变量更新HTML内容。
问题是我遇到了这个错误信息:
Error: Could not establish connection. Receiving end does not exist.
背景脚本main.js
:
var target = "<all_urls>";
function logError(responseDetails) {
errorTab = responseDetails.tabId;
console.log("Error tab: "+errorTab);
errorURL = responseDetails.url;
console.log("Error URL: "+errorURL);
//send errorURL variable to content script
var sending = browser.tabs.sendMessage(errorTab, {url: errorURL})
.then(response => {
console.log("Message from the content script:");
console.log(response.response);
}).catch(onError);
//direct to HTML page
browser.tabs.update(errorTab,{url: "data/error.html"});
}//end function
browser.webRequest.onErrorOccurred.addListener(
logError,
{urls: [target],
types: ["main_frame"]}
);
error.html
的含义是:
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
The error received is <span id="error-id"></span>
<script src="content-script.js"></script>
</body>
</html>
content-script.js
文件:
//listen to errorURL from the background script.
browser.runtime.onMessage.addListener(request => {
console.log("Message from the background script:");
console.log(request.url);
return Promise.resolve({response: "url received"});
}); //end onMessage.addListener
//update the HTML <span> tag with the error
document.getElementById("error-id").innerHTML = request.url;
manifest.json
:
{
"manifest_version": 2,
"name": "test",
"version": "1.0",
"background": {
"scripts": ["main.js"]
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["webextension/data/content-script.js"]
}
],
"permissions": [
"<all_urls>",
"activeTab",
"tabs",
"storage",
"webRequest"
]
}
src="content-script.js"
。所以,我需要从清单内容脚本中删除它?然后,我可以将错误代码从后台发送到HTML的脚本(使用browser.tabs.update(errorTab,{url: "data/error.html"});
在错误选项卡中显示HTML吗? - user6875880content_scripts
中移除它。但是,正如我提供的链接所述,你需要使用runtime.sendMessage()
(用于在后台上下文中的目标)而不是tabs.sendMessage()
(用于内容脚本的目标)。然而,鉴于在调用tabs.update()
和HTML页面以及JavaScript实际加载和运行之间存在延迟,你可能需要使用其中一种方法将数据拉入HTML页面,而不是从后台页面推送数据。 - Makyenstorage.local
中创建任意数量的键值对。但是,由于性能问题,不建议存储大量数据。 - Makyenchrome.*
还是browser.*
命名空间。 - Makyen