在某些浏览器上,您可以检查权限状态而不提示用户,如下所示:
const permissionStatus = await navigator.permissions.query({ name: 'geolocation' })
兼容性:http://caniuse.com/#feat=permissions-api http://caniuse.com/#feat=permissions-api
但请注意,这仅表示浏览器级别的权限。即使授予了此权限,操作系统等另一层仍然可以在链中稍后拒绝它。
鉴于navigator.geolocation.getCurrentPosition()
总是立即返回undefined https://w3c.github.io/geolocation-api/#getcurrentposition-method无论如何,处理这些情况你能做的最好的事情就是有一个timeout
如果没有向浏览器提供响应,则强制在给定持续时间后调用错误回调。幸运的是,您可以通过通过轻松地做到这一点options
作为函数的第三个参数。
const options = { timeout: 5000 }
navigator.geolocation.getCurrentPosition(successCb, errorCb, options)
在你的情况下:
$("#btn").click(function(e){
e.preventDefault()
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
// success
function(location) {
console.log("GPS coordinates retrieved")
},
// failure
function(error) {
console.log(error.message)
},
{
timeout: 5000 // ms
}
)
} else {
console.log("GPS not supported by browser")
}
})
鉴于W3C规范 https://w3c.github.io/geolocation-api/#getcurrentposition-method浏览器的详细信息must在成功/错误时调用回调函数,它不太可能被浏览器本身静音。如果没有提供超时,操作系统更有可能决定永远不响应,而不是拒绝访问,从而使函数无限期地处于挂起状态。