本文作者: jsweibo
本文链接: https://jsweibo.github.io/2020/01/31/%E4%BB%80%E4%B9%88%E6%98%AFContentScripts/
摘要
本文主要讲述了:
- 什么是 ContentScripts
- 注入方式
- JavaScript 运行时
- 同源政策
- 站点访问权限
- Chrome
正文
什么是 ContentScripts
- BackgroundScripts 可以使用所有的 WebExtension API,但无法访问修改 DOM
- ContentScripts 可以访问修改 DOM,但只能使用部分的 WebExtension API
示例:
1 | // ContentScripts 可以使用的 API |
注入方式
共有 3 种注入方式:
- 使用
manifest.json
中的content_scripts
字段声明,命中时注入 ContentScripts - 使用
contentScripts.register()
声明,命中时注入 ContentScripts - 使用
tabs.executeScript()
注入
matches
模式匹配数组
run_at
注入时机:
document_start
正在加载当前页的 DOMdocument_end
当前页的 DOM 已加载完成,正在加载当前页的其他资源document_idle
当前页的 DOM 和其他资源均已加载完成
默认值:document_idle
all_frames
是否注入标签页中的所有非空白 iframe
默认值:false
match_about_blank
是否注入标签页中的空白 iframe 和标签页打开的空白子标签页
默认值:false
注:
- 须配合
all_frames
使用 - 开启后,Firefox 会注入空白标签页,而 Chrome 不会
JavaScript 运行时
ContentScripts 可以访问修改 HTML 元素 (包括 CSR 创建的普通元素和自定义元素)的特性(attribute)和 DOM 的原生属性(property),就像普通的网页脚本那样,但 ContentScripts 无法访问修改 DOM 的自定义属性
两者的 JavaScript 运行时是互相独立的。ContentScripts 无法看到由网页脚本定义的 JavaScript 变量,网页脚本也无法看到由 ContentScripts 定义的 JavaScript 变量
注意:如果实在想让 ContentScripts 访问到由网页脚本定义的 JavaScript 变量,可以在 ContentScripts 中创建一个<script>
并将其注入页面
同源政策
和普通网页一样,ContentScripts 也受同源政策的限制
但如果扩展申请host
许可,ContentScripts 就可以跨源通信
站点访问权限
作用:在matches
的基础上,进一步约束 ContentScripts 的注入
选项:
- 单击时:尽管已经命中,但只有在用户单击 browserAction 时,才会注入 ContentScripts
- 在特定站点上:尽管已经命中,但只有在特定站点上,才会自动注入 ContentScripts;在其他站点上,需要用户单击 browserAction 才会注入
- 在所有站点上:只要命中,就会自动注入 ContentScripts。默认值
注:即使没有配置browser_action
,只要命中了,browserAction 的图标就会亮,尽管此时browser.browserAction === undefined
Chrome
注意:
- 从 Chrome 73 版本开始,即使扩展申请
host
许可,ContentScripts 也不能跨源通信
参考资料
本文作者: jsweibo
本文链接: https://jsweibo.github.io/2020/01/31/%E4%BB%80%E4%B9%88%E6%98%AFContentScripts/
本文对你有帮助?请支持我
- 本文链接: https://jsweibo.github.io/2020/01/31/%E4%BB%80%E4%B9%88%E6%98%AFContentScripts/
- 版权声明: 除非另有说明,否则本网站上的内容根据署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。