navigator.geolocation возвращает ошибку из второго исполнения - IE

92
10

При выполнении navigator.geolocation.getCurrentPosition(success, error, options); в первый раз я могу получить местоположение пользователя. однако из второго выполнения функция возвращает ошибку:

Текущее положение не может быть определено.

Я следил за рекомендациями, приведенными в этом вопросе, без успеха, как я могу заставить это работать?

Здесь вы можете найти рабочий скрипт, чтобы быстро увидеть ошибку.

//Pass this options to the getCurrentPosition
var options = {
enableHighAccuracy: true,
timeout: 5000,
maximumAge: 0
};
//function to execute if the current position was succesfully retrieved
function success(pos) {
console.log(pos);
var crd = {lat: pos.coords.latitude, lng : pos.coords.longitude };
var myPre = document.querySelector('pre');
myPre.textContent = JSON.stringify(crd);
myPre.style.color = someColor(); // use a diferent color just to see it a new execution of the code
};
//execute this on error
function error(err) {
var myPre = document.querySelector('pre');
myPre.textContent = err;
myPre.style.color = someColor(); // use a diferent color
};
//attach function to button
var myButton = document.querySelector('button');
myButton.addEventListener('click', function(){
navigator.geolocation.getCurrentPosition(success, error, options);
});

спросил(а) 2021-01-19T16:55:55+03:00 9 месяцев, 1 неделя назад
1
Решение
79

Моя идея такова:

Пользователь IE позволяет только веб-сайту (сценарию) (по умолчанию) запускать getCurrentLocation один раз. Пользователь должен предоставить исключение для его запуска несколько раз.

Однако я не знаю (и не могу найти документацию), если это по дизайну или ошибке. Решение ниже - это обход.

watchposition этого используйте watchposition после того, как начальная последовательность завершит эту ошибку. См. Обновленную скрипту: https://jsfiddle.net/b2rnr7tw/6/

В этой скрипте я настраивал watchPosition и как только он обновляется, он показывает новое местоположение. После этого он отменяется (иначе он продолжает обновление).

//Pass this options to the getCurrentPosition
var options = {
enableHighAccuracy: true,
timeout: 5000,
maximumAge: 0
};

var watch = null;
var watchId = null;
//function to execute if the current position was succesfully retrieved
function success(pos) {

var crd = {lat: pos.coords.latitude, lng : pos.coords.longitude };
var myPre = document.querySelector('pre');
myPre.textContent = JSON.stringify(crd);
myPre.style.color = someColor(); // use a diferent color
watch.clearWatch(watchId); //after success clear the watchId.
};
//execute this on error
function error(err) {
var myPre = document.querySelector('pre');
myPre.textContent = err;
myPre.style.color = someColor(); // use a diferent color
//keep running the watchPosition if on error, however you can use a counter to only try it a few times (recommended)
};
//attach function to button
var myButton = document.querySelector('button');
myButton.addEventListener('click', function(){
if (!watch)
{
watch = navigator.geolocation;
watch.getCurrentPosition(success, error, options);
}
else
{
watchId = watch.watchPosition(success, error, options);
}
});

ответил(а) 2021-01-19T16:55:55+03:00 9 месяцев, 1 неделя назад
65

Решение Mouser работало для меня в IE11, но разрывает Edge, поэтому нам нужно обнаружить браузер. Вот мое решение, протестированное в IE11, Edge 14, FFx и Chrome (последние версии FFx и Chrome на момент написания)


            var currentPositionHasBeenDisplayed = false;

if (navigator.geolocation) {

var options = {};

var isIE = document.documentMode; //IE 8+

// IE only allows one call per script to navigator.geolocation.getCurrentPosition, so we need a workaround
if (currentPositionHasBeenDisplayed == true && isIE) {
navigator.geolocation.watchPosition(
function (pos) {
var myLatLng = new google.maps.LatLng(parseFloat(pos.coords.latitude), parseFloat(pos.coords.longitude));
map.setCenter(myLatLng);
},
function (error) { },
options);
}
else {
navigator.geolocation.getCurrentPosition(
function (pos) {
var myLatLng = new google.maps.LatLng(parseFloat(pos.coords.latitude), parseFloat(pos.coords.longitude));
map.setCenter(myLatLng);
currentPositionHasBeenDisplayed = true;
},
function (error) { return false; },
options);
}
}

ответил(а) 2021-01-19T16:55:55+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема