【浏览器插件】理解浏览器扩展开发:为什么 `content script` 里的 `window` 与页面的 `window` 不同以及解决方案

理解浏览器扩展开发:为什么 content script 里的 window 与页面的 window 不同以及解决方案

浏览器扩展开发为开发者提供了强大的工具,使得我们可以扩展和增强网页的功能。然而,在开发过程中,尤其是当涉及到与网页内容进行交互时,我们可能会发现 content script 里的 window 对象与页面的 window 对象有所不同。这篇博客将探讨这个现象的原因,并介绍一种解决方案来弥合这个区别。

为什么 content script 里的 window 与页面的 window 不同?

浏览器扩展设计的一个关键原则是隔离性,这有助于提高安全性和稳定性。浏览器在多个级别上将扩展代码与网页代码隔离开来:

  1. 不同的上下文content script 运行在一个特殊的环境中,这个环境与网页的主 JavaScript 环境是分离的。虽然 content script 可以访问网页的 DOM,但它与网页的 JavaScript 代码是隔离的。

  2. 安全性考虑:这种隔离有助于防止扩展代码直接操纵网页中的脚本,从而减少安全漏洞。它防止恶意网页脚本访问和操控扩展的资源和数据,同时也可以保护网页不被不受信任的扩展代码破坏。

  3. 不同的执行环境content script 和网页脚本之间的 window 对象不同,是因为它们运行在不同的 JavaScript 环境中。尽管它们在同一个浏览器标签页内,但它们的运行环境是分隔开的。

解决方案:如何在网页的上下文中执行代码?

在网上找了很多方法,最后还是injectScript的方法最靠谱

为了在页面的 JavaScript 环境中执行代码,并使 window 对象与页面的 window 对象一致,我们可以注入一个脚本到页面的 DOM 中。以下是一个具体的实现方案:

步骤 1:创建注入脚本的函数

首先,我们需要在 content script 中编写一个函数,用于将外部脚本注入到页面中。这个函数可以如下所示:

const injectScript = (file, node) => {const th = document.querySelector(node);const s = document.createElement("script");s.setAttribute("type", "text/javascript");s.setAttribute("src", file);th.appendChild(s);
};

步骤 2:获取扩展内脚本的路径

我们需要使用 chrome.runtime.getURL 来获取扩展内脚本 zr.js 的完整路径:

injectScript(chrome.runtime.getURL("/zr.js"), "body");

步骤 3:在 content script 中执行注入

将上述代码片段放在你的 content script 中,这样我们就可以将 zr.js 脚本注入到网页中,并在网页的上下文中运行:

// Content script
const injectScript = (file, node) => {const th = document.querySelector(node);const s = document.createElement("script");s.setAttribute("type", "text/javascript");s.setAttribute("src", file);th.appendChild(s);
};// 获取扩展内脚本路径并注入到页面中
injectScript(chrome.runtime.getURL("/zr.js"), "body");

样例代码解释

上面的代码实现了将扩展中的脚本 zr.js 注入到目标网页的 body 标签中。这使得 zr.js 脚本在页面的 JavaScript 环境中运行,从而可以直接访问页面的 window 对象。

结论

通过这种方式,我们可以绕过 content script 与网页脚本之间的隔离,使我们编写的扩展代码能够在网页的 JavaScript 环境中运行,并访问实际页面的 window 对象。这种方法不仅保持了浏览器扩展的安全性和隔离性,也赋予了我们在特定情况下更高的灵活性。

在实际开发中,确保注入脚本的时机和处理可能的安全策略限制(如 CSP)也是非常重要的。希望这篇文章对你理解和处理 content script 与页面 window 对象不同的问题有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/24838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android基础-事件分发机制

在Android系统中,事件分发机制是处理用户交互事件的核心机制。当用户与设备进行交互,如点击、滑动屏幕时,这些动作会被系统捕获并转化为相应的事件(如MotionEvent),随后这些事件需要通过一系列的处理和传递…

Redux实现状态管理

在使用 Redux 的应用中,实现状态管理通常涉及以下几个步骤: 创建 Action:Action 是一个简单的 JavaScript 对象,它描述了一个行为,通常有一个 type 字段来表示行为类型。 创建 Reducer:Reducer 是一个纯函…

C# WPF入门学习主线篇(十二)—— Canvas布局容器

欢迎来到C# WPF入门学习系列的第十二篇。在之前的文章中,我们介绍了WPF布局管理的基本概念以及常见的布局容器。本篇博客将详细介绍其中一种最基本的布局容器——Canvas布局容器。通过本篇文章,您将学习如何使用Canvas布局容器来精确控制子控件的位置&am…

二叉树的算法题目

二叉树的遍历题目 二叉树遍历一般包含三种分别为:根左右、左根右、左右根(又称为前序遍历、中序遍历、后序遍历) 方法一:使用递归遍历 方法二:使用迭代使用栈 我们以左根右(中序遍历&…

【SpringBoot】项目搭建基本步骤(整合 Mybatis)

搭建 SpringBoot 项目有两种方式:使用 IDEA、或者在 Spring 官网下载。 1. IDEA 创建 打开 IDEA 后,英文版请点击 File -> New -> Project -> Spring Initialer。 中文版请点击 文件 -> 新建 -> 项目 -> Spring Initialer。 在打开的…

【Proteus8.16】Proteus8.16.SP3.exe的安装包,安装方法

下载: 链接:https://pan.baidu.com/s/14ZlETF7g4Owh8djLaHwBOw?pwd2bo3 提取码:2bo3 管理员打开proteus8.16.SP3.exe一路装就行了,许可证选Licence2.lxk,点安装后关闭,然后继续装完。 然后打开Patch-Proteus-8.16-…

力扣2972.统计移除递增子数组的数目 II

力扣2972.统计移除递增子数组的数目 II 类似1574. 核心都是定一边最大能取到的位置定一边 移一边当我们确定左右端点位置时 [i1,j]是一定要删除的然后i 1这里可以一直缩小到0也就是总共 i 2个子数组 class Solution {public:long long incremovableSubarrayCount(vector&l…

【Ardiuno】ESP32单片机初试点亮LED小灯

之前用的Ardiuno的主板做过一些简单的开发实验,按照相关说明还是很容易进行操作的。最近看了ESP32可以有wifi的功能,也就买来实验一下。 ESP32的主板开发环境安装,按照说明的安装下载程序总是报错,又上网搜索半天最后按照CSDN上某…

docker-compose部署RocketMq

docker-compose部署RocketMq 先看看官网:https://rocketmq.apache.org/zh/docs/4.x/quickstart/03quickstartWithDockercompose 尝试了在docker-compose文件中启动命令位置直接设置jvm内存大小,无法正常启动 command: sh mqbroker -c /home/rocketmq/…

平衡二叉树详解

目录 平衡二叉树的定义 平衡二叉树的基本操作 查找 插入 AVL树的建立 平衡二叉树的定义 平衡二叉树仍然是一棵二叉查找树,只是在其基础上增加了平衡的要求,也就是其左右子树的高度之差的绝对值不超过1。 在定义树的结构时需要加入一个变量height&…

uc_os操作练习

目录 一、CubeMX配置 二、获取uc-os源码 三、代码移植 四、代码修改 五、总结 六、参考资料 一、CubeMX配置 首先进入CubeMX,,新建工程,选择STM32F103C8T6芯片,照例配置好RCC和SYS。 然后配置GPIO输出,这里选择P…

2024 年最新 Python 基于百度智能云实现文字识别 OCR 详细教程

文字识别 OCR 概述 文字识别OCR(Optical Character Recognition)提供多场景、多语种、高精度的文字检测与识别服务,多项ICDAR指标居世界第一。广泛适用于金融服务、财税报销、法律政务、保险医疗、快递物流、交通出行、教育培训等场景&#…

Android面试题汇总-Jetpack组件

一、Navigation 当然可以。Android Navigation组件是一个用于在Android应用中管理导航的框架,它简化了Fragment之间的交互和数据传递。 (1)Navigation组件的核心概念 NavHostFragment: 作为容器,承载应用中的目的地&#xff08…

赶紧收藏!2024 年最常见 20道分布式、微服务面试题(四)

上一篇地址:赶紧收藏!2024 年最常见 20道分布式、微服务面试题(三)-CSDN博客 七、请解释服务发现和服务注册的概念。 服务发现(Service Discovery)和服务注册(Service Registration&#xff0…

C++ 11 【线程库】【包装器】

💓博主CSDN主页:麻辣韭菜💓   ⏩专栏分类:C修炼之路⏪   🚚代码仓库:C高阶🚚   🌹关注我🫵带你学习更多C知识   🔝🔝 目录 前言 一、thread类的简单介绍 get_id…

BeagleBone Black入门总结

文章目录 参考连接重要路径系统镜像下载访问 BeagleBone 参考连接 镜像下载启动系统制作:SD卡烧录工具入门书籍推荐:BeagleBone cookbookBeagleBone概况? 重要路径 官方例程及脚本路径:/var/lib/cloud9 系统镜像下载 疑问&am…

C 语言实现在终端里输出二维码

Mac 环境安装二维码库 brew install qrencode安装过程报权限问题执行以下命令 sudo chown -R 用户名 /usr/local/include /usr/local/lib chmod uw /usr/local/include /usr/local/lib#include <stdio.h> #include <qrencode.h>void print_qr_code(QRcode *qrcode…

SpringBoot+Vue图书管理系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 用户管理员 功能截图

人工智能在交通与物流领域的普及及应用

文章目录 &#x1f40b;引言 &#x1f40b;自动驾驶 &#x1f988;自动驾驶汽车 &#x1f421;应用现状 &#x1f421;技术实现 &#x1f421;实现过程及代码 &#x1f40b;智能交通管理 &#x1f988;应用现状 &#x1f988;技术实现 &#x1f988;实现过程及代码 &…

嵌入式基础知识

ARM 内核版本号 架构&#xff1a;如ARMv7&#xff0c;是ARM公司确定的&#xff0c;ARMv7是32位(见到的芯片多是该架构)&#xff0c;ARMv8是64位但也支持32位。该架构定义了处理器的基本指令集、体系结构以及支持的技术特性。 ARM SoC版本号 内核&#xff1a;如Cortex-A8&…