#Chrome扩展程序开发教程--06:Content scripts

news2024/12/27 10:56:45

#Chrome扩展程序开发教程--06:Content scripts

    • 引言
    • 1、基本介绍
    • 2、静态声明式注入
    • 3、动态声明式注入
    • 4、程序化注入

引言

        本系列博客旨在带来最新的Chrome扩展程序开发入门教程。


1、基本介绍

        Content scripts 是注入到网页中运行的 JavaScript 文件。它可以使用标准的 Document Object Model(DOM)对象来访问网页中内容并对其进行修改。由于安全等原因 content scripts 的运行环境和网页内容本身是隔离的,也就是说网页本身所创建对象和函数,在 content scripts 中是无法访问的,反之亦然。而且 content scripts 只能使用以下列出的 Chrome API:

  • i18n
  • storage
  • runtime
    • connect
    • getManifest
    • getURL
    • id
    • onConnect
    • onMessage
    • sendMessage

但可以通过与 service worker 进行通信来间接使用其它 Chrome API(第一章中有介绍)。

2、静态声明式注入

        在 manifest.json 文件中声明哪些 content scripts 应该注入到哪些网页中,如下所示:

{
 "name": "My extension",
 ...
 "content_scripts": [
   {
     "matches": ["https://*.nytimes.com/*"],
     "css": ["my-styles.css"],
     "js": ["content-script.js"]
   }
 ],
 ...
}

        所有可用字段见下表:

nameTypeDescription
matchesarray of strings必须字段,指定 content scripts 将被注入到哪些页面。
exclude_matchesarray of strings可选字段,指定不需要注入的页面。
all_framesboolean可选字段,指定是否注入到目标页面中的所有 frame 中。
默认为 false,即只注入到目标页面的 top frame 中。
jsarray of strings可选字段,指定要注入到匹配页面的 JS 文件。
默认在目标网页 DOM 被构建或显示前注入,注入顺序为在 list 中的顺序。
cssarray of strings可选字段,指定要注入到匹配页面的 CSS 文件。
默认在目标网页 DOM 被构建或显示前注入,注入顺序为在 list 中的顺序。
run_atRunAt可选字段,指定 content scripts 何时被注入到页面。
默认为 document_idle。其它可选:document_start、document_end。
match_about_blankboolean可选字段,指定 content scripts 是否应该注入到 about:blank 标签页中。
默认为false。
match_origin_as_fallbackboolean可选字段,指定 content scripts 是否应该注入目标网页创建的所有 frame,即使该 frame 不满足 matches 中指定的规则。
include_globsarray of strings可选字段,指定需要匹配的 glob。
exclude_globsarray of strings可选字段,指定不需要匹配的glob
worldExecutionWorld可选字段,content scripts 执行环境。
默认为 ISOLATED。其它可选:MAIN

3、动态声明式注入

        允许开发者可以通过 Chrome API 动态添加、删除、修改或获取 content scripts 行为,如下所示:

chrome.scripting
  .registerContentScripts([{
    id: "session-script",
    js: ["content.js"],
    persistAcrossSessions: false,
    matches: ["*://example.com/*"],
    runAt: "document_start",
  }])
  .then(() => console.log("registration complete"))
  .catch((err) => console.warn("unexpected error", err))
chrome.scripting
  .updateContentScripts([{
    id: "session-script",
    excludeMatches: ["*://admin.example.com/*"],
  }])
  .then(() => console.log("registration updated"));
chrome.scripting
  .getRegisteredContentScripts()
  .then(scripts => console.log("registered content scripts", scripts));
chrome.scripting
  .unregisterContentScripts({ ids: ["session-script"] })
  .then(() => console.log("un-registration complete"));

4、程序化注入

        程序化注入方式适用于那些需要响应某些事件或在某些特定场合下运行的 content scripts 。程序化注入需要在 manifest.json 中指定 host_permissions 来申请权限或使用 activeTab 来临时获取当前页面权限,如下:
        1.在 manifest.json 中指定 activeTab 来获取当前界面的访问权限。

{
  "name": "My extension",
  ...
  "permissions": [
    "activeTab",
    "scripting"
  ],
  "background": {
    "service_worker": "background.js"
  },
  "action": {
    "default_title": "Action Button"
  }
}

        2.在 background.js 中指定需要响应的事件。

chrome.action.onClicked.addListener((tab) => {
  chrome.scripting.executeScript({
    target: { tabId: tab.id },
    files: ["content-script.js"]
  });
});

        3.在 content-script.js 中做出具体的响应。

document.body.style.backgroundColor = "orange";

        当然, 如果任务比较简单,也可以直接在 background.js 中完成。

function injectedFunction(color) {
  document.body.style.backgroundColor = color;
}

chrome.action.onClicked.addListener((tab) => {
  chrome.scripting.executeScript({
    target : {tabId : tab.id},
    func : injectedFunction,
    args : [ "orange" ],
  });
});

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

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

相关文章

办公必备!不再被格式问题困扰,轻松搞定文档转换!

大家平时在工作中会需要将文档转换为其他格式吗? 日常工作中,经常碰到需要文件格式转换的情况,对于掌握了一些转换技能的朋友说,文件格式转换自然不在话下 对于不熟练的朋友来说,想要轻松转换文件格式,就…

c++ std::enable_shared_from_this作用

enable_shared_from_this 是什么 std::enable_shared_from_this 是一个类模板&#xff0c;用来返回指向当前对象的shared_ptr智能指针。在说明它的作用前我们可以看一下如下代码&#xff1a; demo.cpp #include <memory> #include <iostream>class A { public:A…

web实验(3)

应用JavaScript编写留言的功能&#xff0c;在文本中输入文字提交后&#xff0c;在下方进行显示。 提示&#xff1a;可将下方内容以列表体现&#xff0c;提交时动态创建列表的项。可使用以下两种方式之一的方法&#xff1a; 使用CreateElenment动态创建li标签及li中的文本 在列…

PADS-LOGIC项目原理图设计

最小板原理图设计 目录 1 菜单与工具使用 2 常用设置 2.1选项卡 2.2 图纸设置 2.3 颜色设置 3 设计技巧 3.1 模块化设计思路 3.2 元件放置 3.3 走线及连接符 4 原理图绘制 4.1 POWER原理图设计 4.2 MCU原理图设计 4.2.1晶振电路 4.2.2复位电路 4.2.3 BOOT电路 …

Windows 11快捷键功能大全 28个Windows 11快捷键功能介绍

Windows 11快捷键功能大全 28个Windows 11快捷键功能介绍 1. WinA 打开快速设置面板2. WinB 快速跳转系统托盘3. WinC 打开Microsoft Teams4. WinD 快速显示桌面5. WinE 打开资源管理器6. WinF 一键提交反馈7. WinG 启动Xbox Game Bar8. WinH 语音听写9. WinI 打开设置10. WinK…

如何正确高效地学习android开发?

每一个能成为行业大佬的人&#xff0c;一定有自己独特的方法… 之所以能成为大佬&#xff0c;是因为他们会有自己独特的见解&#xff0c;在一次次的尝试中不断否定&#xff0c;然后一次次的确定&#xff0c;一个程序员想要精益求精&#xff0c;必须要有高效的学习方法和良好的…

Spring Cloud Alibaba基于Sentinel实现限流降级自定义配置结果

hello&#xff0c;你好呀&#xff0c;我是灰小猿&#xff0c;一个超会写bug的程序员&#xff01; sentinel作为SpringCloudAlibaba的基本组件&#xff0c;在进行熔断、限流、降级等方面具有十分重要的作用&#xff0c;而且其基于Web界面对接口进行限流配置&#xff0c;使得实时…

环形链表II(链表篇)

给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整…

伪原创文章生成器-伪原创工具在线使用

文章伪原创工具 在如今数字时代&#xff0c;内容创作已经成为了一项必不可少的营销策略。然而&#xff0c;创作原创内容需要相当的时间和精力&#xff0c;尤其是对于需要大量输出内容的企业或个人而言。这时&#xff0c;文章伪原创工具就成为了一种快速、高效的选项。在本文中…

Doris(15):物化视图

1 概念 物化视图是将预先计算&#xff08;根据定义好的 SELECT 语句&#xff09;好的数据集&#xff0c;存储在 Doris 中的一个特殊的表。 物化视图的出现主要是为了满足用户&#xff0c;既能对原始明细数据的任意维度分析&#xff0c;也能快速的对固定维度进行分析查询。 首…

【C++】布尔类型(bool)

目录​​​​​​​ 1、缘起 2、笔记整理 4、用法 4.1、布尔变量的定义和初始化 4.2、布尔类型的运算符 4.3、布尔类型的条件语句 4.4、布尔类型的循环语句 5、总结 1、缘起 最近在 BiliBili 黑马程序员学习 C 编程语言&#xff0c;今天学习到了 布尔&#xff08;b…

算法套路十二——回溯法之排列型回溯

算法套路十二——回溯法之排列型回溯 该节是在第十节回溯法之子集型回溯的基础上进行描写&#xff0c;组合型回溯会在子集型回溯的基础上判断所选子集是否符合组合要求&#xff0c; 故请首先阅读第十节算法套路十——回溯法之子集型回溯 算法示例一&#xff1a;LeetCode46. 全…

windows环境安装tensorflow-gpu-2.10.1

Tensorflow 2.10是最后一个在本地windows上支持GPU的版本 1. 通过.whl文件方式安装2.创建anaconda虚拟环境3.安装对应的cuda与cudnn版本&#xff0c;local不必装cuda和cudnn4. 测试tensorflow gpu是否可用 1. 通过.whl文件方式安装 .whl文件的下载地址&#xff1a; tensorflow…

Linux — 线程概念和线程控制

目录 一、 线程的概念 什么是线程&#xff1f; 线程的优点 线程的缺点 线程异常 线程用途 二、线程的控制 创建线程 pthread_create函数 线程终止 pthread_exit函数 pthread_cancel函数 线程等待 pthread_join函数 分离线程 一、 线程的概念 之前的文章说过每个进程有…

IDE后端启动JetLinks 物联网基础平台(2.x)

目录 一、官网 二、文档中心 三、下载源码 四、安装依赖 五、IDE配置 六、修改配置文件&#xff1a;jetlinks-standalone/src/main/resources/application.yml 七、启动项目&#xff08;项目会自动建表&#xff09; 一、官网 JetLinkshttps://www.jetlinks.cn/#/ 二、…

率先实现One-box量产后,这家厂商重磅发布智能底盘“三步走”战略

率先实现One-box和Two-box产品量产之后&#xff0c;利氪科技向业界发布了重要的产品布局规划及进展。 在4月18日开幕的上海国际车展上&#xff0c;利氪科技重磅发布了全新的智能化线控底盘产品矩阵&#xff0c;同时发布了智能底盘“三步走”计划。据了解&#xff0c;利氪科技将…

数据结构(五)—— 栈与队列

文章目录 前言一、基础1.1 stack1.2 queue 二、题2.1 232 用栈实现队列2.2 225 用队列实现栈2.3 20 有效的括号2.4 1047 删除字符串中的所有相邻重复项 前言 灵魂四问&#xff1a; 1、C中stack&#xff0c;queue 是容器么&#xff1f; 答&#xff1a;不是&#xff0c;而是容器…

高数基础3

目录 极限的概念&#xff0c;性质以及存在准则 求极限的方法 ​编辑 常用的基本极限 1的无穷次方常用的结论 例题&#xff1a; 方法2&#xff1a;利用等价无穷小代换求极限 例题&#xff1a; 常用的等价无穷小 利用有理运算法则求极限 例题 极限的概念&#xff0c;性质以…

【C语言】函数讲解(上)

【C语言】函数讲解&#xff08;上&#xff09; 1.函数是什么2.C语言中函数的分类2.1库函数2.1.1如何学会使用库函数 2.2.自定义函数 3.函数的参数3.1实际参数&#xff08;实参&#xff09;3.2形式参数&#xff08;形参&#xff09; 4.函数调用4.1传值调用4.2传址调用4.3练习 所…

Redis分布式锁实现方案

一、什么是分布式锁&#xff0c;与本地锁有什么区别 本地锁&#xff1a; 解决同一进程内多个线程操作同一资源的问题。 分布式锁&#xff1a; 解决多个进程同时操作同一资源的问题。 二、Redis的SETNX Redis之所以能实现分布式锁&#xff0c;得益于Redis的单线程处理模式&am…