Подтвердить что ты не робот

Есть ли способ проверить, была ли указана геолокация с помощью Javascript?

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

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

Modernizr.geolocation
navigator.geolocation

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

4b9b3361

Ответ 1

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 :-(");
});

EDIT: Как заметил @Ian Devlin, Firefox не показывает, что Firefox (4.0.1 на момент публикации) поддерживает это поведение. Он работает так, как ожидалось, в Chrome и, возможно, Safari и т.д.

Ответ 2

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

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

Ответ 3

В соответствии со спецификацией 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
    }
}

Ответ 4

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