navigator.geolocation.getCurrentPosition funktioniert manchmal manchmal nicht

220

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?

das assoziierte Web
quelle
Definieren Sie möglicherweise die Funktionen, bevor Sie sie verwenden.
Tcooc
4
@digitalFresh, das sollte keine Rolle spielen, da der JS-Parser nach diesen Deklarationen sucht, bevor der Code ausgeführt wird
antimatter15
Ist es möglich, dass die Verwendung von jQuery dort Probleme verursacht?
assoziierte Web
1
Was genau meinst du, wenn du sagst, dass es manchmal nicht funktioniert? Wird die noLocationFunktion aufgerufen? Wenn ja, können Sie ein Add - errorParameter noLocation()und dann error.codeund error.messageSie 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.
Npdoty
Ich meine, manchmal gibt es mir den Lat-Lon und manchmal nicht. Wenn es nicht funktioniert, wird nicht einmal die Meldung "Standort konnte nicht gefunden werden" ausgegeben, sodass das noLocation-Bit auch nicht ausgelöst wird.
assoziierte Web

Antworten:

342

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:

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

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!

brennanyoung
quelle
5
Gute Detailinfo, danke! Ich sehe die gleichen Probleme, aber nur unter Firefox 3.6.13. Chrome scheint ziemlich zuverlässig zu sein.
Felipe Lima
Dies gilt auch hier, und der Parameter maximumAge scheint ebenfalls unzuverlässig zu sein. Danke für den Beitrag.
Richard
1
Schön, ich hatte das gleiche Problem (auf einem Samsung Galaxy Tab 10.1 mit Android 4.0.3 ). Nachdem ich den obigen Timeout-Parameter verwendet hatte, konnte ich das Problem beheben.
mlo55
9
Es ist wichtig zu verstehen, welche timeoutOption getCurrentPosition()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.
François
2
Ziegen bei Vollmond zu schlachten würde helfen? LOL
Asim KT
66

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):

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();
}

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.

gehen
quelle
1
+1 Sie vermissen jedoch den geolocFail();Fehlerbehandler und den getcodeLatLng();Geocodierer.
Kaiser
Süß - der Timer funktioniert wunderbar, wenn jemand einen Ort nicht teilt. Einige Browser spielen nicht gut, wenn Benutzer dies tun. Diese Timer-Problemumgehung hat auf meinem Store Locator Plus WP-Plugin hervorragend funktioniert!
Lance Cleveland
2
@sajith - Nicht sicher, ob diese Lösung jetzt mit den neuesten FF-Browsern veraltet ist. Es funktionierte zu dem Zeitpunkt, als ich die Lösung bereitstellte, weil ich sie für eine Site benötigte, an der ich arbeitete. Hast du getestet?
gehen
Entschuldigung, es hat funktioniert. Aber ich kann nicht finden, was es funktioniert. Nach dem Schließen und erneuten Öffnen des FF funktioniert es. Danke für Ihre Lösung.
Sajith
1
Sie sollten keine Funktion innerhalb der Zeichenfolge verwenden. Das Böse Eval wirkt dort unangenehm. setTimeout ("geolocFail ()", 10000);
Atilkan
42

Das funktioniert bei mir jedes Mal:

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

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 ...

K'shin Gendron
quelle
Dies hat Firefox daran gehindert, die Anforderung abzulehnen und ein Timeout-Objekt zurückzusenden.
Tony
Die 100 Meter entfernt ist der Zellturm, an dem ich befestigt bin. Es wird also der Standort des Zellturms zurückgegeben, nicht mein Telefon.
Könnte
9
Es schreckt Sie immer wieder ein paar Meter ab, da Sie den MaximumAge-Parameter auf 60 Sekunden eingestellt haben. Sie platzieren Ihren Standort also dort, wo Sie vor 60 Sekunden waren. Stellen Sie MaximumAge auf 10 Sekunden oder weniger ein (MaximumAge: 10000) und versuchen Sie es erneut.
Robert Smith
Ich habe diese getCurrentPosition in einem Angular Resolver verwendet, der ein Observable zurückgibt. Der Resolver wurde nur zeitweise ausgeführt. Durch Hinzufügen dieser Optionen: {MaximumAge: 60000, Timeout: 5000, enableHighAccuracy: true} hat es jedes Mal funktioniert !!!
Moutono
17

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.

//Dummy one, which will result in a working next statement.
navigator.geolocation.getCurrentPosition(function () {}, function () {}, {});
//The working next statement.
navigator.geolocation.getCurrentPosition(function (position) {
    //Your code here
}, function (e) {
    //Your error handling here
}, {
    enableHighAccuracy: true
});
Niels Steenbeek
quelle
3
Das ist der hackigste aller Hacks, und ich habe keine Ahnung, wie Sie das überhaupt versucht haben, aber es löst mein Problem. Danke dir!
Brett Gregson
Ich habe das in einigen Fällen selbst benutzt. Der zweite Versuch funktioniert meiner Erfahrung nach immer besser
Nico Westerdale
13

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:

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

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:

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

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.

mvilrokx
quelle
Ich habe genau das Problem wie deins, es funktioniert für den ersten Anruf, aber nie für den nächsten. Wenn jemand eine Lösung findet, wäre ich sehr interessiert ... @ xiaohouzi79 Ihre Lösung endet jedes Mal (mit Ausnahme der ersten) in geolocFail ( )
Adriano Rizzo
8

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.

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

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.

Mark Baijens
quelle
7
Nur zu Ihrer Information, MaximumAge bezieht sich auf das Alter der Standortdaten im Cache. Wenn Sie es auf unendlich setzen, erhalten Sie garantiert eine zwischengespeicherte Version. Wenn Sie den Wert auf 0 setzen, wird das Gerät gezwungen, die Position abzurufen.
Porco
Downvoted, weil MaximumAge: Infinity Sie wie oben beschrieben vermasselt.
n13
7

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.

Codierer
quelle
Hmm, interessant. Selbst im Jahr 2020 ist es mit HTTPS auf localhost immer noch schuppig!
NitroStoutPlz
6

Ich werde dies hier posten, falls es für jemanden nützlich ist ...

Unter iOS Safari navigator.geolocation.getCurrentPositionwürden Aufrufe eine Zeitüberschreitung verursachen, wenn eine aktive navigator.geolocation.watchPositionFunktion ausgeführt würde.

Das Starten und Stoppen der watchPositionordnungsgemäßen Verwendung clearWatch() wie hier beschrieben hat funktioniert: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition

JoLoCo
quelle
1
Ich danke dir sehr. Das war die Lösung für mich.
Qin Zhengquan
5

Hier ist meine Lösung dank einer Schließung:

  function geoloc(success, fail){
    var is_echo = false;
    if(navigator && navigator.geolocation) {
      navigator.geolocation.getCurrentPosition(
        function(pos) {
          if (is_echo){ return; }
          is_echo = true;
          success(pos.coords.latitude,pos.coords.longitude);
        }, 
        function() {
          if (is_echo){ return; }
          is_echo = true;
          fail();
        }
      );
    } else {
      fail();
    }
  }

  function success(lat, lng){
    alert(lat + " , " + lng);
  }
  function fail(){
    alert("failed");
  }

  geoloc(success, fail);
jbdemonte
quelle
Dies funktionierte für mich in React-Native navigator && navigator.geolocation
Ashish Singh Rawat
5

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

function getLocation(callback)
{   
    if(navigator.geolocation)
    {
        navigator.geolocation.getCurrentPosition(function(position)
        {
            navigator.geolocation.getCurrentPosition(callback, function(){},{maximumAge:0, timeout:10000});
        },function(){}, {maximumAge:0, timeout:10000});
    }
    return true;
}

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.

//example
$(document).ready(function(){
    getLocation(function(position){
        //do something cool with position
        console.log(position);
    });
});


var GPSTimeout = 10; //init global var NOTE: I noticed that 10 gives me the quickest result but play around with this number to your own liking


//function to be called where you want the location with the callback(position)
function getLocation(callback)
{   
    if(navigator.geolocation)
    {
        var clickedTime = (new Date()).getTime(); //get the current time
        GPSTimeout = 10; //reset the timeout just in case you call it more then once
        ensurePosition(callback, clickedTime); //call recursive function to get position
    }
    return true;
}

//recursive position function
function ensurePosition(callback, timestamp)
{
    if(GPSTimeout < 6000)//set at what point you want to just give up
    {
        //call the geolocation function
        navigator.geolocation.getCurrentPosition(
            function(position) //on success
        {
                //if the timestamp that is returned minus the time that was set when called is greater then 0 the position is up to date
            if(position.timestamp - timestamp >= 0)
                {
                    GPSTimeout = 10; //reset timeout just in case
                    callback(position); //call the callback function you created
                }
                else //the gps that was returned is not current and needs to be refreshed
                {
                    GPSTimeout += GPSTimeout; //increase the timeout by itself n*2
                    ensurePosition(callback, timestamp); //call itself to refresh
                }
            },
            function() //error: gps failed so we will try again
            {
                GPSTimeout += GPSTimeout; //increase the timeout by itself n*2
                ensurePosition(callback, timestamp);//call itself to try again
            },
            {maximumAge:0, timeout:GPSTimeout}
        )
    }       
}

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.

Drew Calder
quelle
4

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, getCurrentPositionwird es niemals zurückrufen und der Benutzer wird niemals dazu aufgefordert.

Bendytree
quelle
3

Ich habe festgestellt, dass dieser Weg nicht funktioniert

navigator.geolocation.getCurrentPosition(function() {...}, function(err) {...}, {});

Aber

Dieser Weg funktioniert perfekt

function storeCoordinates(position) {
    console.log(position.coords.latitude, position.coords.longitude);
}    

function errorHandler() {...}

navigator.geolocation.getCurrentPosition(storeCoordinates, errorHandler, { enableHighAccuracy: true, timeout: 20000, maximumAge: 0 });
1nstinct
quelle
4
Was ist der Unterschied zwischen beiden?
Pardeep Jain
Anonyme Funktion gegen benannte
1nstinct
wirklich große Unterschiede. danke, das funktioniert auch nicht
ohne einen
3

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:

function do_something(coords) {
    // Do something with the coords here
    // eg. show the user on a map, or customize
    // the site contents somehow
}

navigator.geolocation.getCurrentPosition(function(position) { 
    do_something(position.coords);
    },
    function(failure) {
        $.getJSON('https://ipinfo.io/geo', function(response) { 
        var loc = response.loc.split(',');
        var coords = {
            latitude: loc[0],
            longitude: loc[1]
        };
        do_something(coords);
        });  
    };
});

Weitere Informationen finden Sie unter https://ipinfo.io/developers/replacing-getcurrentposition .

Ben Dowling
quelle
Hier ist der korrigierte Link dazu: ipinfo.io/developers/replacing-getcurrentposition
peater
5
Furchtbar. Die Genauigkeit ist in den USA und Kanada etwa 5 bis 7 Meilen von der tatsächlichen Position und in Russland 100 Meilen entfernt.
Ekashking
1
Für viele Anwendungen ist das in Ordnung - und viel besser, als keine Ahnung zu haben, wo sich der Standort befindet.
Ben Dowling
das funktioniert nirgendwo. Jede
Anfrage wird
Was meinst du mit falsch? Haben Sie einige Beispiele?
Ben Dowling
2

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?

Brauer
quelle
Das ist ein guter Punkt. Meine Zeitüberschreitungen / Fehler scheinen hauptsächlich beim Testen und wiederholten Abfragen von Geolokalisierungsdaten aufzutreten. Ich bin gespannt, ob dies das Ergebnis eines Fehlers ist oder, wie Sie meinen, möglicherweise beabsichtigt.
Jamie
Ich habe keinen Fall gesehen, in dem der Browser die Anzahl der Anrufe bei den Ortungsdiensten begrenzt. Wie oft fragen Sie ab?
Nico Westerdale
2

Ich habe endlich eine funktionierende Version für Firefox, Chrome & Standard Navigator in Android gefunden (nur 4.2 getestet):

function getGeoLocation() {
        var options = null;
        if (navigator.geolocation) {
            if (browserChrome) //set this var looking for Chrome un user-agent header
                options={enableHighAccuracy: false, maximumAge: 15000, timeout: 30000};
            else
                options={maximumAge:Infinity, timeout:0};
            navigator.geolocation.getCurrentPosition(getGeoLocationCallback,
                    getGeoLocationErrorCallback,
                   options);
        }
    }
surfealokesea
quelle
2

Der zweite Parameter, an den übergeben wird, Geolocation.getCurrentPosition()ist die Funktion, mit der Sie Geolokalisierungsfehler behandeln möchten. Die Fehlerbehandlungsfunktion selbst empfängt ein PositionErrorObjekt mit Details darüber, warum der Geolokalisierungsversuch fehlgeschlagen ist. Ich empfehle, den Fehler an die Konsole auszugeben, wenn Sie Probleme haben:

var positionOptions = { timeout: 10000 };
navigator.geolocation.getCurrentPosition(updateLocation, errorHandler, positionOptions);
function updateLocation(position) {
  // The geolocation succeeded, and the position is available
}
function errorHandler(positionError) {
  if (window.console) {
    console.log(positionError);
  }
}

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 .

Thirdender
quelle
1

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:

var options = {
  enableHighAccuracy: true,
  timeout: 5000,
  maximumAge: 0       
};
navigator.geolocation.getCurrentPosition(success, error, options);
Vasyl Gutnyk
quelle
1

Es ist möglicherweise eine gute Idee, einen Geolokalisierungsdienst für IP-Adressen als Fallback-Methode zu verwenden, wenn dies getCurrentPositionfehlschlägt. Zum Beispiel mit unserer API https://ip-api.io

$.getJSON("http://ip-api.io/json/",
    function(result) {
        console.log(result);
    });
Andrey E.
quelle
1

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:

navigator.geolocation.getCurrentPosition((position) => {
  let val = results[0].address_components[2].long_name;
  doSthWithVal(val);      
}, (error) => { });

Nach dem:

if(localStorage.getItem('getCurrentPosition') !== null) {
  doSthWithVal(localStorage.getItem('getCurrentPosition'));
}
else {
  navigator.geolocation.getCurrentPosition((position) => {
      let val = results[0].address_components[2].long_name;
      localStorage.setItem('getCurrentPosition',val);
      doSthWithVal(val);      
  }, (error) => { });
}
David Vielhuber
quelle
0

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.

Assimilater
quelle
0

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.

Mike McKay
quelle
0

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.

user2217751
quelle
0

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.

Robert Moore
quelle
0

Vielleicht hilft es jemandem. Auf Android hatte ich das gleiche Problem, aber ich habe es durch die Verwendung von " setTimeout Inside" herausgefunden, document.readysodass 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.

Sybghatallah Marwat
quelle