contentcript.js与Chrome扩展程序中的另一个js文件之间的双向消息传递

时间:2015-03-27 02:59:01

标签: google-chrome-extension

除了contentscript.jsbackground.js等常用文件外,我正在构建的Chrome扩展程序还有一个名为app.js的完全任意文件,其中大多数业务逻辑都集中在。我正在组织这样的文件,将大部分与浏览器无关的逻辑抽象到app.js文件中,并重用它来构建其他浏览器的扩展。

我在app.js中声明了manifest.json个文件:

 "background": {
    "scripts": [
      ...,
      "scripts/lib/app.js"
    ]
  },
  "content_scripts": [
    {
      "matches": [
        "http://*/*",
        "https://*/*"
      ],
      "js": [
        "scripts/lib/app.js",
        "scripts/contentscript.js"
      ],
      "run_at": "document_end",
      "all_frames": false
    }
  ]

现在,问题来了。我可以通过在contentscript.js中运行chrome.runtime.sendMessagechrome.runtime.connect来启动contenscript.js和app.js之间的通信(如docs中所述)。但我无法找到相反通信方式的好方法,即如何将消息从app.js发送到contenscript.js。 文档discusses仅从网页发送消息,但这不是我想要做的。我想在Chrome扩展程序中将消息从一个js文件发送到另一个js文件。从app.js发送的chrome.runtime.sendMessage似乎没有通过contentscript.js注册。

更新:为了清楚起见,我要问的是如何在manifest.json的“content_script”部分中声明的两个或多个js文件之间建立通信。我可以将邮件从一个文件发送到另一个文件(contenscript.jsapp.js),但不能从第二个文件发送到第一个(app.jscontentscript.js或{{1} }→app.js)。这让我感到困惑,因为app.js与manifest.js完全相同的manifest.json部分声明。

1 个答案:

答案 0 :(得分:1)

因此,您在清单中的相同内容脚本“bundle”中定义了2个脚本。

这完全不同于将两个脚本一起混合到一个.js文件中。它们在相同的环境中运作并分享所有内容。

因此,您可以在同一帧内直接调用函数并使用contentscript.jsapp.js的变量,反之亦然。

如果您需要跨选项卡(或选项卡中的框架)进行通信,则需要使用背景作为代理。将消息发送到另一个内容脚本 context 没有直接的功能。