Chrome插件开发入门:手把手教你创建第一个扩展

问题背景

最近,客户发布了一个新的任务 —— 开发一个Chrome插件。之前没有这方面的开发经验,准备想学习一下这块的内容,我发现网上的大多数视频都是几年前的,开发版本都是基于MV2,当前谷歌已经开始使用MV3(Manifest V3)版本了,我决定利用这次机会,从零开始,探索并记录整个开发过程。

我的第一个目标是创建一个简单的Chrome插件,当用户点击工具栏上的图标时,如果插件处于激活状态,则在图标下方显示蓝底白字的“ON”。此外,当激活时,https://juejin.cn/* 网站上将新增一个导出按钮。

在开始编码之前,我强烈推荐大家访问 Chrome 开发者文档,这里提供了详尽的入门指南和最佳实践

解决方案

创建项目结构

首先,您需要创建一个项目文件夹,例如命名为hello-chrome,在这个文件夹中,我们将创建以下基础文件:

  • manifest.json:插件配置文件,描述插件的基本信息和权限。
  • background.js:插件的后台脚本,用于管理插件的状态和监听事件。
  • popup.html:点击插件图标时展示的弹窗页面。(当前示例不涉及这个文件)
  • popup.js:与popup.html页面相关联的脚本文件。(当前示例不涉及这个文件)
  • content.js:内容脚本,用于在特定网页中执行代码。(当前示例不涉及这个文件)
  • 图标文件:图标资源文件,用于展示插件图标。

现在让我们深入到每个文件的详细内容。

配置 manifest.json

manifest.json 是插件的核心,定义了插件的名称、版本、描述、权限、图标等信息。以下是本次示例插件开发的配置,这个配置文件定义了插件的基本信息和所需权限,同时指明了在用户点击插件图标时需要显示的弹出页面和图标资源

{
  "manifest_version": 3,
  "name": "Hello Chrome Extension",
  "version": "1.0",
  "description": "A simple Chrome extension for juejin.cn",
  "permissions": ["activeTab", "storage"],
  "host_permissions": ["https://juejin.cn/*"],
  "background": {
    "service_worker": "background.js"
  },
  "action": {
    "default_icon": {
      "16": "images/icon16.png",
      "48": "images/icon48.png",
      "128": "images/icon128.png"
    }
  },
  "icons": {
    "16": "images/icon16.png",
    "48": "images/icon48.png",
    "128": "images/icon128.png"
  }
}

实现 background.js

background.js文件负责监听用户的操作并响应插件的状态变化。比如监听浏览器事件、管理插件状态等。

  • 示例内容:

// 定义一个变量来跟踪 "ON" 状态
let isOn = false

// 监听工具栏图标点击事件
chrome.action.onClicked.addListener(async (tab) => {
  // 切换 isOn 状态
  isOn = !isOn

  if (isOn) {
    // 设置徽章文本为 "ON"
    chrome.action.setBadgeText({ text: 'ON' })
    // 设置徽章背景颜色为蓝色
    chrome.action.setBadgeBackgroundColor({ color: 'blue' })

      // 调用 addExportButton 函数在页面上添加导出按钮
      chrome.scripting.executeScript({
        target: { tabId: tab.id },
        function: addExportButton
      })
    }
  } else {
    // 清除徽章文本
    chrome.action.setBadgeText({ text: '' })

    // 检查当前标签页的 URL 是否包含 'https://juejin.cn/'
    if (tab.url.includes('https://juejin.cn/')) {
      // 调用 removeExportButton 函数从页面上移除导出按钮
      chrome.scripting.executeScript({
        target: { tabId: tab.id },
        function: removeExportButton
      })
    }
  }
})

// 定义一个函数在页面右下角添加导出按钮
function addExportButton() {
  const button = document.createElement('button')
  button.textContent = '导出'
  button.id = 'exportButton'
  button.style.position = 'fixed'
  button.style.bottom = '10px'
  button.style.right = '10px'
  button.style.zIndex = 1000
  document.body.appendChild(button)
}

// 定义一个函数从页面移除导出按钮
function removeExportButton() {
  const button = document.getElementById('exportButton')
  if (button) {
    button.remove()
  }
}

在上述代码中,当用户点击工具栏图标时,chrome.action.onClicked.addListener 事件监听器触发。根据 isOn 状态,设置或清除徽章文本,并在 https://juejin.cn/ 网站上添加或移除导出按钮。chrome.scripting.executeScript 用于在当前活动的标签页中执行 addExportButtonremoveExportButton 函数,以便动态地修改页面内容。

Chrome API 函数说明

  1. chrome.action.onClicked.addListener:用于监听工具栏图标的点击事件。当用户点击扩展程序的图标时,会触发提供的回调函数。参考文档:chrome.action.onClicked

  2. chrome.action.setBadgeText:用于设置工具栏图标上的徽章文本。徽章通常用于显示状态或通知。参考文档:chrome.action.setBadgeText

  3. chrome.action.setBadgeBackgroundColor:用于设置工具栏图标徽章的背景颜色。参考文档:chrome.action.setBadgeBackgroundColor

  4. chrome.scripting.executeScript:用于向指定的标签页注入 JavaScript 脚本。可以注入单个函数或文件中的脚本。参考文档:chrome.scripting.executeScript

加载和测试插件

最后,加载插件进行测试:

  1. 打开 Chrome 浏览器,访问 chrome://extensions/
  2. 开启“开发者模式”。
  3. 点击“加载已解压的扩展程序”,选择你的项目文件夹。

现在,当你点击插件图标时,应该能够看到“ON”的提示,并且在网站上看到新增的导出按钮。这个例子也只能说是体验一些chrome插件的快乐,这里面也有bug,比如刷新一些网页导出的按钮就消失了,大家猜猜这是为什么呢?

image.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python使用哪种数据库

MySQL 是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关…

python flask配置邮箱发送功能,使用flask_mail模块

🌈所属专栏:【Flask】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您的点…

【C++高阶】高效搜索的秘密:深入解析搜索二叉树

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:C多态 🌹🌹期待您的关注 🌹🌹 ❀二叉搜索树 📒1. 二叉搜索树&…

学习笔记——路由网络基础——路由度量值

3、路由度量值 (1)基本概念 路由度量值表示到达这条路由所指目的地址的代价。度量值数值越小越优先,度量值最小路由将会被添加到路由表中。度量值很多时候被称为开销(Cost)。 路由度量(路由开销 cost)对于同一个路由协议,当到达某目标网段有多条路由供…

适配不同数据库厂商方案

背景 在对国产化数据有要求的时候,我们会做对 达梦、海量等数据库的配置。 有些SQL 以前没有写成标准SQL; 那么适配的时候怎么办呢?改成标准SQL。 如果不好改呢?比如SQL比较复杂等,需要判断 当前是哪个厂商的数据库…

HTML星空特效

目录 写在前面 完整代码 代码分析 运行效果 系列文章 写在后面 写在前面 100行代码实现HTML星空特效。 完整代码 全部代码如下。 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&g…

数据结构与算法1

一、概述 数据结构&#xff08;逻辑结构、存储结构、算法&#xff09; 数据项 ∈ 数据元素(记录) ∈ 数据。 数据元素&#xff08;结点&#xff09;&#xff1a;数据的基本单位。数据项&#xff1a;不可分割&#xff0c;最小数据单位。数据对象 &#xff1a;性质相同的数据元素…

HTTP学习记录(基于菜鸟教程)

文章目录 1.简介1.1常用的HTTP方法1.2Http版本1.3注意事项 2.Https3.Http消息结构3.1客户端请求消息3.2响应消息 4.常见的响应头5.HTTP状态码6.Http content-type在这里插入图片描述 7.MIME类型8.HTTP2 1.简介 Http&#xff0c;被称为超文本传输协议&#xff0c;HyperText Tran…

RK3588 Android12音频驱动分析全网最全

最近没有搞音频相关的了&#xff0c;在搞BMS, 把之前的经验总结一下。 一、先看一下Android 12音频总架构 从这张图可以看到音频数据流一共经过了3个用户空间层的进程&#xff0c;然后才流到kernel驱动层。Android版本越高&#xff0c;通用性越高&#xff0c;耦合性越低&#…

python flask 入门-helloworld

学习视频链接&#xff1a; 01-【前奏】课程介绍_哔哩哔哩_bilibili 1.安装flask pip install flask 踩坑记&#xff1a;本机不要连代理&#xff0c;否则无法install 提示报错valueError: check_hostname requires server_hostname 2.程序编写 在根目录下创建 app.py fr…

尚硅谷爬虫学习第一天(2) 爬虫案例

import urllib.request# 下载网页 url_page http://www.baidu.com # url 代表下载的路径&#xff0c;filename 代表文件的名字 # urllib.request.urlretrieve(url_page,baidu.html) # 在python中 可以写变量的名字&#xff0c;也可以直接写值,这不就是java吗# 下载图片 # url_…

Mybatis(根据id查找这一行的数据)

首先在查询之前&#xff0c;我们先要做些基础的工作先创建一个以你的数据库命名的model类 我的数据库的名字叫admin 我就创建了一个Admin的类 用来方便数据的访问 然后我们就要创建一个接口来声明我们要写的方法 我创建的接口命名为AdminDao 在创建一个xml的类用来实现声明的…

把Deepin塞进U盘,即插即用!Deepin To Go来袭

前言 小伙伴之前在某篇文章下留言说&#xff1a;把Deepin塞进U盘的教程。 这不就来了吗&#xff1f; 事实是可以的。这时候你要先做点小准备&#xff1a; 一个大小为8GB或以上的普通U盘 一个至少64GB或以上的高速U盘 一个Deepin系统镜像文件 普通U盘的大概介绍&#xff1…

Flink 资源静态调度

本内容是根据 Flink 1.18.0-Scala_2.12 版本源码梳理而来。本文主要讲述任务提交时&#xff0c;为 Task 分配资源的过程。 以下是具体步骤讲解&#xff1a; TaskManager 资源注册 TaskManager 在启动时&#xff0c;会向 ResourceManager 注册资源。ResourceManager 会将 Tas…

AI 代理可以改变 B2B 电子商务的业务动态

今天你听到的都是人工智能&#xff0c;这是有原因的。在过去 18 个月里&#xff0c;我们经历了比以往更多的人工智能创新。人工智能一夜之间走出了实验室&#xff0c;并成为可行的商业驱动力。 一个有望赢得巨大胜利的行业是 B2B电子商务。事实上&#xff0c;B2B 电子商务可以…

2021 hnust 湖科大 C语言课程设计报告+代码+流程图源文件+指导书

2021 hnust 湖科大 C语言课程设计报告代码流程图源文件指导书 目录 报告 下载链接 https://pan.baidu.com/s/14NFsDbT3iS-a-_7l0N5Ulg?pwd1111

嵌入式实验---实验二 中断功能实验

一、实验目的 1、掌握STM32F103中断程序设计流程&#xff1b; 2、熟悉STM32固件库的基本使用。 二、实验原理 1、在上一章的实验基础上&#xff0c;添加一个按键和一个LED&#xff1b; 2、使用中断的方式实现以下两个功能&#xff1a; &#xff08;1&#xff09;KEY1按键…

计算机图形学入门16:曲线

1.曲线 曲线&#xff08;Curves&#xff09;在图形学中应用非常广泛&#xff0c;比如&#xff1a;相机的拍摄路径、物体的移动路径、动画曲线、矢量字体等。如下图所示&#xff0c;是使用曲线到矢量字体的应用&#xff0c;通过移动一些控制点来改变字体。 2.贝塞尔曲线 2.1 贝…

[Vulnhub]Wintermute LFI+SMTP+Screen+Structv2-RCE+Lxc逃逸

概要 靶机 192.168.8.104 信息收集 $ nmap 192.168.8.103 --min-rate 1000 -sC -sV 结果: Starting Nmap 7.92 ( https://nmap.org ) at 2024-06-15 05:54 EDT Nmap scan report for 192.168.8.103 (192.168.8.103) Host is up (0.035s latency). Not shown: 997 closed t…

《软件定义安全》之七:SDN安全案例

第7章 SDN安全案例 1.DDoS缓解 1.1 Radware DefenseFlow/Defense4All Radware在开源的SDN控制器平台OpenDaylight&#xff08;ODL&#xff09;上集成了一套抗DDoS的模块和应用&#xff0c;称为Defense4ALL。其架构如下图&#xff0c;主要有两部分&#xff1a;控制器中的安全…