Ich habe also ein ziemlich einfaches Stück JS mit dem Jammy navigator.geolocation.getCurrentPosition.
$(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
Grundsätzlich erhalten wir hier die aktuelle Position. Wenn sie erhalten wird, werden zwei "Wasserzeichen" in zwei Feldern platziert, die "Aktuelle Position" anzeigen, und zwei ausgeblendete Felder werden mit den lat-langen Daten als Wert erstellt (sie werden entfernt am Anfang, damit sie nicht jedes Mal dupliziert werden). Es gibt auch zwei Schaltflächen, an die eine Klickfunktion gebunden ist, die dasselbe tun. Leider funktioniert es jedes dritte Mal oder so. Was ist das Problem hier?
javascript
jquery
geolocation
das assoziierte Web
quelle
quelle
noLocation
Funktion aufgerufen? Wenn ja, können Sie ein Add -error
ParameternoLocation()
und dannerror.code
underror.message
Sie bei der Fehlersuche helfen können. Es kann uns auch helfen zu wissen, welchen Browser Sie verwenden und ob Sie dasselbe Problem in verschiedenen Browsern sehen.Antworten:
Ich hatte genau das gleiche Problem und fand online fast keine Informationen darüber. Gar nichts in den Büchern. Schließlich fand ich diese nüchterne Abfrage zu Stackoverflow und (ha!) Es war der letzte Anstoß, den ich brauchte, um hier ein Konto einzurichten.
Und ich habe eine teilweise Antwort, aber leider keine vollständige.
Stellen Sie zunächst fest , dass das Standardzeitlimit für getCurrentPosition unendlich (!) Ist . Das bedeutet, dass Ihr Fehlerbehandler niemals aufgerufen wird, wenn getCurrentPosition irgendwo im Backend hängt.
Um sicherzustellen, dass Sie eine Zeitüberschreitung erhalten, fügen Sie Ihrem Aufruf von getCurrentPosition den optionalen dritten Parameter hinzu. Wenn der Benutzer beispielsweise nicht länger als 10 Sekunden warten soll, bevor er einen Hinweis darauf erhält, was passiert, verwenden Sie Folgendes:
Zweitens habe ich in verschiedenen Kontexten ganz unterschiedliche Zuverlässigkeit erfahren. Hier zu Hause bekomme ich innerhalb von ein oder zwei Sekunden einen Rückruf, obwohl die Genauigkeit schlecht ist.
Bei der Arbeit treten jedoch ziemlich bizarre Verhaltensunterschiede auf: Geolocation funktioniert auf einigen Computern ständig (IE natürlich ausgenommen), andere funktionieren nur in Chrome und Safari, aber nicht in Firefox (Gecko-Problem?), Andere funktionieren einmal und anschließend scheitern - und das Muster ändert sich von Stunde zu Stunde, von Tag zu Tag. Manchmal haben Sie einen "glücklichen" Computer, manchmal nicht. Vielleicht würde es helfen, Ziegen bei Vollmond zu schlachten?
Ich war nicht in der Lage, dies zu ergründen, aber ich vermute, dass die Back-End-Infrastruktur ungleichmäßiger ist als in den verschiedenen Gung-Ho-Büchern und Websites angegeben, die diese Funktion vorantreiben. Ich wünschte wirklich, sie würden etwas klarer darüber sein, wie flockig diese Funktion ist und wie wichtig diese Timeout-Einstellung ist, wenn Sie möchten, dass Ihr Fehlerbehandler ordnungsgemäß funktioniert .
Ich habe heute versucht, den Schülern dieses Zeug beizubringen, und hatte die peinliche Situation, dass mein eigener Computer (auf dem Projektor und mehreren großen Bildschirmen) lautlos ausfiel, während etwa 80% der Schüler fast sofort ein Ergebnis erzielten (mit dem genau das gleiche drahtlose Netzwerk). Es ist sehr schwierig, diese Probleme zu lösen, wenn meine Schüler auch Tippfehler und andere Fehler machen und wenn mein eigener PC ebenfalls ausfällt.
Wie auch immer, ich hoffe das hilft einigen von euch. Vielen Dank für die Überprüfung der Gesundheit!
quelle
timeout
OptiongetCurrentPosition()
tatsächlich das Timing ist. Der Benutzer muss die Geolokalisierungsanforderung nicht zulassen oder ablehnen, sondern wie lange es dauern darf, bis das Netzwerk einen Standort zurückgibt, sobald die Berechtigung erteilt wurde. Wenn der Benutzer die Geolokalisierungsanforderung nicht beantwortet, wird der Fehlerbehandler niemals aufgerufen. Daher benötigen Sie eine zweite Zeitüberschreitung wie in @ xiaohouzi79 Antwort.Dies ist die hackige Art und Weise, wie ich das umgehen kann, zumindest funktioniert es in allen aktuellen Browsern (unter Windows besitze ich keinen Mac):
Dies funktioniert auch, wenn jemand auf das Schließen klickt oder Nein oder die Option Nie teilen in Firefox wählt.
Klobig, aber es funktioniert.
quelle
geolocFail();
Fehlerbehandler und dengetcodeLatLng();
Geocodierer.Das funktioniert bei mir jedes Mal:
Obwohl es nicht sehr genau ist. Das Lustige ist, dass ich auf demselben Gerät (jedes Mal) ungefähr 100 Meter davon entfernt bin, aber wenn ich zu Googles Karten gehe, findet es genau meinen Standort. Obwohl ich denke, dass enableHighAccuracy: true dazu beiträgt, dass es konsistent funktioniert, scheint es nicht genauer zu sein ...
quelle
Dies ist bereits eine alte Frage, aber alle Antworten haben mein Problem nicht gelöst. Fügen wir also die hinzu, die ich endlich gefunden habe. Es riecht nach einem Hack (und es ist einer), funktioniert aber immer in meiner Situation. Hoffe auch auf deine Situation.
quelle
Genau wie hier, funktioniert dies perfekt in Chrome (stabil, dev und canary), nur nicht in FF und Safari. Es funktioniert auch perfekt auf meinem iPhone und iPad (Safari!). Dies kann an der relativen Neuheit dieser Funktion liegen (dh es handelt sich um einen Fehler). Ich verbringe jetzt fast eine Woche damit und kann es in diesen Browsern einfach nicht zum Laufen bringen
Folgendes habe ich gefunden:
Wenn Sie getCurrentPosition zum ersten Mal aufrufen, funktioniert es perfekt. Ein nachfolgender Aufruf wird niemals zurückgegeben, dh er löst nicht die Funktionen successCallback oder errorCallback aus. Ich habe meinem Anruf einige Positionsoptionen hinzugefügt, um meinen Standpunkt zu beweisen:
und es tritt jedes Mal eine Zeitüberschreitung auf (nach dem ersten erfolgreichen Anruf). Ich dachte, ich könnte es mit MaximumAge beheben, aber das scheint nicht zu funktionieren, da es vermutlich auch funktioniert:
Dies sollte verhindern, dass die Funktion getCurrentPosition tatsächlich aufgerufen wird, wenn Sie sie innerhalb von 60 Sekunden aufrufen. Dies wird jedoch ignoriert (dies kann jedoch daran liegen, dass ich meine Seite tatsächlich aktualisiere, um den zweiten Aufruf auszulösen, und nicht sicher bin, ob dies bei Aufrufen dauerhaft ist.)
Übrigens scheitern sogar Googles Beispiele in diesen Browsern, was mich glauben lässt, dass dies tatsächlich Browserfehler sind. Probieren Sie es aus, laden Sie es zweimal in Safari und es wird beim zweiten Mal nicht funktionieren.
Wenn jemand eine Lösung dafür findet, lass es mich bitte wissen :-)
Prost.
quelle
Sie erhalten keine Fehlermeldung, da standardmäßig keine Zeitüberschreitung vorliegt (zumindest glaube ich). Ich hatte das gleiche Problem mit Firefox nur für mich Firefox gibt immer eine Auszeit. Sie können selbst eine Zeitüberschreitung festlegen.
Meine Funktion funktioniert gut in Chrom, aber ich bekomme jedes Mal eine Auszeit in Firefox.
Ich empfehle, Ihre Fehler sorgfältig zu beobachten. Für alles zu erwarten sein. Haben Sie einen Backup-Plan für alles. Ich verwende selbst einige Standardwerte oder Werte aus meiner Datenbank, falls sowohl Google Geolocations als auch Navigator Geolocations fehlschlagen.
quelle
Ich erhalte 2017 immer noch fleckige Ergebnisse, und ich habe eine Theorie: Die API-Dokumentation besagt, dass der Aufruf jetzt nur "in einem sicheren Kontext" verfügbar ist, dh über HTTPS. Ich habe Probleme, ein Ergebnis in meiner Entwicklungsumgebung zu erhalten (http on localhost), und ich glaube, dies ist der Grund.
quelle
Ich werde dies hier posten, falls es für jemanden nützlich ist ...
Unter iOS Safari
navigator.geolocation.getCurrentPosition
würden Aufrufe eine Zeitüberschreitung verursachen, wenn eine aktivenavigator.geolocation.watchPosition
Funktion ausgeführt würde.Das Starten und Stoppen der
watchPosition
ordnungsgemäßen VerwendungclearWatch()
wie hier beschrieben hat funktioniert: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPositionquelle
Hier ist meine Lösung dank einer Schließung:
quelle
navigator && navigator.geolocation
Also bin ich auf dasselbe gestoßen. Ich habe die Timeout-Lösung ausprobiert, die funktioniert hat, aber nicht zuverlässig. Ich habe festgestellt, dass der Standort ordnungsgemäß aktualisiert wird, wenn Sie ihn nur zweimal aufrufen
das ist natürlich etwas langsamer, aber ich habe es mir nicht einmal die falsche Position geben lassen. Ich habe es ein paar Mal auf die Zeitüberschreitung gebracht und nichts anderes zurückgegeben, als dass es großartig funktioniert. Ich weiß, dass dies immer noch ein bisschen hackig ist und ich freue mich darauf, dass jemand die richtige Lösung findet.
Oder wenn Sie sicherstellen möchten, dass es so lange versucht, bis Sie aufgeben möchten, können Sie so etwas versuchen.
Ich habe hier wahrscheinlich einige Tippfehler und Rechtschreibfehler, aber ich hoffe, Sie haben die Idee. Lassen Sie mich wissen, wenn jemand Fragen hat oder wenn jemand etwas Besseres findet.
quelle
Für alle, die an einer iPhone App arbeiten ...
Wenn Ihr Code in einer UIWebView unter iOS 9+ ausgeführt wird, müssen Sie festlegen
NSLocationWhenInUseUsageDescription
Ihrer App festlegen.Wenn Sie es nicht einstellen,
getCurrentPosition
wird es niemals zurückrufen und der Benutzer wird niemals dazu aufgefordert.quelle
Ich habe festgestellt, dass dieser Weg nicht funktioniert
Aber
Dieser Weg funktioniert perfekt
quelle
Die Antwort von @ brennanyoung ist großartig, aber wenn Sie sich fragen, was Sie im Fehlerfall tun sollen, können Sie eine IP-Geolocation-API wie https://ipinfo.io (das ist mein Service) verwenden. Hier ist ein Beispiel:
Weitere Informationen finden Sie unter https://ipinfo.io/developers/replacing-getcurrentposition .
quelle
Ich hatte ähnliche Probleme und habe die Möglichkeit untersucht, dass Browser die Häufigkeit des Aufrufs von getCurrentPosition einschränken. Es scheint, dass ich oft einen Ort finden kann, aber wenn ich die Seite sofort aktualisiere, tritt eine Zeitüberschreitung auf. Wenn ich etwas warte, kann ich normalerweise wieder einen Standort finden. Dies geschieht normalerweise mit FF. In Chrome und Safari habe ich das Zeitlimit für getCurrentPosition noch nicht bemerkt. Nur ein Gedanke...
Obwohl ich keine Dokumentation finden kann, die dies unterstützt, war es eine Schlussfolgerung, zu der ich nach vielen Tests gekommen bin. Vielleicht hat jemand anderes Informationen dazu?
quelle
Ich habe endlich eine funktionierende Version für Firefox, Chrome & Standard Navigator in Android gefunden (nur 4.2 getestet):
quelle
Der zweite Parameter, an den übergeben wird,
Geolocation.getCurrentPosition()
ist die Funktion, mit der Sie Geolokalisierungsfehler behandeln möchten. Die Fehlerbehandlungsfunktion selbst empfängt einPositionError
Objekt mit Details darüber, warum der Geolokalisierungsversuch fehlgeschlagen ist. Ich empfehle, den Fehler an die Konsole auszugeben, wenn Sie Probleme haben:Wenn Sie dies in meinem Code tun, wird die Meldung "Netzwerkstandortanbieter unter ' https://www.googleapis.com/ ': Zurückgegebener Fehlercode 400" angezeigt. Es stellt sich heraus, dass Google Chrome die Google-APIs verwendet, um einen Standort auf Geräten zu ermitteln, auf denen kein GPS integriert ist (z. B. auf den meisten Desktop-Computern). Google gibt einen ungefähren Breiten- / Längengrad basierend auf der IP-Adresse des Nutzers zurück. In Entwickler-Builds von Chrome (wie Chromium unter Ubuntu) ist jedoch kein API-Zugriffsschlüssel im Browser-Build enthalten. Dies führt dazu, dass die API-Anforderung unbeaufsichtigt fehlschlägt. Weitere Informationen finden Sie in Chromium Issue 179686: Geolocation mit 403-Fehler .
quelle
Ich habe dieses Problem in Mozilla. Alle Zeit: Fehler: Unbekannter Fehler beim Erfassen der Position .
Jetzt benutze ich 47 Mozilla. Ich habe alles versucht, aber immer dieses Problem. ABER dann öffne ich about: config in meiner Addsress-Leiste, gehe zu geo.wifi.ui und ändere den Wert in " https://location.services.mozilla.com/v1/geolocate?key=test ". funktioniert!
Wenn Sie einen Zeitüberschreitungsfehler bei der Positionserfassung haben , versuchen Sie, den Zeitlimitwert zu erhöhen:
quelle
Es ist möglicherweise eine gute Idee, einen Geolokalisierungsdienst für IP-Adressen als Fallback-Methode zu verwenden, wenn dies
getCurrentPosition
fehlschlägt. Zum Beispiel mit unserer API https://ip-api.ioquelle
In unserem Fall funktioniert es immer beim ersten Mal, aber wenn die Funktion mehr als 3-4 Mal ausgeführt wird, schlägt dies fehl.
Einfache Problemumgehung: Speichern Sie den Wert in LocalStorage.
Vor:
Nach dem:
quelle
Ich habe dieses Problem kürzlich selbst bemerkt und bin mir nicht sicher, wie es zustande kommt, aber es scheint, dass Firefox manchmal an etwas hängen bleibt, das in den Cache geladen ist. Nach dem Löschen des Caches und dem Neustart von Firefox scheint es wieder zu funktionieren.
quelle
Diese Bibliothek fügt Geolokalisierungsaufrufen eine gewünschte Genauigkeits- und maxWait-Option hinzu. Dies bedeutet, dass weiterhin versucht wird, eine Position zu ermitteln, bis die Genauigkeit innerhalb eines bestimmten Bereichs liegt.
quelle
Vielen Dank an alle für ihre Beiträge, das hat mir geholfen.
Ich musste nicht nur watchPosition () anstelle von getCurrentPosition () verwenden, sondern musste auch den Aufruf aus document.ready () in den Kopf verschieben.
quelle
Dies ist mir passiert, als ich den Responsive Design-Modus von Firefox verwendet habe. Es wurde ein Fehlerbericht eingereicht. Verwenden Sie vorerst nicht den Responsive Design-Modus, während Sie die Geolocation-API verwenden.
quelle
Vielleicht hilft es jemandem. Auf Android hatte ich das gleiche Problem, aber ich habe es durch die Verwendung von "
setTimeout
Inside" herausgefunden,document.ready
sodass es für mich funktioniert. Zweitens müssen Sie das Timeout erhöhen, nur für den Fall, dass der Benutzer seinen Standort nach einigen Sekunden zulässt, also habe ich ihn auf 60000 gehalten mili Sekunden (1 Minute), damit meine Erfolgsfunktion aufgerufen werden kann, wenn der Benutzer innerhalb von 1 Minute auf die Schaltfläche "Zulassen" klickt.quelle