除了contentscript.js
,background.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.sendMessage
或chrome.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.js
→app.js
),但不能从第二个文件发送到第一个(app.js
→contentscript.js
或{{1} }→app.js
)。这让我感到困惑,因为app.js与manifest.js完全相同的manifest.json部分声明。
答案 0 :(得分:1)
因此,您在清单中的相同内容脚本“bundle”中定义了2个脚本。
这完全不同于将两个脚本一起混合到一个.js
文件中。它们在相同的环境中运作并分享所有内容。
因此,您可以在同一帧内直接调用函数并使用contentscript.js
中app.js
的变量,反之亦然。
如果您需要跨选项卡(或选项卡中的框架)进行通信,则需要使用背景作为代理。将消息发送到另一个内容脚本 context 没有直接的功能。