浏览器扩展V3开发系列之 chrome.contextMenus 右键菜单的用法和案例

news2024/10/10 6:17:16

【作者主页】:小鱼神1024

【擅长领域】:JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等

chrome.contextMenus 允许开发者向浏览器的右键菜单添加自定义项。

在使用 chrome.contextMenus 之前,必须在 manifest.json 中声明权限:
image.png

{
    "manifest_version": 3,
    "name": "chrome.contextMenus",
    "description": "chrome.contextMenus API 基础用法",
    "version": "1.0",
    "action": {
        "default_popup": "popup.html",
        "default_icon": "icons/icon128.png"
    },
    "background": {
        "service_worker": "background.js"
    },
    "permissions": [
        "contextMenus"
    ],
    "icons": {
        "16": "icons/icon16.png",
        "48": "icons/icon48.png",
        "128": "icons/icon128.png"
    }
}

在 manifest.json 声明 contextMenus 权限。

1、chrome.contextMenus.create

可以通过 chrome.contextMenus.create 进行创建右键菜单,如下:
image.png

chrome.runtime.onInstalled.addListener(function () {
  chrome.contextMenus.create({
    id: "1",
    title: "右键菜单选择一",
  });
});

看看效果吧。
屏幕截图 2024-04-01 141206.png
chrome.contextMenus.create 有哪些参数可配置呢?

  • id:菜单项的唯一标识符
  • title:菜单名称
  • type:菜单类型,包括:“normal”(默认) | “checkbox”(多选) | “radio”(单选) | “separator” (分隔符)
  • contexts:菜单项出现的上下文,包括:
"all": 上下文菜单项将在所有可用的上下文中显示。
"page": 表示上下文菜单项只在常规网页的空白处(非链接、非媒体等)上点击时显示。
"frame": 表示上下文菜单项只在网页中的 iframe 上点击时显示。
"selection": 表示上下文菜单项只在用户选中文本时显示。
"link": 表示上下文菜单项只在链接上点击时显示。
"editable": 表示上下文菜单项只在可编辑区域(如文本框)点击时显示。
"image": 表示上下文菜单项只在图像上点击时显示。
"video": 表示上下文菜单项只在视频上点击时显示。
"audio": 表示上下文菜单项只在音频元素上点击时显示。
"launcher": (已弃用)原先用于Chrome应用的启动器上的菜单。
"action": 表示上下文菜单项只在扩展的操作按钮(地址栏旁的图标)上点击时显示。
  • parentId:父级菜单唯一标识
  • checked:当 type 为多选或单选时,菜单是否被选中
  • enabled:菜单是否被禁用
  • documentUrlPatterns:指定上下文菜单项应该在哪些文档页面的 URL 中显示
  • targetUrlPatterns:匹配触发上下文菜单项显示的链接的 URL

其中:id、title、parentId、checked、enabled 都是比较容易理解的。就不一一举例了。

假设我们希望当选中文字右键时,菜单按分类展示,比如:一级菜单:水果类;二级菜单:苹果、梨子、西瓜
可以如下创建菜单:
image.png

chrome.runtime.onInstalled.addListener(function () {
  // 定义菜单
  const menuList = [
    {
      id: "1",
      title: "水果类",
      children: [
        { id: "1-1", title: "苹果", parentId: "1" },
        { id: "1-2", title: "梨子", parentId: "1" },
        { id: "1-3", title: "西瓜", parentId: "1" },
      ],
    },
  ];

  // 创建菜单
  function createMenu(menu) {
    chrome.contextMenus.create(
      {
        id: menu.id,
        title: menu.title,
        contexts: ["selection"],
        parentId: menu.parentId,
      },
      function () {
        if (Array.isArray(menu.children)) {
          menu.children.forEach(createMenu);
        }
      }
    );
  }

  menuList.forEach(createMenu);
});

定义了一个菜单列表 menuList ,通过递归 createMenu 创建菜单。同时,我们将 contexts 设置了 selection ,即在选中文本时才显示菜单。

效果如下:
屏幕截图 2024-04-01 152913.png

documentUrlPatterns:表示哪些网址下可以看到右键菜单。
假如:我们只想让百度界面才能看到菜单,可以将 documentUrlPatterns 设置如下:
image.png
documentUrlPatterns 支持通配符,*: 匹配任何字符数量的任何字符序列。

targetUrlPatterns:它的作用和 documentUrlPatterns 类似,都是限制哪些内容可以看到菜单的,区别是:

  • documentUrlPatterns 是针对网页的
  • targetUrlPatterns 是针对页面上的某些元素(如链接、图片)的 URL 匹配
2、chrome.contextMenus.update

更新菜单,除了 id 不能更新外,其他创建选项均可以更新,比如:更新菜单标题 title
image.png

  chrome.contextMenus.create({
    id: "1",
    title: "更新菜单",
  });

  // 更新菜单
  function updateMenu(id, title) {
    chrome.contextMenus.update(id, {
      title,
    });
  }
  updateMenu("1", "更新菜单2");
3、chrome.contextMenus.remove

移除指定菜单项

chrome.contextMenus.remove("id");

这个 API 比较简单,就不单独举例了。

4、chrome.contextMenus.removeAll

移除所有菜单项

chrome.contextMenus.removeAll()

代码地址:传送门

总结
  • 使用右键菜单要开启权限:contextMenus
  • chrome.contextMenus.create:创建菜单
  • chrome.contextMenus.update:更新菜单
  • chrome.contextMenus.remove:移除菜单
  • chrome.contextMenus.removeAll:移除全部菜单

创作不易,动动您发财的小手,点赞关注一波,支持我创作更多对您有帮助的文章!

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

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

相关文章

基于 Redis 实现秒杀资格判断,提升并发性能

在互联网电商平台上,秒杀活动往往会吸引大量用户同时抢购,如何高效地处理高并发请求,保证用户体验,是一个重要的技术挑战。本文将介绍如何基于 Redis 实现秒杀资格的判断,提高并发性能。 基本思路 秒杀活动的核心流程…

SpringBoot整合MongoDB JPA使用

一、整合MongoDB SpringDataMongoDB是 SpringData家族成员之一,MongoDB的持久层框架,底层封装了 mongodb-driver。mongodb-driver 是 MongoDB官方推出的 Java连接 MongoDB的驱动包,相当于JDBC驱动。 SpringBoot整合 MongoDB,引入…

MySQL数据库—MHA高可用配置及故障切换

目录 一、MHA概述 1.什么是 MHA 2.MHA 的组成 (1)MHA Node(数据节点) (2)MHA Manager(管理节点) (3)MHA 的特点 二、MHA的一主两从部署 实验设计 实验具体操作 1.配置主…

一次breach1靶机的渗透测试

1.端口扫描和信息收集 2.CMS后台信息收集 3.解密HTTPS流量 4.tomcat的后台利用 5.提权 1.端口扫描和信息收集: 首先进行主机发现,找到目标机器: nmap -sP 192.168.110.1/24 找到目标机器,进行端口扫描: nmap -T4 …

CS144 Lab3 TCPSender复盘

一.基础概念 1.TCPSender在TCPSocket中的地位与作用 Lab0中实现了基于内存模拟的流控制-字节流(ByteStream),底层使用std::deque实现,根据最大容量Capacity进行容量控制。个人理解它相当于应用层的输入输出缓存区,用户…

【opencv - C++ - Ubuntu】putText 显示中文最快方法

话不多说&#xff0c;直接上代码 #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/freetype.hpp>using namespace std; using namespace cv;int main(void) {Mat image(1000, 1800, CV_8UC3, Scalar(200,162,33));Ptr<freetype::F…

如何找到合适的Python第三方库?

找合适的Python库其实很简单&#xff0c;按照以下三步法&#xff0c;你能找到90%的Python库。 1、百度谷歌搜索 明确自己的需求&#xff0c;用Python来干什么&#xff0c;力求简短明了。比如定位“数据分析”&#xff0c;然后去搜索关键词【Python数据分析第三方库】&#xf…

【嵌入式Linux】i.MX6ULL 外部中断服务函数的初始化

文章目录 1. Cortex-A7 中断系统1.1 分析1.2 具体处理流程 2. 外部中断服务函数的初始化2.1 基本流程分析2.2 具体代码分析2.2.1. 定义中断处理类型和结构体2.2.2. 初始化中断系统2.2.3. 注册中断处理函数2.2.4. 具体的中断处理逻辑2.2.5. 默认的中断处理函数 3. 完整代码 本文…

django学习入门系列之第三点《案例 小米商城二级菜单》

文章目录 样例划分区域搭建骨架logo区域完整代码 小结往期回顾 样例 划分区域 搭建骨架 <!-- 二级菜单部分 --> <div class"sub-header"><div class"container"><div class"logo">1</div><div class"sea…

[word] Word表格怎么填充序列号? #微信#微信#笔记

Word表格怎么填充序列号&#xff1f; Word表格怎么填充序列号&#xff1f;在Excel中填充序列号是很轻松的事情&#xff0c;在Word表格中填充序列号就没那么简单&#xff0c;但是还是有小技巧&#xff0c;可以实现Word表格序号填充&#xff0c;还能自动更新。 1、插入序号 先…

JAVAEE之网络原理_传输控制协议(TCP)的滑动窗口、流量控制、拥塞控制、延迟应答、捎带应答机制

前言 在前面几节&#xff0c;我们讲解了TCP协议的基本概念、报文格式。还介绍了确认应答机制、超时重传、连接管理机制&#xff0c;在本节中 我们将会继续介绍TCP协议的其他机制。 一、滑动窗口机制&#xff08;效率机制&#xff09; 在前面的章节中我们讨论了确认应答策略&…

C++ ─── vector的实现

知识点&#xff1a; ① 因为vector是模版&#xff0c;所以声明和定义都放在.h中&#xff0c;防止出现编译错误 .h不会被编译&#xff0c;在预处理中.h在.cpp中展开所以在编译时只有.cpp 而 .cpp顺序编译&#xff0c;只会进行向上查找&#xff0c;因此至少有函数的声明。 ②memc…

【Linux】进程 | 控制块pcb | task_struct | 创建子进程fork

目录 Ⅰ. 进程的概念&#xff08;Process&#xff09; 1. 什么是进程&#xff1f; 2. 多进程管理 3. 进程控制块&#xff08;PCB&#xff09; task_struct 的结构 Ⅱ. 进程查看与管理 1. 使用指令查看进程 2. /proc 查看进程信息 3. 获取进程 ID 4. 创建子进程 原因…

在Ubuntu22.04 使用stable-diffusion-webui 秋叶整合包

背景 众所周知&#xff0c;赛博菩萨已经发布了windows下的整合包&#xff0c;开箱即用&#xff0c;且集成度较高。 那我为啥非要在Ubuntu下使用呢&#xff1f; 当然是因为主力机就是Ubuntu系统啦。而且涉及到sd webui API 的调用&#xff0c;在Ubuntu 下调试更加方便一点。 那…

PG实践|内置函数之GENERATE_SERIES之深入理解

&#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程师 &#x1f3c6; 近期荣誉&#xff1a;华为云云享专家、阿里云专家博主、腾讯云优秀创作者、ACDU成员 &#x1f525; 三连支持&#xff1a;欢迎 ❤️关注…

2024年第十五届蓝桥杯青少组大赛8月24日开启

据蓝桥杯青少组官网显示&#xff0c;2024年第十五届蓝桥杯青少组大赛8月24日开启。 蓝桥杯青少组历届题库地址&#xff1a;http://www.6547.cn/question/cat/2 蓝桥杯青少组历届真题下载&#xff1a;http://www.6547.cn/wenku/list/10

【神经网络】CNN网络:深入理解卷积神经网络

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&#xff01; CNN网络&#xff1a;深入理解…

VideoLLaMA 2:多模态视频理解新突破,音频理解能力再升级,挑战 GPT-4V

前言 近年来&#xff0c;人工智能技术飞速发展&#xff0c;尤其是大模型的出现&#xff0c;为视频理解和生成领域带来了前所未有的机遇。然而&#xff0c;现有的视频大模型&#xff08;Video-LLM&#xff09;在处理视频中复杂的时空信息和音频信息方面仍存在不足&#xff0c;例…

【C++11(二)】lambda表达式和可变参数模板

一、可变参数模板 C11的新特性可变参数模板 能够让您创建可以接受 可变参数的函数模板和类模板 // Args是一个模板参数包&#xff0c;args是一个函数形参参数包 // 声明一个参数包Args...args&#xff0c;这个参数包中可以包含0到任意个模板参数。 template <class ...Arg…

笔记101:OSQP求解器的底层算法 -- ADMM算法

前言1&#xff1a;这篇博客仅限于介绍拉格朗日乘子法&#xff0c;KKT条件&#xff0c;ALM算法&#xff0c;ADMM算法等最优化方法的使用以及简版代码实现&#xff0c;但不会涉及具体的数学推导&#xff1b;不过在下面我会给出具体数学推导的相关文章和截图&#xff0c;供学有余力…