在 Chrome 扩展 Popup 中获取地理位置:cookbook.geolocation-popup 实战指南
在 Chrome 扩展 Popup 中获取地理位置cookbook.geolocation-popup 实战指南【免费下载链接】chrome-extensions-samplesChrome Extensions Samples项目地址: https://gitcode.com/gh_mirrors/ch/chrome-extensions-samples导读本指南以 chrome-extensions-samples 仓库中的functional-samples/cookbook.geolocation-popup示例为核心讲解如何在 Chrome 扩展的 popup弹出窗口中通过标准的 Web 标准 APInavigator.geolocation获取用户地理位置。读完本文你将掌握 popup 场景下的最小可运行实现、geolocation权限声明方式并能对比 popup、content script 与 service workeroffscreen document三种获取位置方案的差异理解在扩展中复用 Web 标准 API 的通用思路。示例概览popup 中获取地理位置的完整方案在 Chrome 扩展Manifest V3中获取地理位置与普通网页并无本质区别——直接使用浏览器提供的navigator.geolocationDOM API 即可。区别在于扩展的不同运行环境popup、content script、service worker对 DOM API 的可用性不同需要选择合适的位置。本示例选择了popup弹出窗口作为宿主用户点击工具栏扩展图标时popup 页面作为文档被加载其中运行的脚本可以像普通网页一样调用navigator.geolocation.getCurrentPosition()。这也是三种方案中最直观、代码量最少的一种。仓库为同一主题提供了三个互为补充的配方配方目录运行环境核心要点cookbook.geolocation-popupPopup直接在 popup 页面调用navigator.geolocation代码最简cookbook.geolocation-contentscriptContent script注入到页面上下文中获取位置结果写入控制台cookbook.geolocation-offscreenService Worker经 offscreen documentSW 无 DOM需创建离屏文档中转含消息传递与深拷贝细节背景知识MV3 的 service worker 中并不存在navigator.geolocation该 API 依赖宿主页面环境因此需要在 service worker 场景下通过 offscreen document 间接获取而 popup 和 content script 都拥有文档上下文可以直接调用。运行本示例按以下步骤在本地 Chrome 中加载并体验该扩展对应 cookbook.geolocation-popup/README.md 中的说明克隆本仓库git clone https://gitcode.com/gh_mirrors/ch/chrome-extensions-samples.git在 Chrome 的chrome://extensions页面开启开发者模式点击加载已解压的扩展程序选择functional-samples/cookbook.geolocation-popup目录打开扩展菜单工具栏拼图图标点击名为Geolocation - popup的扩展即会弹出 popup 窗口首次调用时浏览器会请求地理位置授权允许后 popup 页面标题会从getting location...变为类似position: 37°2519.1N, 122°56.1W的 DMS 格式坐标。工程结构解析整个示例仅由三个文件构成是理解popup 获取地理位置的最小闭环functional-samples/cookbook.geolocation-popup/ ├── manifest.json # MV3 清单声明 popup 与 geolocation 权限 ├── popup.html # popup 页面骨架加载 popup.js └── popup.js # 核心逻辑调用 getCurrentPosition 并格式化坐标manifest.json权限声明是前提manifest.json 全文如下{ name: Geolocation - popup, version: 1.0, description: Shows how to get geolocation access within a popup., manifest_version: 3, action: { default_popup: popup.html }, permissions: [geolocation] }关键点解读manifest_version: 3使用 Manifest V3 规范action: { default_popup: popup.html }把popup.html注册为工具栏按钮的默认弹出页这是 popup 能被点击弹出的核心配置permissions: [geolocation]必须声明geolocation权限否则对navigator.geolocation的调用会因权限不足而失败。这是本示例与普通网页最实质的差别——网页的定位需要站点权限扩展则同时受清单权限与浏览器授权弹窗双重约束。对比同主题的 offscreen 版本 manifest.json可以看到后者额外声明了offscreen权限并配置了background.service_worker这正体现了 popup 方案的简洁性无需后台脚本、无需离屏文档一个 HTML 加一个 JS 即可完成。popup.html极简页面骨架popup.html 是标准的 HTML 文档页面主体只有一个标题元素和脚本引入!doctype html head titlegeolocation - popup/title /head body h1getting location.../h1 script srcpopup.js/script /body其设计思路是初始状态下h1显示占位文本getting location...待定位成功后由popup.js改写为实际坐标。这种先用占位文案再用脚本更新的模式适合任何异步数据加载的 popup 界面。popup.js 核心实现剖析popup.js 是示例的灵魂包含三个部分DOM 引用、DMS 坐标格式化函数、定位调用。1. 获取页面元素引用const header document.querySelector(h1);通过document.querySelector拿到标题元素供后续写入定位结果。2. 将十进制度坐标转换为 DMS 格式const generateDMS (coords, isLat) { const absCoords Math.abs(coords); const deg Math.floor(absCoords); const min Math.floor((absCoords - deg) * 60); const sec ((absCoords - deg - min / 60) * 3600).toFixed(1); const direction coords 0 ? (isLat ? N : E) : isLat ? S : W; return ${deg}°${min}${sec}${direction}; };该函数将navigator.geolocation返回的十进制度坐标如37.4219转换为更易读的度分秒 方向DMS格式度deg为绝对值向下取整分min为小数部分乘 60 后取整秒sec为剩余小数部分换算为秒并保留 1 位小数方向direction依据坐标正负判定纬度用 N/S经度用 E/W。这一函数在三个 geolocation 配方中都被复用例如 cookbook.geolocation-contentscript/content-script.js 中的同名实现属于可提取复用的工具函数。3. 调用 getCurrentPosition 并处理结果navigator.geolocation.getCurrentPosition( (loc) { const { coords } loc; let { latitude, longitude } coords; latitude generateDMS(latitude, true); longitude generateDMS(longitude); header.innerText position: ${latitude}, ${longitude}; }, (err) { header.innerText error (check console); console.error(err); } );实现要点getCurrentPosition采用回调式 API第一个参数是成功回调接收GeolocationPosition对象其coords属性包含latitude、longitude、accuracy、altitude、speed等字段第二个参数是失败回调接收GeolocationPositionError成功时把坐标经 DMS 格式化后写入h1例如position: 37°2519.1N, 122°56.1W失败时在页面上提示error (check console)并把错误对象输出到控制台便于排查。常见的失败原因包括用户拒绝授权、系统定位服务关闭、清单未声明geolocation权限等与 content script 版本的差异仅在结果落点本示例写入页面header而 content-script.js 用console.log输出——popup 适合直接把结果显示在 UI 上content script 更适合在目标页面调试观察。三种获取位置的方案对比何时选择 popup仓库将同一能力以三种环境分别实现正好回答了在扩展中到底该在哪里调用navigator.geolocation的问题方案一Popup本文主题优点代码最简无需后台脚本与离屏文档有完整文档上下文UI 可直接展示结果局限popup 在用户点击图标时短暂存在关闭即销毁不适合需要持续追踪位置或后台自动定位的场景适用一次性查一下我在哪式的工具型扩展。方案二Content script在匹配的页面中注入脚本执行见 cookbook.geolocation-contentscript/manifest.json示例匹配https://example.com/*由于运行在页面上下文也拥有 DOM 与navigator.geolocation注意此时位置授权是与页面站点关联的且扩展无法在内容脚本中直接调用大部分chrome.*API需经消息传递。方案三Service Worker经 Offscreen documentMV3 的 service worker 没有 DOM无法直接调用navigator.geolocation必须通过chrome.offscreen.createDocument()创建离屏文档让离屏文档代为调用cookbook.geolocation-offscreen 展示了完整链路service_worker.js创建离屏文档 → 通过chrome.runtime.sendMessage发送{ type: get-geolocation, target: offscreen }→ 离屏文档的 offscreen.js 监听消息并调用getCurrentPosition随后通过sendResponse回传该方案中还包含两个值得注意的实现细节见 service_worker.js 与 offscreen.js离屏文档的onMessage处理器必须显式return true才能支持异步sendResponsegetCurrentPosition返回的是基于原型的对象经消息传递后属性会被剥离因此需要clone()深度克隆后再回传。选型小结环境有无 DOM能否直接调 geolocation代码复杂度典型场景Popup有能最低用户主动触发的单次定位Content script有页面上下文能低在指定站点注入定位逻辑Service Worker无不能需 offscreen高后台定时定位、通知类扩展常见问题与调试建议点击图标后提示error (check console)优先检查chrome://extensions中扩展详情页的控制台确认是否因缺少geolocation权限或用户拒绝授权导致GeolocationPositionError如PERMISSION_DENIED坐标为0,0或长时间无响应通常是系统或浏览器定位服务未开启或处于不支持定位的网络环境可在普通网页中先验证系统定位是否可用popup 关闭后定位丢失这是 popup 的生命周期特性。若需要保持定位能力请参照 offscreen 方案把定位逻辑迁移到离屏文档并配合chrome.storage持久化结果扩展商店审核注意offscreen 方案中createDocument的justification字段需要如实填写使用地理位置的业务理由示例中为占位文案popup 方案虽然无需该字段但定位用途同样应在扩展描述中说明。总结cookbook.geolocation-popup用三个文件演示了在 Chrome 扩展 popup 中获取地理位置的完整闭环manifest.json声明geolocation权限与 popup 入口popup.html提供展示骨架popup.js调用 Web 标准的navigator.geolocation.getCurrentPosition()并把坐标格式化为 DMS 展示。它是理解扩展中复用 Web 标准 API的最佳入门样例也为进一步研究 offscreen 与 content script 两种进阶方案提供了清晰的对照坐标。【免费下载链接】chrome-extensions-samplesChrome Extensions Samples项目地址: https://gitcode.com/gh_mirrors/ch/chrome-extensions-samples创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

MuPDF JavaScript API 之 Device 设备接口详解:回调设备、绘制命令与渲染标志

MuPDF JavaScript API 之 Device 设备接口详解:回调设备、绘制命令与渲染标志

MuPDF JavaScript API 之 Device 设备接口详解:回调设备、绘制命令与渲染标志 【免费下载链接】sumatrapdf SumatraPDF reader 项目地址: https://gitcode.com/gh_mirrors/su/sumatrapdf 导读:Device 是 MuPDF JavaScript(WebAssembly…

2026/9/21 2:41:29 阅读更多 →
react-admin `<TabbedShowLayout>` 深度指南:Show 视图 Tab 分组布局的配置、源码与权限控制

react-admin `<TabbedShowLayout>` 深度指南:Show 视图 Tab 分组布局的配置、源码与权限控制

前端UI组件 【免费下载链接】react-admin A frontend Framework for single-page applications on top of REST/GraphQL APIs, using TypeScript, React and Material Design 项目地址&#xff1a; https://gitcode.com/gh_mirrors/re/react-admin 点击查看 免费下载 <Tabb…

2026/9/21 2:41:29 阅读更多 →
通达信指标公式编辑实战:从函数到选股全解析

通达信指标公式编辑实战:从函数到选股全解析

/* 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 2:40:29 阅读更多 →

最新新闻

python-sdk 客户端订阅实战:使用 client.listen 监控 MCP 服务器的动态目录

python-sdk 客户端订阅实战:使用 client.listen 监控 MCP 服务器的动态目录

人工智能MCP 服务MCP Clients 【免费下载链接】python-sdk The official Python SDK for Model Context Protocol servers and clients 项目地址&#xff1a; https://gitcode.com/gh_mirrors/pythonsd/python-sdk 点击查看 免费下载 服务器端的目录&#xff08;catalog&#…

2026/9/21 3:16:48 阅读更多 →
Caffeine 源码审计方法论:深入 Caffeine 并发缓存正确性审计的专业实践指南

Caffeine 源码审计方法论:深入 Caffeine 并发缓存正确性审计的专业实践指南

后端缓存抽象 【免费下载链接】caffeine A high performance caching library for Java 项目地址&#xff1a; https://gitcode.com/gh_mirrors/ca/caffeine 点击查看 免费下载 Caffeine 是一款高性能 Java 缓存库&#xff0c;其核心价值在于 W-TinyLFU 准入策略、无锁读路径与…

2026/9/21 3:16:48 阅读更多 →
OEC刷机“下载Boot失败”排查全攻略:原理、短接与自救

OEC刷机“下载Boot失败”排查全攻略:原理、短接与自救

/* 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:16:48 阅读更多 →
LTspice导入SPICE模型详解:从UA741到自定义运放库

LTspice导入SPICE模型详解:从UA741到自定义运放库

/* 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:16:48 阅读更多 →
Zynq7020开源ISP移植实战:从Vivado工程到上板调试

Zynq7020开源ISP移植实战:从Vivado工程到上板调试

/* 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:16:48 阅读更多 →
HMC5883L磁力计驱动开发:I²C时序、椭球校准与FreeRTOS任务设计

HMC5883L磁力计驱动开发:I²C时序、椭球校准与FreeRTOS任务设计

/* 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:15:47 阅读更多 →

日新闻

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

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

agents-generator 决策矩阵全解析&#xff1a;从项目检测到 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 前端工具函数全景指南&#xff1a;src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin &#x1f680;ViteVue3Gin拥有AI辅助的基础开发平台&#xff0c;企业级业务AI开发解决方案&#xff0c;内置mcp辅助服务&#xff0c;内置skills管理&#xff0c;…

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 项目地址&#xff1a; https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件&#xff08;Full-featured Plugin&#xff09;是 Wox 三类插件实现方式中能力最完整的…

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

周新闻

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

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

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

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

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

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

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

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

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

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

月新闻

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

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

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

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

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

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

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

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

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

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