为什么在Tab中取不到content.js给window设置的变量/函数?

出于安全考虑,Chrome Extension的 Content层脚本(content.js) 运行在一个隔离的环境中,这意味着他们无法直接访问网页所定义的JS变量或函数,反之亦然。这种设计的目的是防止恶意网站干扰扩展的功能,并保护扩展代码不被网页访问或篡改。

所以,当你在 content.js 中给window对象设置变量时,这些变量是被设置在content层自身的隔离window对象中,而不是网页本身的window对象中。因此,网页无法访问这些变量,而且如果网页在其window对象上设置了变量,你的内容脚本也无法直接访问。

如果,要实现 Content层和网页之间的通信与数据共享,你可以使用以下这几种方案:

1.使用window.postMessage进行通信【推荐】

在Content层和网页的window全局变量下都有这个原生API,且它支持安全的跨域通信。你的Content层脚本可以向网页发送消息,网页也能向Content层脚本发送消息。另外,这个API的消息发送能力是独立的:我只管抛出消息,你捕不捕获、处不处理是你的事情;

接收方使用 window.addEventListener('message',(event) => {}) 进行消息处理;

注意,由于网络环境的复杂性(网页本身会因需发送很多消息、注入到网页的扩展也会发送很多消息),所以对自身开发的扩展必须设置一个具有唯一性识别能力的消息标识,例如为每个消息会携带一个拥有随机串前缀的key:ce-a03r49-xxxxxxxx

2.向页面注入script标签及js代码

你可以创建一个<script>标签并将其注入到页面的DOM中。这个被注入的脚本会在页面的全局作用域中运行,能够访问和修改页面的window对象。不过,这个注入的脚本无法直接访问Chrome扩展的API。这时,你需要使用window.postMessage来实现注入脚本和Content层脚本之间的通信。

3.dom元素共享

这种方案适用于数据的传递,相当于将dom作为一个共享媒介。

当你使用Content层脚本或网页自身向页面添加一个隐藏的dom节点,并将数据设置为其属性后,Content层和网页脚本都能获取到这个节点并读取到这些属性值;

但是,这种方案的健壮性比较差,如果是第三方网页设置的dom节点属性需要被扩展读取的,那第三方网页页面结构改变时就需要更改浏览器扩展获取数据的逻辑;

相关推荐
We་ct2 分钟前
LeetCode 3. 无重复字符的最长子串:滑动窗口最优解演进与解析
前端·算法·leetcode·typescript
奔跑的web.4 分钟前
前端使用7种设计模式的核心原则
前端·javascript·设计模式·typescript·vue
蜕变菜鸟18 分钟前
折叠页面 css
前端
菩提小狗27 分钟前
小迪安全2022-2023|第35天:WEB攻防-通用漏洞&XSS跨站&反射&存储&DOM&盲打&劫持|web安全|渗透测试|
前端·安全·xss
这个昵称也不能用吗?36 分钟前
React 19 【use】hook使用简介
前端·react.js·前端框架
web小白成长日记37 分钟前
修复 Storybook MDX 中 “does not provide an export named ‘ArgsTable‘” 的实战
前端
Aotman_1 小时前
Vue <template v-for> key should be placed on the <template> tag.
前端·javascript·vue.js
A_nanda1 小时前
vue快速学习框架
前端·javascript·vue.js·学习·c#
蜗牛攻城狮1 小时前
“直接 URL 下载” vs “前端 Blob 下载”:原理、区别与最佳实践
前端·javascript·二进制流
海绵宝宝_1 小时前
Chrome强开Gemini助手教程
前端·人工智能·chrome