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

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

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

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

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

【问题讨论】:

    标签: javascript html browser geolocation


    【解决方案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 我同意在上面定义的超时之后用户可能会接受的情况。更好的解决方案是将此功能创建为服务,而不是阻止应用程序进行初始化。这样,您的应用程序就不会在等待用户响应时卡住。
    猜你喜欢
    • 2013-02-09
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2012-10-25
    • 2022-11-11
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多