Мне нужно JavaScript для отображения записи вручную, если геолокация отклоняется.
Что я пробовал:
Modernizr.geolocation
navigator.geolocation
Ни один из них не описывает, отказался ли пользователь от доступа к геолокации.
Мне нужно JavaScript для отображения записи вручную, если геолокация отклоняется.
Что я пробовал:
Modernizr.geolocation
navigator.geolocation
Ни один из них не описывает, отказался ли пользователь от доступа к геолокации.
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 и т.д.
С новым разрешением api это доступно как таковое:
navigator.permissions.query({'name': 'geolocation'})
.then( permission => console.log(permission) )
В соответствии со спецификацией 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, называемой геолокацией. Прежде чем использовать эту переменную, я просто проверяю, не является ли 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: У меня недостаточно репутации, чтобы прокомментировать приведенные выше ответы, поэтому мне пришлось создать новый ответ. Извините.