Есть ли способ проверить, была ли геолокация отклонена с помощью Javascript?
Мне нужен JavaScript для отображения ручной записи, если геолокация отклонена.
что я пробовал:
Modernizr.geolocation
navigator.geolocation
ни один не описывает, если пользователь ранее отказался от доступа к геолокации.
4 ответов
watchPosition
и getCurrentPosition
оба принимают второй обратный вызов, который вызывается при возникновении ошибки. Обратный вызов error предоставляет аргумент для объекта error. За отказ в разрешении,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 :-(");
});
EDIT: как отметил @Ian Devlin, кажется, Firefox (4.0.1 на момент этого сообщения) не поддерживает такое поведение. Он работает, как ожидалось в Chrome и наверное Safari etc.
С новым api разрешений это доступно как таковое:
navigator.permissions.query({'name': 'geolocation'})
.then( permission => console.log(permission) )
(работает только для Blink & Firefox)
согласно W3C спецификация геолокации ваш getCurrentPosition
call может возвращать обратный вызов для успеха и обратный вызов для сбоя. Однако ваш обратный вызов сбоя будет вызван для любой произошла ошибка, которая является одной из: (0) неизвестно; (1) отказано в разрешении; (2) позиция недоступна; или (3) тайм-аут. [Источник: Mozilla]
в вашем случае вы хотите сделать что-то конкретное, если пользователь явно отказано в доступе. Вы можете проверить the 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: у меня недостаточно репутации, чтобы прокомментировать приведенные выше ответы, поэтому мне пришлось создать новый ответ. Сожалеть об этом.