J'ai besoin de JavaScript pour afficher une entrée manuelle si la géolocalisation est refusée.
Ce que j'ai essayé:
Modernizr.geolocation
navigator.geolocation
Aucun des deux ne décrit si l'utilisateur a précédemment refusé l'accès à la géolocalisation.
watchPosition
et getCurrentPosition
acceptent tous les deux un deuxième rappel qui est appelé en cas d'erreur. Le rappel d'erreur fournit un argument pour un objet d'erreur. Pour autorisation refusée, error.code
serait error.PERMISSION_DENIED
(valeur numérique 1
).
En savoir plus ici: https://developer.mozilla.org/en/Using_geolocation
Exemple:
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: Comme l'a souligné @Ian Devlin, il ne semble pas que Firefox (4.0.1 au moment de cet article) supporte ce comportement. Cela fonctionne comme prévu dans Chrome et probablement Safari etc.
Avec la nouvelle API d'autorisation, celle-ci est disponible en tant que telle:
navigator.permissions.query({ name: 'geolocation' })
.then(console.log)
(ne fonctionne que pour Blink et Firefox)
Selon le W3C spécification de géolocalisation , votre appel getCurrentPosition
peut renvoyer un rappel pour le succès et un rappel pour l'échec. Cependant, votre rappel d'échec sera invoqué pour toute erreur qui s'est produite, qui est l'une de: (0) inconnue; (1) autorisation refusée; (2) poste non disponible; ou (3) délai d'attente. [ Source: Mozilla ]
Dans votre cas, vous voulez faire quelque chose de spécifique si l'utilisateur a explicitement refusé l'accès. Vous pouvez vérifier le error.code
valeur dans votre rappel d'échec, comme ceci:
navigator.geolocation.getCurrentPosition(successCallback,
errorCallback,
{
maximumAge: Infinity,
timeout:0
}
);
function errorCallback(error) {
if (error.code == error.PERMISSION_DENIED) {
// pop up dialog asking for location
}
}
Résoudre le problème de Firefox est vraiment simple. Dans mon cas, je sauvegarde la géolocalisation dans une variable globale sur Javascript appelée géolocalisation. Avant d'utiliser cette variable, je vérifie simplement si elle n'est pas indéfinie, si c'est le cas, je récupère simplement la géolocalisation à partir de l'IP.
Dans mon site Web, je n'ai aucun problème à obtenir l'emplacement la première fois, mais j'ai vu dans mon court exemple que je n'ai jamais le temps d'obtenir la géolocalisation la première fois car c'est trop rapide.
Quoi qu'il en soit, ce n'est qu'un exemple, vous devez l'adapter dans chaque cas.
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: Je n'ai pas assez de réputation pour commenter les réponses ci-dessus, j'ai donc dû créer une nouvelle réponse. Désolé pour ça.