233 votes

navigator.la géolocalisation.getCurrentPosition fonctionne parfois parfois ne pas

J'ai donc une assez simple, peu de JS en utilisant le navigateur.la géolocalisation.getCurrentPosition jammy.

$(document).ready(function(){
  $("#business-locate, #people-locate").click(function() {
    navigator.geolocation.getCurrentPosition(foundLocation, noLocation);
  });

  navigator.geolocation.getCurrentPosition(foundLocation, noLocation);

  function foundLocation(position) {
    var lat = position.coords.latitude;
    var lon = position.coords.longitude;
    var userLocation = lat + ', ' + lon;
    $("#business-current-location, #people-current-location").remove();
    $("#Near-Me")
      .watermark("Current Location")
      .after("<input type='hidden' name='business-current-location' id='business-current-location' value='"+userLocation+"' />");
    $("#people-Near-Me")
      .watermark("Current Location")
      .after("<input type='hidden' name='people-current-location' id='people-current-location' value='"+userLocation+"' />");
  }
  function noLocation() {
    $("#Near-Me").watermark("Could not find location");
    $("#people-Near-Me").watermark("Could not find location");
  }
})//end DocReady

Fondamentalement, ce qui se passe ici est que nous obtenons la position actuelle, si elle est obtenue, les deux "filigranes" sont placés dans deux domaines qui disent "Position Actuelle" et de deux champs cachés sont créés avec la lat-long les données que leur valeur (ils sont supprimés au début pour ne pas se dupliqué à chaque fois). Il y a aussi deux boutons qui ont une fonction de clic lié à eux qui font la même chose. Malheureusement, à chaque tiers temps, il fonctionne. Quel est le problème ici???

368voto

brennanyoung Points 1846

J'ai eu exactement le même problème, et trouver presque pas d'information en ligne à ce sujet. Rien du tout dans les livres. Finalement, j'ai trouvé cette sobre requête sur stackoverflow et (ha!) il a été l'impulsion finale j'avais besoin de créer un compte ici.

Et j'ai une réponse partielle, mais hélas pas une complète.

Tout d'abord, de réaliser que le délai d'attente par défaut pour getCurrentPosition est infini(!). Cela signifie que votre gestionnaire d'erreur sera jamais être appelé si getCurrentPosition se bloque quelque part sur l'extrémité arrière.

Pour vous assurer d'obtenir un délai, ajouter le troisième paramètre facultatif à votre appel à getCurrentPosition, par exemple, si vous souhaitez que l'utilisateur n'attendez plus de 10 secondes avant de leur donner une idée de ce qui se passe, utilisez:

navigator.geolocation.getCurrentPosition(successCallback,errorCallback,{timeout:10000});

Deuxièmement, j'ai vécu tout à fait différente de la fiabilité dans des contextes différents. Ici à la maison, je reçois un rappel à l'intérieur d'une seconde ou deux, même si la précision n'est pas bonne.

Au travail, cependant, j'ai une expérience assez bizarre les variations de comportement: la Géolocalisation fonctionne sur certains ordinateurs tout le temps (c'est à dire à l'exception, bien sûr), d'autres ne fonctionnent que dans chrome et safari mais pas firefox (gecko question?), d'autres travaillent à la fois, puis par la suite de l'échec et le motif des changements d'heure en heure, de jour en jour. Parfois, vous avez une "chance" de l'ordinateur, parfois pas. Peut-être l'abattage des chèvres à la pleine lune serait-elle aider?

Je n'ai pas réussi à comprendre cela, mais je pense que la fin de l'infrastructure est encore plus inégale que annoncé dans les différents gung-ho livres et les sites web qui sont en train de pousser cette fonctionnalité. Je souhaite vraiment qu'ils seraient un peu plus claires sur la façon dont flakey cette fonctionnalité est, et de l'importance de ce paramètre de délai d'expiration est, si vous voulez que votre gestionnaire d'erreur pour fonctionner correctement.

J'ai essayé d'enseigner ce genre de choses pour les étudiants d'aujourd'hui, et avait la situation embarrassante où mon propre ordinateur (sur le projecteur et plusieurs grands écrans) n'était pas en silence, tandis qu'environ 80% des étudiants ont été l'obtention d'un résultat presque instantanément (en utilisant exactement le même réseau sans fil). Il est très difficile de résoudre ces problèmes lors de mes élèves font aussi des fautes de frappe et autres gaffes, et quand mon pc est également défaut.

De toute façon, j'espère que cela aide certains d'entre vous les gars. Merci pour le test de cohérence!

71voto

xiaohouzi79 Points 3165

C'est le hacky façon que je suis moyen de contourner cela, au moins, il fonctionne dans tous les navigateurs actuels (sur Windows, je n'ai pas de Mac):

if (navigator.geolocation) {
    var location_timeout = setTimeout("geolocFail()", 10000);

    navigator.geolocation.getCurrentPosition(function(position) {
        clearTimeout(location_timeout);

        var lat = position.coords.latitude;
        var lng = position.coords.longitude;

        geocodeLatLng(lat, lng);
    }, function(error) {
        clearTimeout(location_timeout);
        geolocFail();
    });
} else {
    // Fallback for no geolocation
    geolocFail();
}

Cela fonctionne aussi si quelqu'un clique sur fermer ou choisit pas ou choisit de ne Jamais l'option de Partage sur Firefox.

Maladroit, mais ça fonctionne.

43voto

K'shin Points 286

Cela fonctionne pour moi à chaque fois:

navigator.geolocation.getCurrentPosition(getCoor, errorCoor, {maximumAge:60000, timeout:5000, enableHighAccuracy:true});

Si elle n'est pas très précis. Le plus drôle, c'est que sur le même appareil, si je l'exécute il me met hors tension environ 100 mètres (à chaque fois), mais si je vais à google maps, il trouve mon endroit exactement. Donc, bien que je pense de la enableHighAccuracy: true permet de travailler de manière cohérente, il ne semble pas pour le rendre plus précis...

14voto

mvilrokx Points 476

Même ici, les gens, cela fonctionne parfaitement btw en Chrome (stable, dev et canary) tout simplement pas dans FF et Safari. Il fonctionne aussi parfaitement sur mon iPad et iPhone (Safari!). Cela peut être dû à la relative nouveauté de cette fonction (c'est à dire c'est un bug). J'ai passer presque une semaine maintenant et je n'arrive pas à le faire fonctionner sur les navigateurs

Voici ce que j'ai trouvé:

La première fois que vous appelez getCurrentPosition il fonctionne parfaitement. Tout appel ultérieur ne retourne jamais, c'est à dire qu'il ne déclenche pas l'successCallback ou la errorCallback fonctions. J'ai ajouté quelques options de position à mon appel pour démontrer mon point de vue:

 navigator.geolocation.getCurrentPosition(successCallback, errorCallback,  {timeout: 10000});

et cela fois tous les temps (après le succès du premier appel). Je pensais que je pouvais fixer avec maximumAge, mais ça ne semble pas fonctionner comme il est suppose de travailler soit:

navigator.geolocation.getCurrentPosition(successCallback, errorCallback,  {maximumAge:60000, timeout: 2000});

cela devrait empêcher effectivement l'appel de la getCurrentPosition fonction si vous l'appelez, dans un délai de 60 secondes, mais il ignore ce (cependant, cela pourrait être dû parce que j'ai fait actualiser ma page pour déclencher l'appel de la deuxième, vous ne savez pas si c'est persistant à travers des appels)

btw, même google exemples échouer sur ces navigateurs qui m'amène à croire que ce sont en effet des bogues de navigateur, l'essayer, de le charger deux fois dans Safari et il ne fonctionne pas la deuxième fois.

Si quelqu'un trouve une solution pour ce faire, s'il vous PLAÎT laissez-moi savoir :-)

Des acclamations.

11voto

Mark Points 3549

Vous ne recevez pas un message d'erreur car il n'a pas de délai d'attente par défaut (du moins je pense). J'ai eu le même problème avec firefox uniquement pour moi firefox donne toujours un délai d'attente. Vous pouvez définir un délai d'attente-vous comme ça.

J'ai mis de l'âge maximum à l'Infini pour vous assurer que c'est pas le problème. Ma fonction fonctionne très bien sur chrome mais j'ai un délai d'attente à chaque fois dans firefox.

    navigator.geolocation.getCurrentPosition(
        function(position) {
            //do succes handling
        },
        function errorCallback(error) {
            //do error handling
        },
        {
            maximumAge:Infinity,
            timeout:5000
        }
    );

Je vous recommande de regarder vos erreurs soigneusement. Être prévu pour tout. Avoir un plan de sauvegarde pour tout. J'utilise des valeurs par défaut ou les valeurs de ma base de données moi-même dans le cas où les deux google géolocalisations et navigator géolocalisations échoue.

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