首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递不能工作的Chrome扩展消息(background.js到content.js)

传递不能工作的Chrome扩展消息(background.js到content.js)
EN

Stack Overflow用户
提问于 2020-09-18 18:42:29
回答 2查看 1K关注 0票数 1

最后,我想弄清楚为什么我不能让消息在我的Chrome扩展程序中工作。

请记住,在过去的一个月里,我对javascript非常陌生,我一直在在线上教自己使用视频(我的编码背景完全是java)。

我只想让我的后台脚本能够将发生的事情通知我的内容脚本,然后在内容脚本中执行一些代码。正如您在下面看到的,我已经设置了与文档相同的代码。,但是它不起作用!

以下是加载扩展时所遇到的错误:

错误

manifest.json

代码语言:javascript
复制
{
   "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

代码语言:javascript
复制
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

代码语言:javascript
复制
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"});
      }
});

任何帮助都是非常感谢的!谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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选项卡,但通常没有意义,因为事件可能发生在非活动/后台选项卡中。通常,您应该将其发送到生成事件的选项卡,在传递给处理程序的参数中查找tabtabId,引用这些事件上的文档

还请注意,默认情况下,内容脚本运行在DOMContentLoaded之后,因此,如果在页面仍在加载时发送消息,则会失败。在这种情况下,您可以在开始上运行它们,或者使用不同的方法,例如,不要声明内容脚本,而是以编程的方式注入它。没有通用的答案,这取决于用例。

如果您真的需要在扩展启动/重新启动时向内容脚本发送消息,那么您必须首先通过chrome.tabs.reload (因此内容脚本将自动运行)或显式地弹出脚本重新加载所有匹配的选项卡。

票数 -1
EN

Stack Overflow用户

发布于 2020-09-18 19:34:41

从我在你的帖子中可以看到,一切看起来都井井有条,所以我只是在抛出一些想法:

我认为这里错误的线索是第一个错误,而不是第二个错误--看起来脚本之间的通信没有正确设置

可能尝试将背景脚本的persistent设置更改为false:

代码语言:javascript
复制
"background": {
  "scripts": ["background.js"],
  "persistent": false
},

从医生那里,只有在您使用chrome.webRequest API修改网络请求时才需要这样做,并且可能会在这里的设置中引起一些奇怪的问题。

但就像我说的,只是初步猜测。

祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63961186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档