最后,我想弄清楚为什么我不能让消息在我的Chrome扩展程序中工作。
请记住,在过去的一个月里,我对javascript非常陌生,我一直在在线上教自己使用视频(我的编码背景完全是java)。
我只想让我的后台脚本能够将发生的事情通知我的内容脚本,然后在内容脚本中执行一些代码。正如您在下面看到的,我已经设置了与文档相同的代码。,但是它不起作用!
以下是加载扩展时所遇到的错误:
manifest.json
{
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"]
}
],
"background": {
"scripts": ["background.js"],
"persistent": true
},
"permissions": [
"activeTab",
"tabs",
"storage"
],
"manifest_version": 2,
"name": "eSports YT Viewer",
"version": "1.0.0",
"description": "An eSports viewer for youtube"
}background.js
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) {
console.log(response.farewell);
});
});content.js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.greeting == "hello") {
sendResponse({farewell: "goodbye"});
}
});任何帮助都是非常感谢的!谢谢。
发布于 2020-09-19 07:34:57
您当前的背景脚本是错误的,或者更确切地说,没有做任何有意义/有用的事情。后台脚本运行在单独的隐藏背景页(或ManifestV3中的服务工作者)中。另见扩展的background.js访问控制台和devtools。
后台脚本运行时:( a)浏览器配置文件启动;( b)扩展重新启用/重新加载;或( c)安装/更新。因此,您的代码立即查询选项卡并向任何处于活动状态的选项卡发送消息,因此无法保证它甚至包含一个网页:不可能有任何内容(空的新选项卡),也可以是浏览器设置的内部chrome:// page,或者该选项卡可能仍在执行挂起的内容脚本(请参阅此答案末尾的注释)。
ManifestV2扩展注意:将后台脚本切换到"persistent": false也无助于您。它只会使脚本在API事件或弹出窗口打开时醒来,但您没有注册任何API事件,也没有声明弹出窗口。无论如何,您都应该切换到"persistent": false,但对于一个不同原因:让它只按需运行。
解决方案
后台脚本的通常用途是为chrome API事件(如chrome.tabs.onUpdated或chrome.webNavigation.onHistoryStateUpdated等)注册处理程序,否则很可能根本不需要后台脚本。在事件处理程序中,可以使用带有此选项卡id的chrome.tabs.sendMessage或chrome.tabs.connect向选项卡发送消息。许多人错误地将其发送到active选项卡,但通常没有意义,因为事件可能发生在非活动/后台选项卡中。通常,您应该将其发送到生成事件的选项卡,在传递给处理程序的参数中查找tab或tabId,引用这些事件上的文档。
还请注意,默认情况下,内容脚本运行在DOMContentLoaded之后,因此,如果在页面仍在加载时发送消息,则会失败。在这种情况下,您可以在开始上运行它们,或者使用不同的方法,例如,不要声明内容脚本,而是以编程的方式注入它。没有通用的答案,这取决于用例。
如果您真的需要在扩展启动/重新启动时向内容脚本发送消息,那么您必须首先通过chrome.tabs.reload (因此内容脚本将自动运行)或显式地弹出脚本重新加载所有匹配的选项卡。
发布于 2020-09-18 19:34:41
https://stackoverflow.com/questions/63961186
复制相似问题