浏览器需用户授权且仅HTTPS/localhost下可用Geolocation API;getCurrentPosition三参数不可省略错误回调;watchPosition返回ID需手动clearWatch;应处理accuracy波动及err.code=2等降级场景。

浏览器能直接获取用户地理位置,但必须由用户主动授权,且仅在 HTTPS 或 localhost 环境下生效——HTTP 页面会静默失败,连提示都不给。
Geolocation API 必须在安全上下文中调用
Chrome、Firefox、Edge 等现代浏览器强制要求 navigator.geolocation 只能在 HTTPS 协议或 localhost 下使用。非安全源(如 http://192.168.1.100 或本地双击打开的 file:///)会直接抛出 SecurityError,getCurrentPosition 回调根本不会触发。
- 开发时用
python3 -m http.server 8000起的服务仍是 HTTP,不行;得用https-server或 VS Code Live Server 插件(自动启 HTTPS 本地服务) - Vue/React 项目用
npm run serve默认是 HTTPS,可用;Create React App 的开发服务器也默认启用 HTTPS - 线上部署必须配 SSL,哪怕用免费的 Let’s Encrypt
getCurrentPosition 的三个参数别写错顺序
getCurrentPosition 接收三个参数:成功回调、失败回调、配置对象。第二个参数(错误回调)不能省略为 null 或 undefined,否则出错时静默吞掉,你完全不知道为什么没定位成功。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
navigator.geolocation.getCurrentPosition(
(pos) => console.log(pos.coords.latitude, pos.coords.longitude),
(err) => console.error(err.code, err.message), // 必须传!
{ enableHighAccuracy: true, timeout: 5000, maximumAge: 60000 }
);
-
err.code常见值:1(用户拒绝)、2(位置不可用)、3(超时) -
enableHighAccuracy: true会尝试 GPS,但耗电、慢、可能失败;普通场景设为false更稳妥 -
timeout建议设 5–10 秒,太短容易误报超时;maximumAge设 60000(1 分钟)可复用缓存位置,避免重复请求
watchPosition 返回的是监听 ID,不是 Promise
watchPosition 不返回 Promise,而是返回一个数字 ID,用于后续取消监听:navigator.geolocation.clearWatch(watchId)。它会持续触发成功回调,直到手动清除或页面卸载。
立即学习“前端免费学习笔记(深入)”;
- 不要把它当
async/await用——它不支持await,也不返回Promise - 组件卸载(如 React 的
useEffect cleanup)时务必调用clearWatch,否则内存泄漏 + 后台持续耗电 - 连续触发时,
coords.accuracy值可能波动很大(比如从 20m 突然跳到 2000m),建议加个阈值过滤:if (pos.coords.accuracy > 100) return;
真正麻烦的不是调用 API,而是处理「用户点了允许但没拿到坐标」这种中间态——可能是后台定位服务未就绪、GPS 模块冷启动、甚至 Android WebView 权限策略差异。别只测成功路径,err.code === 2 和 accuracy > 500 这两类情况,得有降级方案(比如默认城市、IP 地址粗略定位)。


















