如果用户未回答 JavaScript 地理定位小狗,如何继续执行代码?

Posted

技术标签:

【中文标题】如果用户未回答 JavaScript 地理定位小狗,如何继续执行代码?【英文标题】:How to continue code execution if JavaScript geolocation pup-up is not answered by user? 【发布时间】:2019-07-03 05:38:36 【问题描述】:

我们有一个网页在注册时询问用户的地理位置。

网页使用navigator.geolocation.getCurrentPosition( ... )

但是,我们观察到,在某些计算机(带有 Chrome 或 Edge 的 Windows 10)上,请求用户“允许”或“拒绝”位置请求的弹出窗口未显示。我们还发现,如果用户调整大小或移动浏览器窗口,就会出现弹窗,并且可以回答。 但是,如果弹出窗口没有得到响应,代码将停留在等待用户操作。我想知道如果用户在某个时间没有回答,是否有办法继续执行代码。这就像一个弹出超时。超时后,我可以简单地假设用户拒绝了位置请求。无论如何,我们必须让我们的网站继续执行代码,即使弹出窗口从未得到响应。

getCurrentPosition(success callback, errorCallback, timeout: 5000) 在这种情况下不起作用。该超时是指用户允许地理定位但进程超时的情况。

【问题讨论】:

【参考方案1】:

试试这个

// this flag is to only call errorCallback if getCurrentPosition never calls the callback functions
var geolocationRequestCompleted = false;

getCurrentPosition(succesCallback, errorCallback, timeout: 5000)

setTimeout(function () 
    if (!geolocationRequestCompleted) 
        errorCallback()
    
, 5001)

这样,如果在 5001 毫秒后没有调用回调(成功或错误),您将强制 errorCallback() 并且应用程序可以继续。如果 errorCallback 或 successCallback 被调用,则标志 geolocationRequestCompleted 需要设置为 true,以便在 5001 毫秒后,超时不会第二次调用它。

【讨论】:

最好包含指向getCurrentPosition at MDN 的链接。 ;-) 并且 OP 已经涵盖了 timeout 选项(它不会关闭对话框或取消阻止 UI)。 考虑使用watchPosition 及其明确的选项clearWatch Fayzaan 这似乎是一个有趣的解决方案。如果它有效,我会尝试并接受您的回答。 @Yaelet 我看不到 watchPosition 如何成为注册页面的受益者。用户通常注册一次。而且,我看不出 watchPosition 与我的问题有什么关系。 @PatkosCsaba 我的意图是确保请求被取消,同时仍然获得位置数据。您可以在获得所需的位置数据后立即清除请求,也可以使用建议的计时器取消请求。在上面的这种情况下,您仍然面临着 successCallback 触发的“风险”,因为用户可能仍然授予您访问权限。这可能会引入一些非常奇怪的非确定性结果,因为您既失败又成功。 @Yaelet 我同意在上面定义的超时之后用户可能会接受的情况。更好的解决方案是将此功能创建为服务,而不是阻止应用程序进行初始化。这样,您的应用程序就不会在等待用户响应时卡住。

以上是关于如果用户未回答 JavaScript 地理定位小狗,如何继续执行代码?的主要内容,如果未能解决你的问题,请参考以下文章

在表单发布之前执行地理定位 javascript

如何使用 Gmap 在浏览器地理定位中处理用户批准?

来自 3rd 方脚本的 html5 地理定位权限

同时使用地理定位和地理编码 - Javascript

带有地理围栏的 html5 地理定位 API

Chrome中的地理定位API:位置未定义的坐标属性