可直接用 navigator.permissions.query 静默探查地理定位权限状态,仅当 state 为 prompt 或 denied 时再调用 getCurrentPosition;必须由用户交互触发,HTTPS 环境下安全可用,需按 error code 区分处理失败原因并引导用户设置。

可以直接用 navigator.permissions.query 异步检查权限状态,不触发弹窗;确认为 prompt 或 denied 时,再调用 getCurrentPosition 发起实际授权请求。关键在于“先查后要”,避免无意义打扰用户。
用 query 预判状态,不弹窗
Permissions API 的核心价值是静默探查。只要页面是 HTTPS(现代浏览器强制要求),就能安全调用:
-
navigator.permissions.query({ name: 'geolocation' })返回 Promise,解析后得到state字段 -
granted:已允许,可直接定位 -
denied:明确拒绝,不再重复请求,改走降级方案 -
prompt:尚未决定,此时才是发起getCurrentPosition的合适时机
封装请求逻辑,绑定用户动作
不能在页面加载时自动调用 getCurrentPosition,必须由用户显式交互触发:
- 监听按钮点击、图标点击等事件,在回调中执行定位流程
- 点击前可用文案说明用途,例如:“开启定位,为您推荐附近门店”
- 若
query返回prompt,再调用getCurrentPosition;若已是granted,跳过弹窗直接获取位置
处理失败与错误码,给出明确反馈
getCurrentPosition 的 error 回调返回 PositionError 对象,需按 code 区分响应:
- code === 1(PERMISSION_DENIED):用户点“拒绝”或设置中关闭了该网站权限 → 提供跳转浏览器设置的指引(如 Chrome 地址栏右侧锁形图标 → 网站设置 → 位置 → 允许)
- code === 2(POSITION_UNAVAILABLE):设备无 GPS、Wi-Fi 关闭、系统定位服务未开 → 提示检查手机设置中的“定位服务”总开关
- code === 3(TIMEOUT):60 秒内无响应 → 可尝试重试一次,或立即启用手动输入城市作为备选
适配 iframe 场景下的权限隔离
如果地理定位功能嵌在 iframe 中,父页面必须显式授权,否则子帧即使调用 query 也会返回 denied:
- 父页面需在
<iframe>标签中添加allow="geolocation" - 或通过 HTTP 响应头发送
Permissions-Policy: geolocation=(self) - 可在 Chrome 开发者工具的 Application → Frames 面板中,逐个查看各 iframe 的生效策略

















