Mam więc dość prostą wersję JS, używając 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
Zasadniczo dzieje się tutaj, gdy otrzymujemy bieżącą pozycję, jeśli zostanie uzyskana, dwa „znaki wodne” zostaną umieszczone w dwóch polach z napisem „Bieżąca pozycja”, a dwa ukryte pola zostaną utworzone z danymi z długich lat (są usuwane na początku, aby nie były duplikowane za każdym razem). Istnieją również dwa przyciski z przypisaną funkcją kliknięcia, które robią to samo. Niestety co trzeci raz działa. W czym problem?
javascript
jquery
geolocation
theassociatedweb
źródło
źródło
noLocation
funkcja jest wywoływana? Jeśli tak, możesz dodaćerror
parametr donoLocation()
i wtedyerror.code
ierror.message
może ci pomóc w debugowaniu. Może nam również pomóc dowiedzieć się, jakiej przeglądarki używasz i czy widzisz ten sam problem w różnych przeglądarkach.Odpowiedzi:
Miałem dokładnie ten sam problem i nie znalazłem prawie żadnych informacji na ten temat w Internecie. W książkach nic nie ma. W końcu znalazłem to trzeźwe zapytanie przy przepełnieniu stosu i (ha!) Był to ostatni impuls, którego potrzebowałem, aby założyć tutaj konto.
I mam częściową odpowiedź, ale niestety nie pełną.
Przede wszystkim zdaj sobie sprawę, że domyślny limit czasu dla getCurrentPosition jest nieskończony (!). Oznacza to, że Twój program obsługi błędów nigdy nie zostanie wywołany, jeśli getCurrentPosition zawiesi się gdzieś na zapleczu.
Aby mieć pewność, że otrzymasz limit czasu, dodaj opcjonalny trzeci parametr do swojego wywołania, aby uzyskać getCurrentPosition, na przykład jeśli chcesz, aby użytkownik czekał nie więcej niż 10 sekund, zanim podpowie, co się dzieje, użyj:
Po drugie, doświadczyłem zupełnie innej niezawodności w różnych kontekstach. W domu dostaję oddzwonienie w ciągu sekundy lub dwóch, chociaż dokładność jest niska.
Jednak w pracy występują dziwne odmiany zachowania: Geolokalizacja działa na niektórych komputerach przez cały czas (oczywiście z wyjątkiem IE), inne działają tylko w Chrome i Safari, ale nie Firefox (problem z gekonem?), Inne działają raz, a następnie później zawodzi - a wzór zmienia się z godziny na godzinę, z dnia na dzień. Czasami masz „szczęśliwy” komputer, czasem nie. Może pomógłby ubój kóz w pełni księżyca?
Nie byłem w stanie tego pojąć, ale podejrzewam, że infrastruktura zaplecza jest bardziej nierówna niż reklamowana w różnych książkach i witrynach Gung-ho, które promują tę funkcję. Naprawdę chciałbym, aby byli nieco bardziej bezpośredni na temat tego, jak płatna jest ta funkcja i jak ważne jest to ustawienie limitu czasu, jeśli chcesz, aby program obsługi błędów działał poprawnie .
Próbowałem dzisiaj uczyć tego rodzaju rzeczy studentom i miałem zawstydzającą sytuację, w której mój komputer (na projektorze i kilku dużych ekranach) zawodził cicho, podczas gdy około 80% uczniów osiągało wynik niemal natychmiast (używając dokładnie ta sama sieć bezprzewodowa). Bardzo trudno jest rozwiązać te problemy, gdy moi uczniowie również piszą literówki i inne gafy, a gdy mój własny komputer również zawodzi.
W każdym razie mam nadzieję, że to pomoże niektórym z was. Dzięki za kontrolę zdrowia psychicznego!
źródło
timeout
opcjagetCurrentPosition()
. Nie oznacza to, że użytkownik zezwala na akceptację lub odrzucenie żądania geolokalizacji, ale czas, przez jaki sieć może zająć zwrócenie lokalizacji po udzieleniu zezwolenia. Jeśli użytkownik nie odpowie na żądanie geolokalizacji, procedura obsługi błędów nigdy nie zostanie wywołana. Dlatego potrzebujesz drugiego limitu czasu, jak w odpowiedzi @ xiaohouzi79.To jest hacky sposób, w jaki mi się to obchodzi, przynajmniej działa we wszystkich obecnych przeglądarkach (w systemie Windows nie mam komputera Mac):
Będzie to również działać, jeśli ktoś kliknie zamknięcie lub wybierze opcję nie lub wybierze opcję Nigdy nie udostępniaj w przeglądarce Firefox.
Clunky, ale działa.
źródło
geolocFail();
obsługi błędów igetcodeLatLng();
kodera geograficznego.Działa to dla mnie za każdym razem:
Chociaż nie jest to zbyt dokładne. Zabawne jest to, że na tym samym urządzeniu, jeśli go uruchomię, zniechęca mnie to około 100 metrów (za każdym razem), ale jeśli przejdę do map Google, dokładnie znajdzie moją lokalizację. Więc chociaż myślę, że enableHighAccuracy: true pomaga mu działać konsekwentnie, nie wydaje się, aby był bardziej dokładny ...
źródło
To już stare pytanie, ale wszystkie odpowiedzi nie rozwiązały mojego problemu, więc dodajmy to, które w końcu znalazłem. Pachnie jak hack (i to jeden), ale zawsze działa w mojej sytuacji. Mam również nadzieję na swoją sytuację.
źródło
Te same osoby tutaj, działa idealnie btw w Chrome (stabilny, deweloper i kanarek) po prostu nie w FF i Safari. Działa również doskonale na moim iPhonie i iPadzie (Safari!). Może to być spowodowane względną nowością tej funkcji (tj. Jest to błąd). Spędzam teraz na tym prawie tydzień i po prostu nie mogę go uruchomić w tych przeglądarkach
Oto, co znalazłem:
Przy pierwszym wywołaniu getCurrentPosition działa idealnie. Każde kolejne wywołanie nigdy nie zwraca, tzn. Nie uruchamia funkcji SuccessCallback lub errorCallback. Dodałem kilka opcji pozycji do mojego wezwania, aby udowodnić swój punkt widzenia:
i upływa limit czasu za każdym razem (po pierwszym udanym połączeniu). Pomyślałem, że mogę to naprawić za pomocą MaximumAge, ale wydaje się, że to nie działa, ponieważ powinno działać:
powinno to zapobiec faktycznemu wywołaniu funkcji getCurrentPosition, jeśli wywołasz ją w ciągu 60 sekund, ale to zignoruje (może to jednak wynikać z faktu, że odświeżam stronę, aby wywołać drugie połączenie, nie jestem pewien, czy jest to trwałe połączenie między)
btw, nawet przykłady Google'a zawodzą w tych przeglądarkach, co prowadzi mnie do przekonania, że to rzeczywiście błędy przeglądarki, spróbuj, załaduj go dwukrotnie w Safari i nie zadziała po raz drugi.
Jeśli ktoś znajdzie rozwiązanie tego problemu, PROSZĘ daj mi znać :-)
Twoje zdrowie.
źródło
Nie pojawia się komunikat o błędzie, ponieważ domyślnie nie ma limitu czasu (przynajmniej tak mi się wydaje). Miałem ten sam problem z firefoxem tylko dla mnie firefox zawsze daje limit czasu. Możesz sam ustawić limit czasu w ten sposób.
Moja funkcja działa świetnie w Chrome, ale za każdym razem dostaję limit czasu w Firefoksie.
Zalecam uważne obserwowanie błędów. Oczekuj wszystkiego. Przygotuj plan tworzenia kopii zapasowych wszystkiego. Sam używam niektórych wartości domyślnych lub wartości z mojej bazy danych na wypadek, gdyby zawiodły zarówno geolokalizacje Google, jak i geolokalizacje nawigatora.
źródło
W 2017 roku wciąż otrzymuję nierówne wyniki i mam teorię: dokumentacja API mówi, że połączenie jest teraz dostępne tylko „w bezpiecznym kontekście”, tj. Przez HTTPS. Mam problem z uzyskaniem wyniku w moim środowisku programistycznym (http na localhost) i wierzę, że właśnie dlatego.
źródło
Zamieszczę to tutaj, na wypadek, gdyby był użyteczny dla każdego…
W iOS Safari wywołania
navigator.geolocation.getCurrentPosition
przekroczą limit czasu, gdybym miał aktywnąnavigator.geolocation.watchPosition
funkcję.Uruchamianie i zatrzymywanie
watchPosition
poprawnego używania,clearWatch()
jak opisano tutaj, działało: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPositionźródło
oto moje rozwiązanie dzięki zamknięciu:
źródło
navigator && navigator.geolocation
Więc wpadłem na to samo. Wypróbowałem rozwiązanie przekroczenia limitu czasu, które działało, ale niezawodnie. Odkryłem, że jeśli zadzwonisz dwukrotnie, lokalizacja zostanie odpowiednio odświeżona
to oczywiście jest trochę wolniejsze, ale nigdy nie miałem tej sytuacji, która dawała mi niewłaściwą pozycję. Przekroczyłem limit czasu kilka razy i nie zwróciłem nic poza tym, że działa świetnie. Wiem, że wciąż jest to trochę zuchwałe i nie mogę się doczekać, aż ktoś znajdzie prawdziwe rozwiązanie.
Lub jeśli chcesz się upewnić, że będzie próbował, aż będziesz chciał się poddać, możesz spróbować czegoś takiego.
Prawdopodobnie mam tu kilka literówek i kilka błędów ortograficznych, ale mam nadzieję, że rozumiesz. Daj mi znać, jeśli ktoś ma pytania lub jeśli ktoś znajdzie coś lepszego.
źródło
Dla każdego, kto pracuje na aplikacji na iPhone'a ...
Jeśli Twój kod działa w UIWebView na iOS 9+, musisz ustawić go
NSLocationWhenInUseUsageDescription
w liście aplikacji.Jeśli nie zostanie ustawiony,
getCurrentPosition
nigdy nie oddzwoni, a użytkownik nigdy nie będzie monitowany.źródło
Przekonałem się, że ten sposób nie działa
Ale
w ten sposób działa idealnie
źródło
Odpowiedź @ brennanyoung jest świetna, ale jeśli zastanawiasz się, co zrobić w przypadku awarii, możesz użyć interfejsu API geolokalizacji IP, takiego jak https://ipinfo.io (który jest moją usługą). Oto przykład:
Więcej informacji na stronie https://ipinfo.io/developers/replacing-getcurrentposition .
źródło
Miałem podobne problemy i zastanawiałem się nad możliwością, że przeglądarki mają ograniczenia dotyczące częstotliwości wywoływania getCurrentPosition. Wygląda na to, że często mogę znaleźć lokalizację, ale jeśli od razu odświeżę stronę, upłynie limit czasu. Jeśli trochę poczekam, zwykle mogę ponownie uzyskać lokalizację. Zwykle dzieje się tak w przypadku FF. W Chrome i Safari nie zauważyłem jeszcze przekroczenia limitu czasu getCurrentPosition. Tylko myśl ...
Chociaż nie mogę znaleźć żadnej dokumentacji na poparcie tego, był to wniosek, do którego doszedłem po wielu testach. Być może ktoś ma jakieś informacje na ten temat?
źródło
W końcu znalazłem działającą wersję dla Firefoxa, Chrome i domyślnego nawigatora w Androidzie (tylko w wersji 4.2):
źródło
Drugi przekazany parametr
Geolocation.getCurrentPosition()
to funkcja, która ma obsługiwać wszelkie błędy geolokalizacji. Sama funkcja obsługi błędów odbieraPositionError
obiekt ze szczegółami, dlaczego próba geolokalizacji nie powiodła się. Jeśli masz jakiekolwiek problemy, zalecamy wysłanie błędu do konsoli.Wykonanie tego w moim kodzie ujawniło komunikat „Dostawca lokalizacji sieciowej pod adresem „ https://www.googleapis.com/ ”: Zwrócony kod błędu 400”. Okazuje się, że Google Chrome używa interfejsów API Google, aby uzyskać lokalizację na urządzeniach, które nie mają wbudowanego GPS (na przykład na większości komputerów stacjonarnych). Google zwraca przybliżoną szerokość / długość geograficzną na podstawie adresu IP użytkownika. Jednak w wersjach Chrome dla programistów (takich jak Chromium w systemie Ubuntu) klucz kompilacji przeglądarki nie zawiera klucza dostępu do interfejsu API. Powoduje to cichą awarię żądania API. Zobacz Chromium nr 179686: Geolokalizacja dająca błąd 403, aby poznać szczegóły.
źródło
Mam ten problem w Mozilli. Cały czas: Błąd: nieznany błąd podczas uzyskiwania pozycji .
Teraz używam 47 Mozilli. Próbowałem wszystkiego, ale cały czas ten problem. ALE potem otwieram about: config na moim pasku adresu, idę geo.wifi.ui i zmieniłem wartość na „ https://location.services.mozilla.com/v1/geolocate?key=test ”. Pracuje!
Jeśli masz błąd przekroczenia limitu czasu pozyskiwania pozycji , spróbuj zwiększyć wartość limitu czasu:
źródło
Dobrym pomysłem może być skorzystanie z usługi lokalizacji geograficznej adresu IP jako metody rezerwowej w przypadku
getCurrentPosition
niepowodzenia. Na przykład za pomocą naszego interfejsu API https://ip-api.ioźródło
W naszym przypadku zawsze działa za pierwszym razem, ale ponowne uruchomienie funkcji więcej niż 3-4 razy, kończy się niepowodzeniem.
Proste obejście: przechowuj jego wartość w LocalStorage.
Przed:
Po:
źródło
Niedawno zauważyłem ten problem i nie jestem pewien, jak to się dzieje, ale czasami wydaje się, że firefox utknął na czymś załadowanym do pamięci podręcznej. Po wyczyszczeniu pamięci podręcznej i ponownym uruchomieniu Firefoksa wydaje się, że znów działa.
źródło
Ta biblioteka dodaje do połączeń geolokalizacyjnych żądaną opcję Dokładności i maksymalnej wartości, co oznacza, że będzie próbowała uzyskać pozycję, dopóki dokładność nie znajdzie się w określonym zakresie.
źródło
Dzięki wszystkim za wkład, pomogło mi to.
Oprócz konieczności użycia watchPosition () zamiast getCurrentPosition (), odkryłem również, że muszę przenieść wywołanie z document.ready () do głowy.
źródło
Stało się tak podczas używania responsywnego trybu projektowania Firefoksa. Zgłoszono zgłoszenie błędu . Na razie nie używaj responsywnego trybu projektowania podczas korzystania z Geolokalizacji API.
źródło
Może to pomaga komuś, na Androidzie miałem ten sam problem, ale pomyślałem o tym, używając go
setTimeout
wewnątrz,document.ready
więc zadziałało dla mnie po drugie, musisz zwiększyć limit czasu, po prostu zwiększyć, jeśli użytkownik zezwoli na jego lokalizację po kilku sekundach, więc utrzymałem go na 60000 mili sekund (1 minuta), pozwalając mojej funkcji powodzenia zadzwonić, jeśli użytkownik kliknie przycisk zezwolenia w ciągu 1 minuty.źródło