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

时间:2011-05-23 02:55:02

标签: javascript html5 w3c-geolocation

如果地理位置被拒绝,我需要JavaScript才能显示手动条目。

我尝试过:

Modernizr.geolocation
navigator.geolocation

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

5 个答案:

答案 0 :(得分:107)

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 :(得分:21)

使用新的权限api可以这样使用:



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




(仅适用于Blink& Firefox)

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

答案 2 :(得分:13)

根据W3C geolocation specification,您的getCurrentPosition调用可以返回成功回调和失败回调。但是,将针对发生的任何错误调用您的失败回调,其中包含以下错误之一:(0)unknown; (1)许可被拒绝; (2)职位空缺;或(3)超时。 [Source: 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
    }
}

答案 3 :(得分:2)

修复Firefox问题非常简单。在我的例子中,我将地理定位保存在一个名为geolocation的Javascript上的全局变量中。在使用此变量之前,我只检查是否未定义,如果是,我只是从IP获取地理位置。





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





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




  var geolocation = {};
 getLocation();

 $(document).ready(function(){
 printLocation(); //第一次,没有时间获取位置
});

 function printLocation() {
 if(typeof geolocation.lat ===“undefined”|| typeof geolocation.long ===“undefined”){
 console.log(“我们无法获得地理位置(太快了?用户/浏览器阻止了它?)”);
 //通过IP获取位置或者什么都不做
 }
其他{
 console.log(“LATITUDE =>”+ geolocation.lat);
 console.log(“LONGITUDE =>”+ geolocation.long);
 }
}

 function getLocation(){
 //如果用户允许我们从浏览器获取位置
 if(window.location.protocol ==“https:”&& navigator.geolocation)
 navigator.geolocation.getCurrentPosition(function(position){
 geolocation [“lat”] = position.coords.latitude;
 geolocation [“long”] = position.coords.longitude;
 printLocation (); //第二次,将正确返回位置
});
其他{
 //我们无法访问地理定位
 }
}
  




PS:我没有足够的声誉评论上述答案所以我不得不创建一个新的回答。对此感到抱歉。




答案 4 :(得分:2)

内联权限检查

可能的值为promptgranteddenied

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

注意:这需要具有async函数

默认值:

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

链接: