有没有办法检查地理位置是否已被 Javascript 拒绝?

IT技术 javascript html w3c-geolocation
2021-01-15 23:26:44

如果地理位置被拒绝,我需要 JavaScript 来显示手动输入。

我尝试过的:

Modernizr.geolocation
navigator.geolocation

两者都没有描述用户之前是否拒绝访问地理位置。

5个回答

watchPosition并且getCurrentPosition都接受在出现错误时调用的第二个回调。错误回调为错误对象提供了一个参数。对于被拒绝的权限,error.code将是error.PERMISSION_DENIED(数值1)。

在此处阅读更多信息:https : //developer.mozilla.org/en/Using_geolocation

例子:

navigator.geolocation.watchPosition(function(position) {
    console.log("i'm tracking you!");
  },
  function(error) {
    if (error.code == error.PERMISSION_DENIED)
      console.log("you denied me :-(");
  });

编辑:正如@Ian Devlin 所指出的,Firefox(本文发布时为 4.0.1)似乎不支持这种行为。它将按预期在Chrome和可能Safari浏览器等。

截至 2013 年 8 月,Firefox(23.0) 仍不支持此功能。我花了很长时间才弄清楚这一点。
2021-03-14 23:26:44
不,我现在不确定!:-) 我确实在某处读到 Firefox 没有正确实现这个特定的位。
2021-03-24 23:26:44
@Ian Devlin:你确定吗?W3C 草案说,当“位置获取过程失败,因为文档没有使用地理定位 API 的权限”时,会给出 PERMISSION_DENIED 错误。但是,我无法在 Firefox 中使用此行为——尽管它在 Chrome 中按预期工作。
2021-04-02 23:26:44
2018 年你好!当用户拒绝许可时,Firefox 61 会抛出正确的错误代码,无论使用何种方法(从不与现在)。
2021-04-08 23:26:44
权限被拒绝错误与此人拒绝允许浏览器收集他们的信息这一事实无关。
2021-04-09 23:26:44

在不提示用户的情况下,您可以使用可用的新权限 api:

navigator.permissions.query({ name: 'geolocation' })
.then(console.log)

(仅适用于 Blink 和 Firefox)

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

@trev9065 Blink 是 Chrome 使用的浏览器引擎。
2021-03-17 23:26:44
Safari 再次成为新的 IE :(
2021-04-07 23:26:44

根据 W3C地理定位规范,您的getCurrentPosition调用可以返回成功回调和失败回调。但是,您的失败回调将针对发生的任何错误调用,这是以下之一:(0) 未知;(1) 许可被拒绝;(2) 职位不可用;或 (3) 超时。[来源:Mozilla ]

在您的情况下,如果用户明确拒绝访问,您想要做一些特定的事情。您可以检查error.code失败回调中值,如下所示:

navigator.geolocation.getCurrentPosition(successCallback,
    errorCallback,
    {
        maximumAge: Infinity,
        timeout:0
    }
);

function errorCallback(error) {
    if (error.code == error.PERMISSION_DENIED) {
        // pop up dialog asking for location
    }
}
2018 年你好!当用户现在拒绝权限时,Firefox 61 会抛出正确的错误代码。
2021-04-03 23:26:44

内联权限检查

可能的值promptgranteddenied

const permissionStatus = await navigator?.permissions?.query({name: 'geolocation'})
const hasPermission = permissionStatus?.state // Dynamic value

注意:这需要在一个async函数中

默认值:

如果要处理失败的情况,请?? myDefaultValue在第二行添加一个可选项

链接:

适合展示使用Inline Null Check提示:@babel/plugin-proposal-optional-chaining
2021-04-02 23:26:44
我自己的答案有点重复 ?
2021-04-09 23:26:44

修复 Firefox 问题真的很容易。就我而言,我将地理位置保存在 Javascript 上名为 geolocation 的全局变量中。在使用这个变量之前,我只检查是否未定义,如果是,我只是从 IP 获取地理位置。

在我的网站中,我第一次获取位置没有任何问题,但我在我的简短示例中看到,第一次获取地理位置的时间太快了。

无论如何,这只是一个示例,您应该在每种情况下对其进行调整。

var geolocation = {};
getLocation();

$(document).ready(function(){
    printLocation(); // First time, hasn't time to get the location
});

function printLocation(){
    if(typeof geolocation.lat === "undefined" || typeof geolocation.long === "undefined"){
        console.log("We cannot get the geolocation (too fast? user/browser blocked it?)");
        // Get location by IP or simply do nothing
    }
    else{
        console.log("LATITUDE => "+geolocation.lat);
        console.log("LONGITUDE => "+geolocation.long);
    }
}

function getLocation() {
    // If the user allow us to get the location from the browser
    if(window.location.protocol == "https:" && navigator.geolocation)
        navigator.geolocation.getCurrentPosition(function(position){
            geolocation["lat"] = position.coords.latitude;
            geolocation["long"] = position.coords.longitude;
            printLocation(); // Second time, will be return the location correctly
        });
    else{
        // We cannot access to the geolocation
    }
}

PS:我没有足够的声誉来评论上述答案,所以我不得不创建一个新答案。对于那个很抱歉。

2018 年你好!当用户现在拒绝权限时,Firefox 61 会抛出正确的错误代码。
2021-03-31 23:26:44