Обновление информации о геолокации с помощью setInterval

#jquery #geolocation

#jquery #геолокация

Вопрос:

Я пытаюсь получить текущие координаты с помощью геолокации. Я использовал setInterval для повторного запуска скрипта каждые 1 секунду, но когда это происходит, он очищает поля ввода lat $ lng вместо получения новых координат.

 <form action="done.php" method="post" name="position">
  <input type="text" name="lng" id="lng" class="form-control" value="">
  <input type="text" name="lat" id="lat" class="form-control" value="">
  <input type="submit" class="btn btn-primary" value="Update location">
</form>


<script>
$(function (getLocation) {
    var Geo = {};
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(success, error);
    }
    function success(position) {
        Geo.lat = position.coords.latitude;
        Geo.lng = position.coords.longitude;

        populateHeader(Geo.lat, Geo.lng);

    }
    function error() {
        console.log("Geocoder failed");
    }
    function populateHeader(lat, lng) {
        $('#lat').val(lat);
        $('#lng').val(lng);

    }
setInterval(function(){populateHeader()},1000);
});
</script>
  

Ответ №1:

Ваш код очищает поля каждую секунду, потому что вы вызываете populateHeader() без параметров в функции setInterval обратного вызова, которая затем устанавливает оба поля undefined равными . Чтобы сделать то, что вы изначально хотели, функция setInterval обратного вызова должна быть вызвана .getCurrentPosition() снова.

Однако .getCurrentPosition() это уже асинхронный вызов, и если для получения исправления GPS требуется 15 секунд, вы должны поставить в очередь 15 вызовов функций с интервалом в одну секунду. Вы могли бы обойти эту проблему, используя setTimeout() вместо setInterval() в конце ваших успешных и ошибочных обратных вызовов, что позволило бы запустить следующий запрос через секунду после завершения предыдущего.

Однако есть более простое решение. Если вы посмотрите документацию API геолокации, в ней уже есть .watchPosition() метод, который будет запускать обратный вызов каждый раз при изменении местоположения, принимая те же параметры, что и одноразовый .getCurrentPosition() метод. Использование этого сделает ваш код более чистым и, вероятно, более эффективным.

 <form action="done.php" method="post" name="position">
    <input type="text" name="lng" id="lng" class="form-control" value="">
    <input type="text" name="lat" id="lat" class="form-control" value="">
    <input type="submit" class="btn btn-primary" value="Update location">
</form>


<script>
    $(function () {
        var Geo = {};

        if (navigator.geolocation) {
            navigator.geolocation.watchPosition(
                function (position) {
                    // Success
                    Geo.lat = position.coords.latitude;
                    Geo.lng = position.coords.longitude;

                    $('#lat').val(Geo.lat);
                    $('#lng').val(Geo.lng);
                },
                function () {
                    // Error
                    console.log("Geocoder failed");
                }
            );
        }

    });
</script>
  

Комментарии:

1. как бы мне перестать следить за положением?

2. @chovy .watchPosition() возвращает целочисленный идентификатор, который вы можете сохранить. Чтобы отменить регистрацию вашего обработчика и прекратить просмотр, передайте идентификатор navigator.geolocation.clearWatch() .