navigator.geolocation.getCurrentPosition иногда работает, иногда не - PullRequest
201 голосов
/ 03 августа 2010

Итак, у меня есть довольно простой JS-файл, использующий 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

По сути, здесь мы получаем текущую позицию, если она получена, два "водяных знака"помещается в два поля с надписью «Текущая позиция», и создаются два скрытых поля с данными в виде лат-длин в качестве их значения (они удаляются в начале, поэтому они не дублируются каждый раз).Есть также две кнопки, к которым привязана функция щелчка, которая делает то же самое.К сожалению, каждый третий раз или около того, это работает.В чем здесь проблема ???

Ответы [ 22 ]

3 голосов
/ 23 сентября 2016

@ brennanyoung - отличный ответ, но если вам интересно, что делать в случае сбоя, вы можете использовать API геолокации IP, например https://ipinfo.io (который является моей службой).Вот пример:

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

Подробнее см. http://ipinfo.io/developers/replacing-navigator-geolocation-getcurrentposition.

2 голосов
/ 29 марта 2018

Я обнаружил, что этот способ не работает

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

Но

этот способ работает идеально

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

function errorHandler() {...}

navigator.geolocation.getCurrentPosition(storeCoordinates, errorHandler, { enableHighAccuracy: true, timeout: 20000, maximumAge: 0 });
2 голосов
/ 13 октября 2016

Второй параметр, переданный Geolocation.getCurrentPosition() - это функция, которую вы хотите обрабатывать при любых ошибках геолокации.Сама функция-обработчик ошибок получает объект PositionError с подробной информацией о том, почему попытка геолокации не удалась.Я рекомендую вывести ошибку на консоль, если у вас есть какие-либо проблемы:

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

При выполнении этого в моем коде было обнаружено сообщение «Поставщик сетевого расположения на https://www.googleapis.com/': возвращен код ошибки 400».Оказывается, Google Chrome использует API Google для определения местоположения на устройствах, которые не имеют встроенного GPS (например, большинство настольных компьютеров).Google возвращает приблизительную широту / долготу на основе IP-адреса пользователя. Однако , в сборках Chrome для разработчиков (таких как Chromium в Ubuntu) нет ключа доступа API, включенного в сборку браузера.Это приводит к тому, что запрос API завершается неудачно.Подробнее см. Chromium Issue 179686: Геолокация с ошибкой 403 .

2 голосов
/ 19 ноября 2011

У меня были похожие проблемы, и я искал возможность того, что браузеры имеют ограничения на частоту вызова getCurrentPosition.Кажется, я часто могу найти местоположение, но если я обновлю страницу сразу, это истечет время ожидания.Если я немного подожду, я снова смогу найти место.Это обычно происходит с FF.В Chrome и Safari я еще не заметил тайм-аут getCurrentPosition.Просто мысль ...

Хотя я не могу найти никакой документации, подтверждающей это, к такому выводу я пришел после долгих испытаний.Возможно, у кого-то есть информация об этом?

2 голосов
/ 09 июля 2013

Наконец-то я нашел рабочую версию для Firefox, Chrome и стандартного навигатора в Android (только для 4.2):

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);
        }
    }
1 голос
/ 20 июня 2019

В нашем случае это всегда работает с первого раза, но при повторном запуске функции более 3-4 раз происходит сбой.

Простой обходной путь: сохраните его значение в LocalStorage.

До:

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

После того, как:

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) => { });
}
1 голос
/ 16 августа 2017

Я опубликую это здесь на случай, если это пригодится кому-либо ...

В iOS Safari вызовы navigator.geolocation.getCurrentPosition прервутся, если у меня будет запущена активная функция navigator.geolocation.watchPosition.

Правильный запуск и остановка watchPosition с использованием clearWatch(), как описано здесь, работали: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition

1 голос
/ 09 августа 2017

Может быть хорошей идеей использовать службу географического местоположения IP-адреса в качестве запасного метода при сбое getCurrentPosition.Например, с нашими API https://ip -api.io

$.getJSON("http://ip-api.io/json/",
    function(result) {
        console.log(result);
    });
1 голос
/ 13 июля 2016

У меня есть эта проблема в Mozilla. Все время: Ошибка: неизвестная ошибка получения позиции .

Теперь я использую 47 Mozilla. Я перепробовал все, но все время эта проблема. НО , затем я открываю about: config в панели адресов, зайдите geo.wifi.ui и измените его значение на "https://location.services.mozilla.com/v1/geolocate?key=test". работает!

Если у вас есть Ошибка при обнаружении позиции Ошибка, попробуйте увеличить значение времени ожидания:

var options = {
  enableHighAccuracy: true,
  timeout: 5000,
  maximumAge: 0       
};
navigator.geolocation.getCurrentPosition(success, error, options);
0 голосов
/ 22 апреля 2013

Я сам недавно заметил эту проблему, и я не уверен, как она возникла, но иногда кажется, что Firefox застревает на чем-то загруженном в кеш.После очистки кеша и перезапуска Firefox он снова начинает функционировать.

...