能获取,但必须满足https或localhost、用户主动授权、浏览器支持三个硬性前提;调用无反应主因是上下文不合法,如http协议被禁用、iframe缺失geolocation权限、用户曾拒绝授权或webview不支持;error回调需区分code 1(拒绝)、2(不可用)、3(超时),success中须取position.coords.latitude/longitude;wgs84坐标需转gcj02才能在国内地图精准标点。

能获取,但必须满足三个硬性前提:HTTPS 或 localhost、用户主动授权、浏览器支持。缺一不可,否则 navigator.geolocation 直接不可用或静默失败。
为什么调用 navigator.geolocation.getCurrentPosition 没反应?
最常见原因不是代码写错,而是上下文不合法:
- 页面跑在
http://(非 HTTPS)下 —— 现代浏览器直接禁用该 API,控制台报错Only secure contexts can use Geolocation - 在 iframe 里调用且未声明
geolocation权限:<iframe allow="geolocation"></iframe>缺失 - 用户此前点过“拒绝”,后续调用会直接进 error 回调,不会再次弹窗;需引导用户手动到浏览器地址栏点击锁形图标重置权限
- 部分安卓 WebView(尤其旧版微信内置浏览器)完全不实现该接口,
navigator.geolocation为undefined
getCurrentPosition 的 success 和 error 回调怎么写才可靠?
别只写一个 success 函数,error 回调必须处理具体错误码,不同码代表不同问题:
-
error.code === 1:用户拒绝(PERMISSION_DENIED)—— 提示用户去设置页开启 -
error.code === 2:位置服务不可用(POSITION_UNAVAILABLE)—— 比如关了 GPS、飞行模式、无网络时仅靠基站定位失败 -
error.code === 3:超时(TIMEOUT)—— 默认无 timeout,务必在 options 里设timeout: 10000 - success 回调中,
position.coords.latitude和position.coords.longitude才是你要的 WGS84 坐标,别漏掉.coords
示例片段:
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
(pos) => console.log(`lat: ${pos.coords.latitude}, lng: ${pos.coords.longitude}`),
(err) => console.error(`定位失败(${err.code}): ${err.message}`),
{ enableHighAccuracy: true, timeout: 10000, maximumAge: 60000 }
);
} else {
console.error('浏览器不支持 geolocation');
}
拿到的经纬度能在高德/腾讯地图上直接标点吗?
不能直接标。浏览器返回的是 WGS84 坐标系,而高德、腾讯等国内地图使用 GCJ02 坐标系,二者存在几十到几百米偏移。
- 如果你只在国内用,且用高德 JS API,它内部会自动做 WGS84 → GCJ02 转换,传入原始坐标即可
- 但若你用 Leaflet + 自建瓦片、或自己计算距离/范围,必须显式转换,否则地图上点位漂移明显
- 没有浏览器原生转换方法,需引入第三方库(如
gcoord)或调用高德/腾讯的坐标转换接口(注意配额) - 转换不是 100% 精确,GCJ02 是加密偏移,逆向有误差,生产环境建议以地图厂商 SDK 为准
真正容易被忽略的点是:WGS84 坐标本身没问题,但一旦和国内地图服务混用,不转换就上线,用户会发现“我明明站在店门口,地图上显示我在隔壁停车场”。这个坑没法靠调试发现,得实机走一遍。










