HTML5 Geolocation API 不可用的主因是未满足启用条件:必须使用 HTTPS(本地 HTTP 除外),用户已授权,设备支持且系统定位开启,浏览器未禁用;getCurrentPosition 失败需据 error.code 区分处理。
HTML5 Geolocation API 无法调用,绝大多数情况不是代码写错了,而是根本没满足启用条件——浏览器不会报错,只会静默拒绝或返回 PermissionDenied。
navigator.geolocation 是 undefined 或不可用现代浏览器(Chrome、Firefox、Edge、Safari)只在满足以下全部条件时才暴露 navigator.geolocation 对象:
https:// 协议下(http:// 仅限 localhost 和 127.0.0.1)chrome://settings/content/location)getCurrentPosition() 调用失败的常见原因和应对即使 navigator.geolocation 存在,getCurrentPosition() 仍可能失败。错误回调中的 error.code 是关键线索:
error.code === 1:用户拒绝授权 → 检查地址栏锁形图标,点击重新允许error.code === 2:位置服务不可用(如飞行模式、禁用 GPS、无网络)→ 提示用户检查系统设置error.code === 3:请求超时(默认 0ms)→ 必须显式传入 timeout 选项enableHighAccuracy: true 时,部分安卓 WebView 可能直接返回空结果navigator.geolocation.getCurrentPosition( (pos) => console.log(pos.coords.latitude, pos.coords.longitude), (err) => console.error('定位失败:', err.code, err.message), { timeout: 10000, maximumAge: 60000, enableHighAccuracy: false } );
非本地开发环境下,http:// 页面调用 navigator.geolocation 会直接失败(Chrome 从 50 版起强制),且控制台通常不报错,只返回 undefined 或静默跳过。
http://localhost:8080 或 http://127.0.0.1:3000
file:// 协议打开 HTML 文件?一律无效 —— 浏览器直接屏蔽Android WebView 和 iOS WKWebView 默认禁用定位 API,需额外配置:
WebView.getSettings().setJavaScriptEnabled(true) 后,必须调用 setGeolocationEnabled(true)
Info.plist 中添加 NSLocationWhenInUseUsageDescription 描述,并在 JS 中调用前确保原生层已授权Geolocation,需降级用 IP 地址粗略定位或引导用户跳转外部浏览器真正卡住人的,往往不是怎么写,而是不知道它在哪一步就默默退出了 —— 检查协议、看地址栏图标、查控制台 Network 标签页是否加载了 HTTPS 资源,比反复改 JS 更有效。