gpt4 book ai didi

javascript - 当 Mac 设置(不是浏览器设置)拒绝位置共享时,HTML5 Geolocation API 悄然失败

转载 作者:行者123 更新时间:2023-12-03 15:53:50 26 4
gpt4 key购买 nike

我遇到了一个问题,如果我的 Mac 拒绝位置共享,那么 JS 代码中什么也不会发生……这很危险,无论如何要解决这个问题?如果系统拒绝位置共享,我希望会抛出异常
运行macOS Mojave 10.14.6并在 Chrome 87.0.4280.88 中测试过.
System Preferences > Security & Privacy ,您可以查看Enable Location Services然后检查允许的应用程序。如果我取消选中 Enable Location Services完全或保持选中但取消选中Google Chrome ,然后代码悄悄地失败*,我的意思是在下面的示例代码中没有任何内容记录到控制台。
代码:

$("#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)
}
)
} else {
console.log("GPS not supported by browser")
}
})
是否有一种元方法来捕捉这一点(例如,确定是否在 JS 的系统首选项中启用了位置)以便记录某些内容并且我可以进入代码中的下一步?
*代码悄悄地失败了,但从技术上讲,浏览器有提醒你的方法,但只有第一次。所以基本上,假设您的浏览器没有阻止 URL 并且您使用的是 HTTPS(例如,满足所有浏览器条件),您第一次点击 #btn , 你会得到 navigator.geolocation.getCurrentPosition 的原生弹出窗口触发请求您的许可。现在,即使您单击允许,因为系统偏好不允许它,它也不会共享,代码不会记录任何内容。但至少这是你第一次看到正在发生的事情。在随后的点击中,无论是浏览器还是代码都不会发生任何事情。同样,我更关心代码,只是指出我承认浏览器向您展示了一些东西。

最佳答案

在某些浏览器上,您可以在不提示用户的情况下检查权限状态,如下所示:

const permissionStatus = await navigator.permissions.query({ name: 'geolocation' })

Compatibility: http://caniuse.com/#feat=permissions-api


尽管请注意,这仅表示浏览器级别的权限。即使授予了这个权限,像操作系统这样的另一层仍然可以在链的后面拒绝它。
鉴于 navigator.geolocation.getCurrentPosition() always immediately returns with undefined 无论如何,处理这些情况您能做的最好的事情就是拥有 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 specification浏览器必须在成功/错误时调用回调函数的详细信息,浏览器本身不太可能将其静音。操作系统更有可能决定从不响应而不是拒绝访问,如果没有提供超时,则使函数无限期地处于挂起状态。

关于javascript - 当 Mac 设置(不是浏览器设置)拒绝位置共享时,HTML5 Geolocation API 悄然失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65543741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com