应通过error回调的code字段主动识别定位异常:code=1引导用户手动开启权限,code=3降级重试或提示开阔地,code=2检查设备状态;超时需分级应对,表单提交不可阻塞定位异步流程。

权限拒绝和超时不是代码出错,而是用户行为或环境限制导致的正常响应。关键在于不依赖弹窗是否出现,而要靠错误码主动识别、分类引导。
必须传 error 回调并用 code 判断类型
只写 success 回调会导致拒绝或超时后页面“没反应”,用户以为功能失效。error 对象的 code 字段比 message 更稳定,各浏览器一致:
- code === 1(PERMISSION_DENIED):用户点了“不允许”,或系统级位置开关关闭。此时应停止重试,显示设置引导按钮
- code === 3(TIMEOUT):定位等待超时,常见于室内、弱信号或 enableHighAccuracy 开启但 GPS 未冷启动。可提示“请到开阔地重试”或自动降级重试(如关闭高精度)
- code === 2(POSITION_UNAVAILABLE):设备无定位能力(如飞行模式、GPS 硬件故障),需提示检查设备状态
拒绝后不再弹窗,必须引导手动重设
iOS Safari 和多数安卓浏览器对“拒绝”采用永久静默策略——刷新页面、再点按钮也不会重新弹窗。不能靠 JS 触发二次请求,只能靠用户操作:
- iOS:提示用户进入「设置 → Safari → 位置」,将网站设为“使用期间”
- Android:引导下拉通知栏长按“位置”图标开启,或进「设置 → 位置信息 → 浏览器」开启权限
- 部分国产浏览器不支持跳转设置页,统一用文字+截图示意更可靠
超时不是失败终点,可分级应对
timeout 参数设太小(如 3000ms)易误判;设太大(如 30000ms)又影响体验。建议:
- 首请求设 timeout: 10000,enableHighAccuracy: false(兼顾通过率与基础精度)
- 若返回 TIMEOUT,可降级重试:timeout: 15000,enableHighAccuracy: true,并提示“正在尝试更准定位…”
- 两次都失败,就放弃自动获取,改用城市选择器或 IP 地址粗略定位作为兜底
别在表单提交时硬等位置
HTML 表单 submit 是同步事件,getCurrentPosition 是异步回调。强行阻塞会导致卡死或忽略拒绝逻辑:
- 正确做法:点击“提交”后先调用定位,成功则填入隐藏字段再 submit;失败则允许提交,位置字段留空并加提示“未启用位置,将按默认城市处理”
- 不要给位置相关 input 加 required 属性,它无法校验 JS 获取结果
- 可加 loading 状态按钮,失败后还原按钮并显示引导文案,避免用户反复点击
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











