当用户在Firefox和Chrome中关闭“物理位置”提示时如何处理?

时间:2012-02-09 22:05:43

标签: javascript google-chrome geolocation w3c-geolocation

我正在使用Geolocation对象和getCurrentPosition()。

你有没有看到每次你使用getCurrentPosition Firefox和Chrome提示这些按摩?

铬:

Example.com wants to track your physical location [allow] [deny] [ X close ]

火狐:

Example.com wants to know your location [Share Location] [Don't Share] [Close]

我的问题是:当用户没有“允许”或“拒绝”位置选项而是关闭提示时,如何处理?

我有这个JAVASCRIPT代码但是当用户关闭提示时它不起作用:

            if (navigator.geolocation) {
                navigator.geolocation.getCurrentPosition(
                    onSuccess,
                    onError,
                    {
                        //enableHighAccuracy: true,
                        timeout: 5000
                        //maximumAge: 120000
                    }
                );
                    alert("holaaaa");
            } else {
                alert('Geolocation not supported.');
            }

我遇到了一些问题,请帮忙吗?

  

这个问题与这篇文章有关:   How to call function when user Allows or Denies access to "Physical Location"?

1 个答案:

答案 0 :(得分:15)

spec实际上非常安静,如果用户只是驳回了权限请求(而不是单击“拒绝”按钮),是否必须执行回调:

  

对于getCurrentPositionwatchPosition,如果没有首先获得用户共享位置的许可,则实施必须永远不会调用successCallback。此外,在执行上述任何getCurrentPositionwatchPosition步骤之前,实现应始终获得用户共享位置的权限。如果用户授予权限,则必须如上所述调用适当的回调。 如果用户拒绝权限,则必须使用代码errorCallback 调用PERMISSION_DENIED(如果存在),而不考虑上述步骤中遇到的任何其他错误。获取用户权限所花费的时间不得包含在timeout参数的PositionOptions属性所涵盖的时间段内。 timeout属性必须仅适用于位置获取操作。

我会说解雇权限请求相当于从getCurrentPosition的角度拒绝请求。单击拒绝是明确的,而解雇(单击X)是隐式的。

在功能上,区别在于单击拒绝按钮意味着(1)当前请求被拒绝,以及(2)该站点被列入黑名单,并且永远不会提示用户再次为该站点共享位置;简单地解除请求只意味着当前请求被拒绝 - 未来的请求(在重新加载页面后的未来BROWSINGCONTEXT中)将再次提示。

在我看来,Chrome,Firefox和IE的当前行为是一个错误 - 如果用户通过单击X来解除权限请求,则三者都不会执行任何操作。如果地理位置权限请求是errorCallback,则应调用getCurrentLocation被解雇是因为当前BROWSINGCONTEXT中对if (navigator.geolocation) { var etimeout = setTimout(onError, 10000); navigator.geolocation.getCurrentPosition(onSuccess, onError, {timeout:5000}); } function onSuccess(pos) { clearTimeout(etimeout); // ... } function onError(err) { clearTimeout(etimeout); // Note `err` will actually be undefined if this is the result of our timeout // and anything you do here should be undone by `onSuccess` (in case the user // took longer than 5 seconds to approve the request; for that reason, you // shouldn't display any modal UI from here. // ... } 的任何进一步调用都将无声地失败。 (Opera 11.52表现'正确',因为它的权限请求UI只有允许/拒绝按钮 - 没有X.)

Mozilla有一个bug,他们说当前的行为是正确的,并且是一个较新的bug开放式bug,它是相关的; Chromuim also says目前的行为是正确的。 IE有a bug (需要注册),但奇怪的是,Microsoft将其关闭为不可重现的。

这确实是W3C工作组需要解决的问题。该页面应该能够对拒绝位置权限请求的用户作出反应 - 无论是通过单击X来永久拒绝还是仅拒绝此会话。


你现在唯一能够解决这种情况的事情就是设置你自己的超时。在地理定位请求中设置超时,然后将错误超时设置为长于此值(以允许用户有时间对请求作出反应):

{{1}}