Ваш код очищает поля каждую секунду, потому что вы вызываете populateHeader()
без параметров в функции обратного вызова setInterval
, которая затем устанавливает оба поля на undefined
. Чтобы сделать то, что вы изначально хотели, функция обратного вызова setInterval
должна снова вызывать .getCurrentPosition()
.
Однако .getCurrentPosition()
уже является асинхронным вызовом, и если для определения местоположения GPS требуется 15 секунд, вы бы поставили в очередь 15 вызовов функций с интервалом в одну секунду. Вы можете обойти эту проблему, используя setTimeout()
вместо setInterval()
в конце вашего успешного вызова и обратных вызовов с ошибками, что обеспечит запуск следующего запроса через секунду после завершения предыдущего.
Однако есть более простое решение. Если вы посмотрите документацию Geolocation 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>