如果地理位置下降,我需要JavaScript显示手动输入。
我试过的
Modernizr.geolocation
navigator.geolocation
两者均未描述用户以前是否拒绝访问地理位置。
Answers:
在不提示用户的情况下,您可以使用新的权限api,如下所示:
navigator.permissions.query({ name: 'geolocation' })
.then(console.log)
(仅适用于Blink和Firefox)
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浏览器等。
根据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
}
}
解决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:我没有足够的声誉来评论以上答案,因此我不得不创建一个新答案。对于那个很抱歉。