9

我正在使用 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.');
            }

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

这个问题与这篇文章有关: 当用户允许或拒绝访问“物理位置”时如何调用函数?

4

1 回答 1

16

如果用户简单地拒绝许可请求(而不是单击“拒绝”按钮) ,规范实际上对是否必须执行回调非常安静:

对于getCurrentPosition和,在没有首先从用户那里获得共享位置的许可watchPosition之前,实现绝不能调用。successCallback此外,在执行上述任何一个getCurrentPosition或多个watchPosition步骤之前,实施应始终获得用户共享位置的许可。如果用户授予权限,则必须如上所述调用适当的回调。如果用户拒绝许可,errorCallback则必须使用 code 调用(如果存在)PERMISSION_DENIED,而不管上述步骤中遇到的任何其他错误。获取用户权限所花费的时间不得包含在参数timeout属性所涵盖的时间段内。PositionOptionstimeout属性必须只适用于位置获取操作。

我想说的是,从getCurrentPosition. 单击拒绝是显式的,而解雇(单击 X)是隐式的。

功能上不同的是,点击拒绝按钮意味着(1)当前请求被拒绝,(2)站点被列入黑名单,并且永远不会提示用户再次为站点共享位置;简单地关闭请求仅意味着当前请求被拒绝 - 未来的请求(在未来的BROWSINGCONTEXT s - 在重新加载页面之后)将再次提示。

在我看来,Chrome、Firefox 和 IE 的当前行为是一个错误——如果用户通过单击 X 关闭权限请求,这三个都不会执行任何操作。errorCallback如果地理定位权限请求被关闭,则应该调用 ,因为getCurrentLocation在当前 BROWSINGCONTEXT 将静默失败。(Opera 11.52 表现“正确”,因为它的权限请求 UI 只有允许/拒绝按钮 - 没有 X。)

Mozilla 有一个错误,他们说当前的行为是正确的,并且有一个新的错误打开了相关的错误;Chromuim 还表示当前的行为是正确的。IE 有一个错误 (需要注册),但奇怪的是,微软将其关闭为不可重现。

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


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

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.

    // ...
}
于 2012-02-10T00:25:50.877 回答