有没有一种方法可以检查地理定位是否已被Javascript拒绝?


71

如果地理位置下降,我需要JavaScript显示手动输入。

我试过的

Modernizr.geolocation
navigator.geolocation

两者均未描述用户以前是否拒绝访问地理位置。


接受的答案改为@endless
craigmoliver

Answers:



132

watchPositiongetCurrentPosition两个接受时出现错误时被调用的第二回调。错误回调为错误对象提供了一个参数。对于拒绝的权限,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浏览器等。


拒绝权限错误与该人拒绝允许浏览器收集其信息的事实无关。
伊恩·德夫林

1
@Ian Devlin:您确定吗?W3C草案说,“由于文档没有使用Geolocation API的权限而导致位置获取过程失败”时,出现PERMISSION_DENIED错误。但是,我无法在Firefox中使用此行为-尽管它在Chrome中按预期(I)正常工作。
克里斯蒂安·桑切斯

4
不,我现在不确定!:-)我确实读过Firefox无法正确实现此特定位的地方。
伊恩·德夫林

2
截至2013年8月,Firefox(23.0)仍不支持此功能。永远让我想通这个。
Niro

6
您好,2018年!无论用户采用何种方式(从不对现在),现在用户拒绝许可时,Firefox 61都会抛出正确的错误代码。
thunderblaster

15

根据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
    }
}

1
您好,2018年!当用户现在拒绝权限时,Firefox 61会抛出正确的错误代码。
thunderblaster

3

解决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会抛出正确的错误代码。
mraaroncruz

2

内联权限检查

可能的值promptgranteddenied

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

注意:这需要具有async功能

默认值:

如果要处理失败的案例,请?? myDefaultValue在第二行中添加可选内容。

链接:


我自己的答案appart来自所有?
无限

适合演出使用的Inline Null Check提示:@通天/插件,建议,可选式链接
伊戈尔·帕拉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.