Есть ли способ проверить, было ли геолокация отклонена с помощью Javascript? - PullRequest
53 голосов
/ 23 мая 2011

Мне нужен JavaScript для отображения ввода вручную, если геолокация отклонена.

Что я пробовал:

Modernizr.geolocation
navigator.geolocation

Ни один из описаний, если ранее пользователь отказывался от доступа к геолокации.

Ответы [ 4 ]

108 голосов
/ 23 мая 2011

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 и т. Д.

22 голосов
/ 10 июня 2016

С новым разрешением API это доступно как:

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

(работает только для Blink и Firefox)

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

13 голосов
/ 23 мая 2011

В соответствии со спецификацией геолокации 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
    }
}
2 голосов
/ 10 июня 2016

Исправить проблему Firefox действительно легко. В моем случае я сохраняю геолокацию в глобальной переменной на Javascript, которая называется геолокация. Прежде чем использовать эту переменную, я просто проверяю, не является ли она неопределенной, если да, то я просто получаю геолокацию по 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: У меня недостаточно репутации, чтобы комментировать вышеприведенные ответы, поэтому мне пришлось создать новый ответ. Извините за это.

...