- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
请原谅我的任何明显错误,因为我是 Chrome 扩展的新手,但 Chrome 消息传递 API 的这个错误已经讨论过 here , here ,和here过去,常见的 react 是“禁用现有的 Chrome 扩展,其中一个导致了错误”。 这是可以实现的最好结果吗?我们是否应该翻身并接受我们的扩展将与其他扩展冲突的事实? 返回 true 或为监听器回调函数返回 Promise 并使用 sendResponse
并不能解决我的问题。
目前我只能获取 chrome.storage.local
中存储的新值(没有错误)通过禁用所有其他 chrome 扩展、删除扩展并加载备份解压的扩展。有趣的是,该代码似乎只在developer.chrome.com上工作,它根本不起作用关于 manifest.json
中的其他“匹配”URL .
我认为await
有一定的意义。和async
运营商正在解决这个问题,但我不确定如何正确实现它。
manifest.json:
{
"manifest_version": 2,
"name": "my extension",
"version": "1.0",
"description": "its my extension",
"permissions": [
"declarativeContent",
"storage",
"activeTab"
],
"content_scripts": [
{
"matches": [
"*://developer.chrome.com/*",
"*://bbc.co.uk/*",
"*://theguardian.com/*",
"*://dailymail.co.uk/*"
],
"js": ["content.js"]
}
],
"background": {
"scripts": ["background.js"],
"persistent": false
},
"content_security_policy": "script-src 'self' https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js; object-src 'self'",
"page_action": {
"default_popup": "popup.html"
},
"icons": {
"16": "images/icon16.png",
"32": "images/icon32.png",
"48": "images/icon48.png",
"128": "images/icon128.png"
}
}
popup.html:
<!DOCTYPE html>
<html>
<head>
<title>my extension</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="popup.js"></script>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<h1>my extension</h1>
<h2>Article: <span id="article-headline"></span></h2>
<button id="detect-article">Detect Article</button>
</body>
</html>
popup.js:
$(document).ready(function() {
$("#detect-article").click(function() {
chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
chrome.tabs.sendMessage(tabs[0].id, {request: "Requesting headline"}, function(response) {
console.log("Requesting headline")
});
});
});
})
function getHeadline(changes) {
let changedValues = Object.keys(changes);
//console.log(changedValues);
for (var item of changedValues) {
console.log("new value: " + changes[item].newValue);
$("#article-headline").text(changes[item].newValue)
}
}
chrome.storage.onChanged.addListener(getHeadline);
content.js:
function handleRequest(message, sender, sendResponse) {
console.log("Request recieved");
let headlineList = document.getElementsByTagName("h1");
chrome.storage.local.set({headline: headlineList[0].innerText}, function() {
console.log("'" + headlineList[0].innerText + "' stored in local storage");
});
return true;
}
chrome.runtime.onMessage.addListener(handleRequest);
背景.js:
chrome.runtime.onInstalled.addListener(function() {
chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
chrome.declarativeContent.onPageChanged.addRules([{
conditions: [
new chrome.declarativeContent.PageStateMatcher({
pageUrl: { hostContains: 'developer.chrome.com' },
}),
new chrome.declarativeContent.PageStateMatcher({
pageUrl: { hostContains: 'bbc.co.uk' },
}),
new chrome.declarativeContent.PageStateMatcher({
pageUrl: { hostContains: 'theguardian.com' },
}),
new chrome.declarativeContent.PageStateMatcher({
pageUrl: { hostContains: 'dailymail.co.uk' },
}),
],
actions: [new chrome.declarativeContent.ShowPageAction()]
}]);
});
});
非常感谢您花时间查看/重新查看此问题,与上述“禁用现有扩展”相关的解决方案不是我正在寻找的。
最佳答案
当您为 sendMessage 指定回调时,您是在告诉 API 您需要响应,因此当您的内容脚本未使用 sendResponse 进行响应时,API 会认为发生了可怕的事情并进行报告!
Reminder: when editing content scripts make sure to reload both the extension on
chrome://extensions
page and the tabs that should have this content script.
如果您需要异步运行代码的响应,例如 chrome
API 回调:
保持返回true
在回调中调用 sendResponse(someImportantData)
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
chrome.storage.local.set({foo: 'bar'}, () => {
sendResponse('whatever');
});
return true;
});
与 Promise
相同,但不要对 onMessage 监听器使用 async
,more info .
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
fetch(message.url).then(r => r.text())
.then(t => sendResponse({ok: t}))
.catch(e => sendResponse({err: e.message}));
return true;
});
如果您需要回复并且可以立即发送:
将 return true
替换为 sendResponse
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
sendResponse('whatever');
});
如果您不需要任何回复:
移除sendMessage中的回调
chrome.tabs.sendMessage(tabs[0].id, {request: "Requesting headline"});
删除return true
- 它当前所做的只是告诉 API 无限期地保持消息传递端口打开,您永远不会使用该端口,因此它只是一个内存泄漏源。
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
// do something
// don't return true
// ManifestV2: don't call sendResponse
// ManifestV3 bug: uncomment the next line
// sendResponse();
});
对于 ManifestV3 in Chrome 99, 100, 101您需要一个虚拟的 sendResponse() 调用。
关于javascript - 如何处理 "Unchecked runtime.lastError: The message port closed before a response was received"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59914490/
我正在学习网络和套接字,但有些东西我不明白。我经常听说“TCP端口”但我认为端口与应用层有关(例如 HTTP 服务器为 80)。那你为什么不说“应用程序端口”呢?为什么端口似乎与 TCP 层相关联(它
配置 Nginx 以允许像这样的 DOMAIN:PORT 请求的正确方法是什么: http://example.com:8080/?a=xxx&b=yyy&c=zzz over TCP or UDP
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
这是我的 nginx.conf,适用于 https。 如果有人输入 HTTP://dev.local.org:3002,我该如何重定向到 HTTPS://dev.local.org:3002? 这个
我在这方面需要一点帮助,而我对这方面的 RegEx 知识有点欠缺。 我有一个代理列表,我正在尝试解析该列表并将 IP 和端口号与字符串分开。 正在读取的字符串看起来像这样。(示例 1) 121.121
我正在尝试制作一个 Firefox 扩展。我需要与后台脚本 (main.js) 交换数据,所以我尝试使用端口,但它不起作用。 //Content.js self.port.on("alert",fun
我正在学习教程,他们使用命令[[ -z "$PORT" ]] && export PORT=8080我不完全明白它在做什么。我对 bash 命令的了解非常基础,所以我什至不知道用什么谷歌来解决这个问题
我已经阅读了数据表和谷歌,但我仍然不明白。 就我而言,我将 PIC18F26K20 的 PIN RC6 设置为 INPUT 模式: TRISCbits.TRISC6 = 1; 然后我用 PORT 和
我想知道是否可以将公共(public) IP 端口(例如端口 80)映射到 Azure iaas VM 上的不同本地/私有(private) IP 端口(例如端口 81)。我相信这在旧门户中是可行的,
我有一个用 python-twisted 编写的客户端,它将 UDP 数据包发送到 IP aaa.bbb.ccc.ddd 的端口 1234,然后等待响应。我还有用 C-libuv 编写的 UDP 服务
我有一个使用弹性 IP 12.34.56.78 运行的 Amazon EC2 实例。我拥有一个域名 example.com,我已将其设置为指向 EC2 实例。我在 EC2 实例的端口 80 上运行 A
我正在尝试在 AWS Lightsail 上配置网站。我做的第一件事是在 中将端口号从 22 更改为 2200 /etc/ssh/sshd_config ,然后我像这样配置了简单的防火墙 sudo u
几天前才意识到 Docker 似乎绕过了我的 iptable 规则。我对 Docker 和 iptables 的经验并不令人难以置信。最近几天尝试了很多不同的东西。还看到最近的 docker 版本有很
我从他们的website 下载了零层使用以下命令: curl -s https://install.zerotier.com | sudo bash 每当我尝试使用 zerotier cli 时,都会
我是字符串操作的新手,只是试图替换列表中的值。 我试图修复的两个输入是 MCAFEE和 PORT O'BRIAN . 所以我跑 ucwords(strtolower($rawTitle)) .但现在我
我正在使用 SSH 访问我大学的 afs 系统。我喜欢使用 rmate(远程 TextMate),它需要 SSH 隧道,因此我在 .bashrc 中包含了这个别名。 alias sshr=ssh -R
当我使用 Control-C 退出“Heroku Open”(Heroku 工具栏服务器命令)时。我无法重新启动。我收到此错误: /vendor/bundle/gems/puma-2.14.0/lib
我正在发送这样的消息: self.port.emit("nodes_grubed", textNodesValues); 并想对此使用react: worker.port.on("nodes_grub
我正在尝试在此扩展中创建一个函数,该函数将打开具有给定网址的选项卡,并在该选项卡上使用给定文件名运行脚本。该功能大部分工作正常,只是我无法在主脚本和我在新选项卡上运行的脚本之间进行通信(我为此使用了
我在我的 .NET MVC 4 元素中使用 Bootstrap ,我使用 NuGet 导入 Bootstrap 我的元素,我有一个布局页面,我在这个页面中包含 Bootstrap 标签,我的索引页面正
我是一名优秀的程序员,十分优秀!