web-dev-qa-db-fra.com

Existe-t-il un moyen de vérifier si la géolocalisation a été refusée avec Javascript?

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.

54
craigmoliver

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.

111
Cristian Sanchez

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)

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

23
Endless

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
    }
}
13
Josh Leitzel

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.

2
Kamae