Geolocation API 必须在 HTTPS 或 localhost 下调用,且需用户手势触发;HTTP 环境静默失败,自动调用无权限弹窗;options 中 enableHighAccuracy、timeout、maximumAge 影响精度与性能;watchPosition 需 clearWatch 防泄漏;错误码 1/2/3 分别对应权限拒绝、位置不可用、超时。

Geolocation API 必须在 HTTPS 或 localhost 下才能调用
浏览器会直接拒绝非安全上下文中的 navigator.geolocation 调用,连提示权限的机会都不给。Chrome、Firefox、Edge 全部如此。开发时可以用 http://localhost:3000(或任意本地端口),但 http://127.0.0.1 有时也会被拦截,建议统一用 localhost。
上线后必须部署在 HTTPS 域名下,哪怕只是测试子域名,也要配好 TLS 证书。用 HTTP 的页面调用 navigator.geolocation.getCurrentPosition() 会静默失败,控制台报错:Only secure contexts can use Geolocation API。
用户权限弹窗不出现?检查调用时机和用户交互约束
现代浏览器禁止自动触发定位请求。如果在页面加载完成就立刻执行 getCurrentPosition(),多数情况下不会弹出授权框,而是直接进入 error 回调,错误码为 PERMISSION_DENIED 或根本无响应。
必须由用户显式操作触发,例如点击按钮:
立即学习“前端免费学习笔记(深入)”;
- 不能在
window.onload、DOMContentLoaded或定时器中直接调用 - 不能在 iframe 中调用(除非该 iframe 显式声明
allow="geolocation") - Safari 对「非用户手势触发」更严格,甚至可能缓存拒绝状态,需手动清除网站数据重试
getCurrentPosition() 和 watchPosition() 的关键参数区别
两个方法都接受三个参数:success、error、options。其中 options 决定行为是否符合预期:
-
enableHighAccuracy: true—— 启用 GPS(Android/iOS 设备)或高精度 Wi-Fi 定位,但耗电、响应慢(可能数秒),且某些设备在室内会始终失败 -
timeout: 5000—— 单位毫秒,超时后触发error回调,错误码为TIMEOUT;不设可能卡住 -
maximumAge: 30000—— 允许返回 30 秒内缓存的位置,避免重复计算;设为0强制刷新
注意:watchPosition() 会持续监听位置变化,返回一个 watchId,务必在不需要时调用 navigator.geolocation.clearWatch(watchId),否则造成内存泄漏或后台持续耗电。
常见错误码与对应处理方式
错误回调里的 err.code 是整数,需比对标准值:
-
err.code === 1→PERMISSION_DENIED:用户点“拒绝”或系统级关闭定位服务。应提示用户去系统设置开启,并提供跳转链接(如 iOS 的Settings://不可用,只能引导文字说明) -
err.code === 2→POSITION_UNAVAILABLE:GPS 信号弱、飞行模式、无网络(影响基站/Wi-Fi 定位)、或设备本身不支持。可降级显示“定位不可用”,不重试 -
err.code === 3→TIMEOUT:超过timeout设置仍未获取到结果。建议增加重试逻辑,但最多 1–2 次,避免卡死 UI
真实项目中,err.message 内容不可靠(各浏览器不同),只依赖 err.code 做分支判断。
Geolocation 不是“调用就有结果”的接口,它受硬件、系统设置、网络、浏览器策略四层限制。最常被忽略的是:没等用户点击就发请求,或者在 HTTP 环境下调试却以为代码有问题。










