如何在Chrome扩展中的内容脚本之间重复使用代码
How do I re-use code between content scripts in a Chrome extension?
我正在开发一个包含许多内容脚本的Chrome扩展。它们中的大多数使用相同的函数,所以我想在内容脚本之间共享这些函数;然而,我似乎不知道该怎么做。
内容脚本是沙盒的,因此不能访问同一个window
对象。似乎应该有一个明显的解决方案,但我一直没能找到。
内容脚本是沙盒的,因此不能访问同一个窗口对象。
这并不完全正确:尽管内容脚本默认情况下不能与加载它们的页面的window
对象交互,但它们共享相同的隐藏window
对象;孤立的世界";。因此,如果将两个不同的内容脚本加载到同一页面中,那么两个内容脚本将使用相同的window
。
这里有一个例子,你自己试试,然后做这样的事情:
-
manifest.json
:样品{ "name": "My extension", ... "content_scripts": [ { "matches": ["*://*/*"], "js": ["one.js", "two.js"] } ] }
-
脚本
one.js
具有以下功能:function sayHello(name) { alert("Hello " + name + "!"); }
-
使用该函数的脚本
two.js
:sayHello('John');
这里发生了什么
这很容易判断:
- 加载页面时,会注入内容脚本
- 首先注入
one.js
脚本,并定义sayHello
函数 - 现在
two.js
和在one.js
之后注入的任何其他内容脚本都可以使用该函数 - 呼叫CCD_ 12将提醒";你好,约翰"正如预期的那样
这就是为什么大多数开发人员(我也是)喜欢做这样的事情:
"content_scripts": [
{
"matches": ["*://*/*"]
"js": ["jquery.min.js", "script.js"]
}
]
因为这是一种包含jQuery并将其与内容脚本一起使用的简单方法。
显然,内容脚本将共享相同的window
对象,即使它们是从具有chrome.scripting.executeScript()
(MV3)或chrome.tabs.executeScript()
(MV2)功能的后台页面注入的。
要回答您的问题:
您可以轻松地创建一个包含所有实用程序和最常用函数的脚本,因此您随时可以在第一个脚本之后注入的任何其他内容脚本中使用它们。
所以,基本上,做这样的事情:
"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无法调用任何函数或访问内容脚本定义的任何变量。
这意味着:
- 内容脚本不能与它们被注入到的页面的命名空间交互
- 内容脚本不能与其他扩展插件在同一页面中注入的内容脚本的命名空间交互
但是:
- 它们可以与页面的DOM进行交互
- 它们可以通过相同的扩展与在同一页面上注入的其他内容脚本的命名空间进行交互
在ManifestV3中,可以通过在content_scripts
声明中指定"world": "MAIN"
(Chrome 111及更高版本)或通过Chrome.scripting API(Chrome 95/102及更高版)注入/注册来将内容脚本加载到页面的window
中。
- 如何在弹出脚本到内容脚本之间发送消息并返回
- Firefox插件SDK:在侧边栏和主脚本之间通信对象
- 什么's使用链接和脚本标记引用JavaScript源之间的区别
- 什么's使用脚本标记调用文件和ajax之间的区别
- Chrome审核:在外部CSS文件之间的头中发现了1个内联脚本块&”;
- 函数在两个或多个脚本之间进行访问
- 歌剧扩展脚本和它们之间的通信
- 我如何向这个脚本添加一个点击按钮循环URL函数(按给定顺序在URL之间切换),或者这可能吗
- Chrome扩展:内容脚本和background.html之间的通信
- 一个用户脚本的两个实例如何在帧之间进行通信
- 在这种特殊情况下,在PHP脚本之间传递值
- Chrome扩展:在内容脚本和网页之间进行通信'的脚本
- Chrome扩展:在后台页面和网站页面脚本之间进行通信的最佳方法
- 如何在Chrome扩展弹出窗口和内容脚本之间发送消息
- 从java脚本到C#的回调,C#和java脚本之间的异步编程
- 如何识别源自JS脚本的http请求与HTML
- 脚本标记,脚本标记之间有 src 和代码
- 任意运行时脚本元素和 DOM 元素之间的连接
- 不了解插件和脚本之间的区别
- 如何在内容脚本和面板之间进行通信