我正在开发一个Chrome扩展程序,其中包含许多内容脚本。其中大部分使用相同的函数,因此我希望在这些内容脚本之间共享这些函数; 但是我似乎无法弄清楚如何做到这一点。
内容脚本是沙盒化的,因此无法访问相同的window
对象。看起来应该有一个显而易见的解决方案,但我还没有找到它。
我正在开发一个Chrome扩展程序,其中包含许多内容脚本。其中大部分使用相同的函数,因此我希望在这些内容脚本之间共享这些函数; 但是我似乎无法弄清楚如何做到这一点。
内容脚本是沙盒化的,因此无法访问相同的window
对象。看起来应该有一个显而易见的解决方案,但我还没有找到它。
一个manifest.json
的示例:
{
"name": "我的扩展",
...
"content_scripts": [
{
"matches": ["*://*/*"],
"js": ["one.js", "two.js"]
}
]
}
带有以下函数的脚本one.js
:
function sayHello(name) {
alert("你好," + name + "!");
}
使用该函数的脚本two.js
:
sayHello('约翰');
很容易告诉你:
one.js
脚本首先被注入,并定义了 sayHello
函数two.js
和任何在 one.js
之后被注入的其他内容脚本都可以使用该函数sayHello('John');
将会弹出预期的 "Hello John!"。这就是为什么大多数开发人员(包括我)喜欢做这样的事情:
"content_scripts": [
{
"matches": ["*://*/*"]
"js": ["jquery.min.js", "script.js"]
}
]
"content_scripts": [
{
"matches": ["*://*/*"]
"js": ["script1.js", "script2.js", "script3.js", ...]
}
]
这意味着:
script1.js
被注入script2.js
被注入,并继承了 script1.js
的命名空间script3.js
被注入,并继承了 script2.js
和 script1.js
的命名空间当谷歌文档说:
内容脚本在一个称为隔离世界的特殊环境中执行。它们可以访问被注入页面的 DOM,但不能访问页面创建的任何 JavaScript 变量或函数。对于每个内容脚本来说,它所运行的页面上似乎没有其他 JavaScript 在执行。反之亦然:在页面上运行的 JavaScript 不能调用由内容脚本定义的任何函数或访问任何变量。
这意味着:
但是:
在ManifestV3中,通过在其content_scripts声明中指定"world": "MAIN"(适用于Chrome 111及更高版本)或通过chrome.scripting API(适用于Chrome 95/102及更高版本)进行注入/注册,内容脚本可以加载到页面的window中。
(function() { /* stuff here */ })()
。 - Marco Bonelli