如果地理位置被拒绝,我需要JavaScript才能显示手动条目。
我尝试过:
Modernizr.geolocation
navigator.geolocation
两者都没有描述用户之前是否拒绝访问地理位置。
答案 0 :(得分:107)
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等。
答案 1 :(得分:21)
使用新的权限api可以这样使用:
navigator.permissions.query({ name: 'geolocation' })
.then(console.log)

(仅适用于Blink& Firefox)
答案 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)