PERMISSION_DENIED:浏览器未被允许访问设备位置。页面第一次尝试访问 Geolocation API 时,浏览器会弹出确认对话框取得用户授权(每个域分别获取)。如果返回了这个错误码,则要 么是用户不同意授权,要么是在不安全的环境下访问了 Geolocation API。message 属性还会提 供额外信息。 POSITION_UNAVAILABLE:系统无法返回任何位置信息。这个错误码可能代表各种失败原因, 但相对来说并不常见,因为只要设备能上网,就至少可以根据 IP 地址返回一个低精度的坐标。
软件与硬件检测
TIMEOUT:系统不能在超时时间内返回位置信息。关于如何配置超时,会在后面介绍。
// 浏览器会弹出确认对话框请用户允许访问Geolocation API // 这个例子显示了用户拒绝之后的结果 navigator.geolocation.getCurrentPosition(
() => {}, 4 (e) => {
console.log(e.code); // 1
console.log(e.message); // User denied Geolocation
}
);
// 这个例子展示了在不安全的上下文中执行代码的结果 navigator.geolocation.getCurrentPosition(
() => {},
(e) => {
console.log(e.code); // 1
console.log(e.message); // Only secure origins are allowed
}
);
Geolocation API 位置请求可以使用 PositionOptions 对象来配置,作为第三个参数提供。这个对 象支持以下 3 个属性。 8 enableHighAccuracy:布尔值,true 表示返回的值应该尽量精确,默认值为 false。默认情 况下,设备通常会选择最快、最省电的方式返回坐标。这通常意味着返回的是不够精确的坐标。 9 比如,在移动设备上,默认位置查询通常只会采用 Wi-Fi 和蜂窝网络的定位信息。而在 enableHighAccuracy 为 true 的情况下,则会使用设备的 GPS 确定设备位置,并返回这些值 的混合结果。使用 GPS 会更耗时、耗电,因此在使用 enableHighAccuracy 配置时要仔细权 衡一下。 timeout:毫秒,表示在以 TIMEOUT 状态调用错误回调函数之前等待的最长时间。默认值是 0xFFFFFFFF(232 – 1)。0 表示完全跳过系统调用而立即以 TIMEOUT 调用错误回调函数。 11 maximumAge:毫秒,表示返回坐标的最长有效期,默认值为 0。因为查询设备位置会消耗资源, 所以系统通常会缓存坐标并在下次返回缓存的值(遵从位置缓存失效策略)。系统会计算缓存期, 如果 Geolocation API 请求的配置要求比缓存的结果更新,则系统会重新查询并返回值。0 表示强 制系统忽略缓存的值,每次都重新查询。而 Infinity 会阻止系统重新查询,只会返回缓存的 值。JavaScript 可以通过检查 Position 对象的 timestamp 属性值是否重复来判断返回的是不 是缓存值。
2. Connection State 和 NetworkInformation API
浏览器会跟踪网络连接状态并以两种方式暴露这些信息:连接事件和 navigator.onLine 属性。 在设备连接到网络时,浏览器会记录这个事实并在 window 对象上触发 online 事件。