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, 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 ou alors, il fonctionne.
Quel est le problème ici???
- Peut-être définir les fonctions avant de les utiliser.
- qui ne devrait pas d'importance, car le JS analyseur recherche ces déclarations avant le code commence l'exécution d'
- Est-il possible que l'utilisation de jQuery dans il est à l'origine des problèmes?
- Que voulez-vous dire lorsque vous dites qu'il ne fonctionne pas parfois? Est le
noLocation
fonction appelée? Si oui, vous pouvez ajouter unerror
paramètrenoLocation()
et puiserror.code
eterror.message
peut vous aider au débogage. Il pourrait également nous aider à savoir quel navigateur vous utilisez et si vous voyez le même problème dans les différents navigateurs. - Je veux dire que, parfois, il me donne la lat-lon, et parfois ça ne marche pas. quand ça ne fonctionne pas, il n'a même pas jeter le "ne pouvait pas trouver un emplacement" message de sorte que le noLocation peu n'est-ce pas de tir soit.
- Donc je suppose que personne ne sait.....
- liés à la question stackoverflow.com/q/5947637/194609
- Vous n'êtes pas définir toutes les options. Essayez geolocator.js - github.com/onury/geolocator
Vous devez vous connecter pour publier un commentaire.
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 la délai d'expiration 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:
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 aiderait?
Je n'ai pas réussi à comprendre cela, mais je soupçonne 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!
enableHighAccuracy:false
et l'ensemble du processus peut être beaucoup plus rapide. Paramètre à false a à peine touché quoi que ce soit - il est encore assez précis. Je ne suis pas montrant un marqueur sur la carte lorsque la position est trouvée, je veux juste la carte de la vue dans la zone de droite pour commencer.timeout
option dansgetCurrentPosition()
est en fait le timing. Il n'a pas le temps à l'utilisateur d'autoriser ou de refuser la demande de géolocalisation, mais combien de temps le réseau est autorisé à prendre pour rentrer à la un emplacement, une fois l'autorisation accordée. Si l'utilisateur ne répond pas à la demande de géolocalisation, le gestionnaire d'erreur ne sera jamais appelé. Ainsi, vous avez besoin d'un deuxième délai d'attente comme dans @xiaohouzi79 réponse.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):
Cela fonctionnera également si quelqu'un clique sur fermer ou choisit pas ou choisit de ne Jamais l'option de Partage sur Firefox.
Maladroit, mais ça fonctionne.
geolocFail();
gestionnaire d'erreur et legetcodeLatLng();
geo codeur.Cela fonctionne pour moi à chaque fois:
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...
C'est déjà une vieille question, mais toutes les réponses ne résout pas mon problème, nous allons donc ajouter celui que j'ai enfin trouvé. Il sent comme un hack (et c'en est un), mais qui fonctionne toujours dans ma situation. L'espoir dans votre situation.
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:
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:
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 des 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 🙂
Acclamations.
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.
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.
Je suis encore en train inégale résultats en 2017, et j'ai une théorie: la documentation de l'API dit que l'appel est maintenant disponible uniquement "dans un cadre sécurisé", c'est à dire sur HTTPS. Je vais avoir du mal à obtenir un résultat dans mon environnement de développement (http sur localhost) et je crois que c'est pourquoi.
voici ma solution grâce à une fermeture :
navigator && navigator.geolocation
J'ai donc été en cours d'exécution dans la même chose. J'ai essayé le délai d'expiration de la solution qui a fonctionné, mais pas de manière fiable. J'ai trouvé que si tu viens de l'appeler deux fois l'emplacement est actualisé correctement
bien sûr, cela est un peu plus lent, mais je n'ai pas eu à me donner la mauvaise position une fois. J'ai eu il a frappé le délai d'attente un peu de temps et de ne pas revenir, mais rien d'autre alors qu'il fonctionne très bien. Je sais que c'est encore un peu hacky et je suis impatient de quelqu'un à trouver la solution réelle.
Ou si vous voulez vous assurer qu'il va continuer à essayer jusqu'à ce que vous souhaitez donner vous pouvez essayer quelque chose comme cela.
J'ai probablement quelques typeos et quelques fautes d'orthographe ici, mais j'espère que vous obtenez l'idée. Laissez-moi savoir si quelqu'un a des questions ou si quelqu'un trouve quelque chose de mieux.
Pour toute personne qui travaille sur une application iPhone...
Si votre code est en cours d'exécution dans une UIWebView sur iOS 9+, vous devez définir
NSLocationWhenInUseUsageDescription
au sein de votre application plist.Si vous ne définissez pas de il alors
getCurrentPosition
ne sera jamais de retour d'appel et l'utilisateur ne sera jamais invité.Je vais poster cela ici dans le cas où c'est utile à quelqu'un...
Sur iOS Safari, les appels à
navigator.geolocation.getCurrentPosition
serait délai d'attente si j'avais un actifnavigator.geolocation.watchPosition
de la fonction en cours d'exécution.Démarrage et l'arrêt de la
watchPosition
correctement à l'aide declearWatch()
comme décrit ici, a travaillé: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPositionJ'ai eu des problèmes similaires, et ont été à la recherche à la possibilité que les navigateurs ont des limites sur la façon dont souvent getCurrentPosition peut être appelé. Il semble que je pouvez souvent obtenir un emplacement, mais si j'actualise la page tout de suite il va expirer. Si j'attends un peu, je peux habituellement obtenir un emplacement à nouveau. Cela se produit généralement avec les FF. Dans Chrome et Safari, je n'ai pas encore remarqué getCurrentPosition l'expiration du délai. Juste une pensée...
Bien que je ne trouve aucune documentation à l'appui, que c'était une conclusion je suis arrivé après beaucoup d'essais. Peut-être quelqu'un d'autre a des infos à ce sujet?
J'ai enfin trouvé une version de travail pour firefox, google chrome & navigateur par défaut d'android (4.2 testé uniquement):
@brennanyoung la réponse est grande, mais si vous vous demandez quoi faire en cas d'échec, vous pouvez utiliser un IP de l'API de géolocalisation tels que https://ipinfo.io (ce qui est mon service). Voici un exemple:
Voir http://ipinfo.io/developers/replacing-navigator-geolocation-getcurrentposition pour plus de détails.
Le deuxième paramètre passé à
à la Géolocalisation.getCurrentPosition()
est la fonction que vous souhaitez gérer toute la géolocalisation des erreurs. Le gestionnaire d'erreur de la fonction elle-même reçoit unePositionError
objet avec des détails sur le pourquoi de la géolocalisation tentative a échoué. Je recommande pour la sortie d'erreur de la console si vous avez des questions:Faire cela dans mon code a révélé le message "emplacement du Réseau du fournisseur de 'https://www.googleapis.com/' : code d'erreur Retourné 400". S'avère Google Chrome utilise l'Api Google pour obtenir un emplacement sur les appareils qui n'ont pas de GPS intégré (par exemple, la plupart des ordinateurs de bureau). Google retourne une approximation de la latitude/longitude basé sur l'adresse IP de l'utilisateur. Cependant, dans les versions en développement de Chrome (comme le Chrome sur Ubuntu) il n'y a pas d'API clé d'accès inclus dans le navigateur de construire. Cela provoque la demande d'API échouer en silence. Voir Chrome Question 179686: Géolocalisation donnant erreur 403 pour plus de détails.
J'ai trouvé que ce moyen ne fonctionne pas
Mais
de cette façon fonctionne parfaitement
J'ai ce problème dans Mozilla. Tous les temps: d'Erreur: erreur Inconnue acquisition de la position.
Maintenant, je suis en utilisant 47 Mozilla. J'ai tout essayé, mais tout le temps ce problème. MAIS puis-je ouvrir about:config dans mon addsress bar, aller geo.wifi.l'interface utilisateur et changé la valeur "https://location.services.mozilla.com/v1/geolocate?key=test". des travaux!
Si u ont l'acquisition d'une Position expiré erreur, essayez d'augmenter la valeur de délai d'expiration:
Il pourrait être une bonne idée pour utiliser une adresse IP geo service de localisation comme un secours méthode lorsque
getCurrentPosition
échoue. Par exemple avec notre api https://ip-api.ioDans notre cas, il fonctionne toujours de la première fois, mais la reprise de la fonction de plus de 3-4 fois, il échoue.
Solution Simple: Stocker la valeur dans LocalStorage.
Avant:
Après:
J'ai remarqué ce problème récemment moi-même, et je ne suis pas sûr de savoir comment il vient à propos, mais il semble parfois firefox est coincé sur quelque chose chargées dans le cache. Après le nettoyage du cache et le redémarrage de firefox, il semble fonctionner de nouveau.
Cette bibliothèque ajoute un desiredAccuracy et maxWait option de géolocalisation des appels, ce qui signifie qu'il va continuer d'essayer d'obtenir une position jusqu'à ce que la précision est à l'intérieur de la plage spécifiée.
Merci à tous pour leurs commentaires, cela m'a aidé.
En plus d'avoir à utiliser watchPosition() au lieu de getCurrentPosition(), j'ai aussi trouvé que j'avais besoin de se déplacer à l'appel à partir du document.prêt() à la tête.