Chrome 扩展实战:使用 chrome.contextMenus API 自定义浏览器右键菜单(chrome-extensions-samples 源码解析)
Chrome 扩展实战使用 chrome.contextMenus API 自定义浏览器右键菜单chrome-extensions-samples 源码解析【免费下载链接】chrome-extensions-samplesChrome Extensions Samples项目地址: https://gitcode.com/gh_mirrors/ch/chrome-extensions-samples导读本文基于 chrome-extensions-samples 仓库中的 api-samples/contextMenus/basic 示例系统讲解 Manifest V3 下chrome.contextMenusAPI 的核心用法如何在浏览器右键菜单中创建菜单项、为不同类型的上下文页面、选区、链接、图片等注册菜单、区分普通 / 单选 / 复选菜单行为并在点击时执行自定义逻辑。读完本文你将掌握一套可直接复制运行的右键菜单扩展骨架并能将控制台演示代码快速改造为真实业务功能。示例概览一个覆盖全部菜单形态的最小扩展contextMenus/basic示例的目标非常明确用最少的代码覆盖chrome.contextMenusAPI 的典型场景。按 README.md 的说明该扩展会创建菜单项并针对不同上下文类型context type分别注册监听不同类型菜单项的点击事件根据用户当前选中内容文本、链接、图片等运行对应代码。整个扩展只有三个文件结构一目了然文件职责manifest.json声明权限、注册 Service Workersample.js全部菜单创建与点击处理逻辑README.md示例说明与运行步骤Manifest 配置最小权限声明manifest.json 是这个示例的关键它展示了使用 contextMenus API 的最小合法配置{ name: Context Menus Sample, description: Uses the chrome.contextMenus API to customize the context menu., version: 0.7, permissions: [contextMenus], background: { service_worker: sample.js }, manifest_version: 3 }这里有两个要点permissions: [contextMenus]—— 使用chrome.contextMenus必须在 manifest 中显式声明contextMenus权限否则 API 调用会失败。这是 MV3 下权限模型的要求示例直接展示了这一最小声明方式。后台逻辑放在 Service Worker 中—— 菜单创建与点击监听都位于后台脚本sample.js因为右键菜单项是全局存在的不依赖任何页面存活。示例刻意没有配置action工具栏图标意味着加载后直接右键即可看到菜单无需先点开弹窗。菜单项创建覆盖全部上下文类型README.md 提到listen for different context menu types being clicked监听不同类型上下文菜单的点击对应的实现位于 sample.js。代码在chrome.runtime.onInstalled回调中一次性为 7 种上下文类型各创建一个测试项chrome.runtime.onInstalled.addListener(function () { // Create one test item for each context type. let contexts [ page, // 页面空白处 selection, // 选中文本 link, // 链接 editable, // 可编辑区域输入框、文本框 image, // 图片 video, // 视频 audio // 音频 ]; for (let i 0; i contexts.length; i) { let context contexts[i]; let title Test context menu item; chrome.contextMenus.create({ title: title, contexts: [context], id: context }); } });这段代码揭示了chrome.contextMenus.create()的常用参数title菜单项显示文本contexts菜单项出现的上下文环境示例覆盖了 7 种常见类型。除上述类型外ContextType还支持all所有环境、frameiframe 内、launcher应用启动器等取值读者可按需选用id菜单项唯一标识用于在onClicked事件中区分是哪个菜单项被点击。需要特别说明的是菜单项的创建集中在chrome.runtime.onInstalled中进行。这是官方推荐模式右键菜单项只需在扩展安装/更新时创建一次无需每次启动都重建而点击响应则通过独立的事件监听器处理。示例将创建与响应彻底分离正是这一最佳实践的示范。父子菜单构建层级结构右键菜单支持多级嵌套。示例在 sample.js 中创建了一个父菜单项和两个子菜单项// Create a parent item and two children. let parent chrome.contextMenus.create({ title: Test parent item, id: parent }); chrome.contextMenus.create({ title: Child 1, parentId: parent, id: child1 }); chrome.contextMenus.create({ title: Child 2, parentId: parent, id: child2 });关键点在于parentId参数子菜单项通过parentId指向父菜单项创建时返回的 ID。chrome.contextMenus.create()会返回新菜单项的 ID将其赋给父项变量后再传给子项即可建立层级。注意父子菜单的创建顺序——必须先创建父项才能引用其 ID。父子结构的典型用途是主菜单下按功能分组多个子动作右键区域更整洁。单选与复选菜单radio / checkbox 类型除普通菜单默认type: normal外chrome.contextMenus.create()还支持两种带状态的菜单类型示例在 sample.js 中同时演示了两者// Create a radio item. chrome.contextMenus.create({ title: radio, type: radio, id: radio }); // Create a checkbox item. chrome.contextMenus.create({ title: checkbox, type: checkbox, id: checkbox });两者的行为差异在点击回调中体现得最清楚见下文genericOnClick的switch分支type: radio同一父级下的多个 radio 项互斥一次只能选中一个。点击回调的info.checked反映当前选中状态type: checkbox每个 checkbox 项独立开关可同时勾选多个。同样通过info.checked读取状态。点击回调中还可用info.wasCheckedMV2 时代的叫法读取点击前的状态用于实现切换语义。radio / checkbox 很适合做设置类菜单例如主题切换、开关某个功能。点击事件分发基于 menuItemId 的 switch 分发示例将所有菜单项的点击事件统一交给一个监听器处理按info.menuItemId分发到不同逻辑见 sample.js// A generic onclick callback function. chrome.contextMenus.onClicked.addListener(genericOnClick); function genericOnClick(info) { switch (info.menuItemId) { case radio: // Radio item function console.log(Radio item clicked. Status:, info.checked); break; case checkbox: // Checkbox item function console.log(Checkbox item clicked. Status:, info.checked); break; default: // Standard context menu item function console.log(Standard context menu item clicked.); } }这是示例的核心交互逻辑与 README.md 中run code based on what the user has selected根据用户选中内容运行代码的描述一一对应chrome.contextMenus.onClicked.addListener(callback)注册全局点击监听任何菜单项被点击都会触发回调参数info携带本次点击的上下文信息info.menuItemId是被点击菜单项的 ID即创建时传入的idinfo.checked是 radio / checkbox 项当前状态此外还可访问info.selectionText选中的文本、info.linkUrl、info.srcUrl、info.pageUrl等字段回调的第二个参数tab携带点击发生时所在标签页的信息可用于配合chrome.tabs等 API。如 README 所述这里的控制台输出console readout可以快速替换为新的函数或 API 调用例如把console.log换成chrome.tabs.create打开新标签、chrome.notifications.create发通知或写入chrome.storage。这种监听器 switch 分发模式是右键菜单扩展的通用骨架。错误处理利用 runtime.lastError 校验创建结果chrome.contextMenus.create()是异步 API若参数非法如引用了不存在的父级 ID错误会通过回调中的chrome.runtime.lastError暴露。示例在 sample.js 中特意制造了一个错误场景来演示检查方法// Intentionally create an invalid item, to show off error checking in the // create callback. chrome.contextMenus.create( { title: Oops, parentId: 999, id: errorItem }, function () { if (chrome.runtime.lastError) { console.log(Got expected error: chrome.runtime.lastError.message); } } );这段代码故意给parentId传入不存在的999从而在回调中触发chrome.runtime.lastError。正确姿势是创建菜单项后立即检查chrome.runtime.lastError存在则记录/处理错误。这在动态创建菜单例如父项被删除后再创建子项的场景下尤其重要可避免静默失败导致菜单不显示。进阶参考从控制台演示到真实业务README.md 明确建议将该示例quickly adapted to use new functions or API calls快速适配为使用新函数或 API 调用。仓库中的 global_context_search 示例就是最好的转型范本展示了从控制台打印升级为真实业务的完整路径1. 用菜单项承载业务选项。其 background.js 在onInstalled时读取一份国家/地区配置locales.js包含com.au、cn、co.jp等 12 个 Google 域名为每个地区创建一个contexts: [selection]的菜单项。2. 在点击回调中执行真实动作。background.js 不再打印日志而是读取item.selectionText作为搜索关键词构造对应国家域名的 Google 搜索 URL并用chrome.tabs.create在相邻位置打开新标签页chrome.contextMenus.onClicked.addListener((item, tab) { const tld item.menuItemId; const url new URL(https://google.${tld}/search); url.searchParams.set(q, item.selectionText); chrome.tabs.create({ url: url.href, index: tab.index 1 }); });3. 动态增删菜单项。其 popup.js 允许用户通过弹窗勾选启用的国家改动写入chrome.storage.sync后台再监听chrome.storage.onChanged对新增项调用chrome.contextMenus.create()、对移除项调用chrome.contextMenus.remove(tld)见 background.js。这补充了 basic 示例未覆盖的动态更新菜单能力。对比可见basic 示例负责把 API 的每一种形态讲透进阶示例则演示了如何把同样的 API 接入真实交互链路。两者结合即构成完整的 contextMenus 学习路径。历史对照MV2 时代的实现差异仓库的 _archive/mv2/api/contextMenus/basic/sample.js 保留了 Manifest V2 版本的同名示例与当前 MV3 版对比可以直观看到 API 演进事件注册方式MV2 版在create()参数中直接传onclick回调如{title:..., onclick: genericOnClick}MV3 版统一改用chrome.contextMenus.onClicked.addListener()事件监听与create()彻底解耦一个监听器服务全部菜单项错误读取位置MV2 版通过chrome.extension.lastError读取错误见 MV2 sample.jsMV3 下该字段迁移为chrome.runtime.lastError后台载体MV2 可用事件页_archive 目录下另有event_page变体MV3 统一为 Service Worker。从源码结构看这一对照恰好解释了为何当前示例将创建onInstalled内create与响应onClicked监听分离——这正是 MV3 推荐的事件驱动写法。运行与验证三步加载扩展按 README.md 的 Running 章节加载并验证该扩展只需三步获取代码git clone本仓库gh_mirrors/ch/chrome-extensions-samples或直接使用仓库内已就绪的 api-samples/contextMenus/basic 目录以未打包方式加载打开 Chrome 的chrome://extensions开启开发者模式点击加载已解压的扩展程序选择api-samples/contextMenus/basic目录验证效果在任意网页上右键即可看到一组以Test page menu item、Test selection menu item等命名的菜单项、父子菜单结构、radio 与 checkbox 项。点击各菜单项后打开 Service Worker 的控制台chrome://extensions中点击该扩展的Service Worker链接即可看到对应的日志输出。若点击Oops项控制台会打印预期错误信息这正是示例内置的错误处理演示。将控制台日志替换为真实 API 调用即可快速演化出属于自己的右键菜单扩展。小结contextMenus/basic示例用 90 余行代码覆盖了chrome.contextMenusAPI 的全部核心能力上下文类型注册、父子层级、radio / checkbox 状态、统一点击分发与异步错误处理。其onInstalled创建 onClicked分发的结构既是 MV3 的最佳实践也是可复用的通用骨架。结合仓库内global_context_search进阶示例与_archive/mv2历史对照开发者可以快速从演示走向生产级右键菜单功能。【免费下载链接】chrome-extensions-samplesChrome Extensions Samples项目地址: https://gitcode.com/gh_mirrors/ch/chrome-extensions-samples创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Rocky Linux 9.0 yum源一键切换到国内镜像:从官方源到上海交大的完整实践

Rocky Linux 9.0 yum源一键切换到国内镜像:从官方源到上海交大的完整实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 3:00:38 阅读更多 →
自研、SaaS还是本地部署?用三张纸决策法选出正确答案

自研、SaaS还是本地部署?用三张纸决策法选出正确答案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 3:00:38 阅读更多 →
Lightweight Charts 系列类型(Series Types)完整指南:内置图表类型、配置项与自定义系列扩展

Lightweight Charts 系列类型(Series Types)完整指南:内置图表类型、配置项与自定义系列扩展

Lightweight Charts 系列类型(Series Types)完整指南:内置图表类型、配置项与自定义系列扩展 【免费下载链接】lightweight-charts Performant financial charts built with HTML5 canvas 项目地址: https://gitcode.com/gh_mirrors/li/lig…

2026/9/21 3:00:38 阅读更多 →

最新新闻

SkyWalking 数据生命周期管理:OAP TTL(Time To Live)机制完整指南

SkyWalking 数据生命周期管理:OAP TTL(Time To Live)机制完整指南

可观测性APM链路追踪指标监控日志分析微服务 【免费下载链接】skywalking APM, Application Performance Monitoring System 项目地址: https://gitcode.com/gh_mirrors/sk/skywalking 点击查看 免费下载 导读:本文聚焦 Apache SkyWalking OAP 后端的 T…

2026/9/21 3:30:57 阅读更多 →
CodeIgniter Beta 1.0 到 Beta 1.1 升级指南:五步完成目录重构与配置修正

CodeIgniter Beta 1.0 到 Beta 1.1 升级指南:五步完成目录重构与配置修正

CodeIgniter Beta 1.0 到 Beta 1.1 升级指南:五步完成目录重构与配置修正 【免费下载链接】CodeIgniter Open Source PHP Framework (originally from EllisLab) 项目地址: https://gitcode.com/gh_mirrors/co/CodeIgniter 导读 本文以 CodeIgniter 官方升级…

2026/9/21 3:30:57 阅读更多 →
Chrome Apps 媒体库实战:解析 mediaGalleries API 示例应用 Media Gallery

Chrome Apps 媒体库实战:解析 mediaGalleries API 示例应用 Media Gallery

Chrome Apps 媒体库实战:解析 mediaGalleries API 示例应用 Media Gallery 【免费下载链接】chrome-extensions-samples Chrome Extensions Samples 项目地址: https://gitcode.com/gh_mirrors/ch/chrome-extensions-samples Media Gallery 是 chrome-extens…

2026/9/21 3:30:57 阅读更多 →
CoffeeScript 0.2.0 里程碑:缩进语法、表达式化、Splats 与存在性运算符

CoffeeScript 0.2.0 里程碑:缩进语法、表达式化、Splats 与存在性运算符

编程语言编译器 【免费下载链接】coffeescript Unfancy JavaScript 项目地址: https://gitcode.com/gh_mirrors/co/coffeescript 点击查看 免费下载 导读 CoffeeScript 0.2.0(2010-01-05 发布)是该语言从 0.1.x 实验期迈向成熟的关键转折点…

2026/9/21 3:30:57 阅读更多 →
Codon GPU编程完全教程:用@gpu.kernel在Python里跑CUDA核函数绘制Mandelbrot集

Codon GPU编程完全教程:用@gpu.kernel在Python里跑CUDA核函数绘制Mandelbrot集

Codon GPU编程完全教程:用gpu.kernel在Python里跑CUDA核函数绘制Mandelbrot集 【免费下载链接】codon A high-performance, zero-overhead, extensible Python compiler with built-in NumPy support 项目地址: https://gitcode.com/gh_mirrors/co/codon Cod…

2026/9/21 3:30:57 阅读更多 →
Vibe Coding 参考设计规范做界面:用 Apple、Material、Fluent、Atlassian 的判断标准,让 AI 生成层次清晰的页面与按钮

Vibe Coding 参考设计规范做界面:用 Apple、Material、Fluent、Atlassian 的判断标准,让 AI 生成层次清晰的页面与按钮

教程文档 【免费下载链接】easy-vibe 从 0 到 1 学会 vibe coding,项目制学习 项目地址: https://gitcode.com/datawhalechina/easy-vibe 点击查看 免费下载 在 easy-vibe 的「初中级开发」阶段(docs/zh-cn/stage-2/index.md)&am…

2026/9/21 3:29:57 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →