47 votes

fonction fail jamais appelée si l'utilisateur refuse de partager la géolocalisation dans firefox

J'ai donc ce code javascript. Dans safari et chrome, si l'utilisateur refuse de partager l'emplacement, il échouera comme il se doit; Cependant, dans Firefox, ce n'est pas le cas.

Toute aide appréciée.

 function initGeolocation()
{
    if( navigator.geolocation )
    {          
          // Call getCurrentPosition with success and failure callbacks
          navigator.geolocation.getCurrentPosition( success, fail );
    }
    else
    {
          alert("Sorry, your browser does not support geolocation services.");
    }
}

 var map;
 function success(position)
 {

     var longIDText = document.getElementById('longID');
     var latIDText = document.getElementById('latID');
     longIDText.value = position.coords.longitude;
     latIDText.value = position.coords.latitude;
     document.getElementById('coordSubmitID').click();
  }

  function fail(error)
  {
          alert("FAAAAAAAAAAIIIIIIIIIL")
          var zip_code ;
          while (true){
              // Could not obtain location

              zip_code = prompt("Please enter your current address or zip code","");


              if ( zip_code == "" ) {
                  alert(zip_code +" is not a valid address. Please try again.");
              } 
              else{
                break;
              }
          }
          var zipIDText = document.getElementById('zipID');
          zipIDText.value = zip_code;
          document.getElementById('coordSubmitID').click();
  }
 

29voto

Alex K. Points 67805

Pour Firefox, il semble qu' PERMISSION_DENIED est déclenché uniquement si "Jamais" partager " est sélectionné; si la boîte de dialogue fermée, ou "Pas maintenant" est sélectionné, effectivement il ne se passe rien, même sur mozillas géolocalisation démo si vous fermez les autorisations de l'INTERFACE utilisateur, rien ne se passe.

Cela signifie qu' getCurrentPosition peut renvoyer soit parce que l'utilisateur a fermé la confirmation de l'INTERFACE utilisateur, ou parce qu'il a lancé avec succès il asynchrone demande - leur ne semble pas être un moyen de discrimination entre les deux.

https://bugzilla.mozilla.org/show_bug.cgi?id=675533

21voto

Jamie Points 131

C'est une vraie douleur, et une fonctionnalité certainement pas souhaitable.

La solution de contournement que j'utilise pour éviter à l'utilisateur d'attendre est de définir un délai d'expiration pour vérifier si le compteur d'attente s'affiche au bout de 3 secondes et, le cas échéant, masquez-le et affichez une entrée de code postal manuelle:

 var latlng;

var waitTime = 3000;
try {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function (position) {
            success(position);
        }, showError);
    } else {
        showError("NOT-SUPPORTED");
    }
    var t = setTimeout(function () {
        if ($("#getZip div.loading").css("display") != "none") {
            $("#getZip div.loading").hide();
            $("#errorZip").show();
        }
    }, waitTime);
} catch (evt) {
    alert(evt);
}
 

13voto

GFoley83 Points 1423

Comme alexleonard souligné, la seule fiable, cross-browser solution que j'ai trouvé pour cela est d'avoir un setTimeout() de vérifier l'état de votre latLng de l'objet/variables, comme l' timeout option de getCurrentPosition() ne semble pas fonctionner de manière fiable. L'exemple ci-dessous a été testée dans IE11, Chrome33 et Firefox28.

Pour une solution plus complète qui utilise jQuery promesse, consultez mon Résumé ici: https://gist.github.com/GFoley83/10092929

Exemple - tapez F12-coller dans la console pour tester:

var latLng,
    geoOptions = {
        enableHighAccuracy: false,
        timeout: 5000, // Wait 5 seconds
        maximumAge: 300000 //  Valid for 5 minutes
    };

var userLocationFound = function(position){
    latLng = {
        lat: position.coords.latitude,
        lng: position.coords.longitude
    };
    window.console.log("User confirmed! Location found: " + latLng.lat + ", " + latLng .lng);
}

var userLocationNotFound = function(){
    latLng = {
        lat: -41.29247, // fallback lat 
        lng: 174.7732  // fallback lng
    };
    window.console.log("Fallback set: ", latLng);
}

window.navigator.geolocation.getCurrentPosition(userLocationFound, userLocationNotFound, geoOptions);

setTimeout(function () {
    if(!latLng){
        window.console.log("No confirmation from user, using fallback");
        userLocationNotFound();
    }else{
        window.console.log("Location was set");
    }
}, geoOptions.timeout + 1000); // Wait extra second

4voto

Chris Points 61

Ce n'est que par la conception et, apparemment, est un non-problème. Voir https://bugzilla.mozilla.org/show_bug.cgi?id=675533

Il est laissé aux développeurs d'utiliser la fonctionnalité à venir avec un navigateur spécifique à contourner pour Firefox.

De note, basée sur l'observation de la FF développeur sur la géolocalisation d'utilisation par les utilisateurs finaux, apparemment, les développeurs de Firefox sont la collecte de données détaillées sur ce que les utilisateurs finaux sont en train de faire avec leurs produits.

4voto

alexleonard Points 356

Note que c'est en fait aussi un problème dans Chrome.

Dans google Chrome, un avis d'information s'affiche "site veut savoir votre position" - il propose ensuite "Autoriser" et "Refuser" options". Avec la conception de l'INTERFACE utilisateur, l'utilisateur est plus susceptibles de choisir d'Autoriser ou de Refuser, qui sera de retour une réponse au navigateur.la géolocalisation.getCurrentPosition fonction. Toutefois, l'utilisateur peut également cliquer sur un bouton "X" à l'extrême droite de l'avis. C'est essentiellement le même que de cliquer sur "Pas maintenant" dans Firefox.

Aucun résultat n'est retourné à la fonction.

Ressemble à une minuterie doit être mis en œuvre pour permettre ce résultat possible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X