Есть ли способ проверить, была ли геолокация отклонена с помощью 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)

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


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