Итак, у меня есть довольно простая часть 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
По сути, здесь происходит то, что мы получаем текущую позицию, если она получена, два «водяных знака» помещаются в два поля с надписью «Текущая позиция», а два скрытых поля создаются с данными долготы в качестве значения (они удалены). в начале, чтобы они не дублировались каждый раз). Есть также две кнопки, к которым привязана функция щелчка, которая делает то же самое. К сожалению, каждый третий раз или около того, это работает. В чем здесь проблема ???
javascript
jquery
geolocation
theassociatedweb
источник
источник
noLocation
вызывается функция? Если это так, вы можете добавитьerror
параметр,noLocation()
а затемerror.code
иerror.message
может помочь вам в отладке. Это также может помочь нам узнать, какой браузер вы используете, и если вы видите ту же проблему в разных браузерах.Ответы:
У меня была точно такая же проблема, и я почти не нашел в Интернете информации об этом. Ничего вообще в книгах. Наконец я нашел этот трезвый запрос на stackoverflow и (ха!) Это был последний импульс, который мне был нужен, чтобы создать учетную запись здесь.
И у меня есть частичный ответ, но, увы, не полный.
Прежде всего, поймите , что тайм-аут по умолчанию для getCurrentPosition бесконечен (!). Это означает, что ваш обработчик ошибок никогда не будет вызван, если getCurrentPosition зависнет где-нибудь на серверной части.
Чтобы убедиться, что вы получаете тайм-аут, добавьте необязательный третий параметр к вашему вызову getCurrentPosition, например, если вы хотите, чтобы пользователь подождал не более 10 секунд, прежде чем дать ему понять, что происходит, используйте:
Во-вторых, я испытал совершенно разную надежность в разных контекстах. Здесь, дома, я получаю ответный звонок в течение секунды или двух, хотя точность низкая.
На работе, однако, я наблюдаю довольно странные изменения в поведении: геолокация работает на некоторых компьютерах все время (за исключением IE, конечно), другие работают только в chrome и safari, но не в firefox (проблема с gecko?), Другие работают один раз, затем впоследствии терпеть неудачу - и картина меняется с часа на час, со дня на день. Иногда у вас есть «счастливый» компьютер, иногда нет. Возможно, поможет убой коз в полнолуние?
Я не смог понять это, но я подозреваю, что внутренняя инфраструктура более неровная, чем рекламируется в различных фанатских книгах и сайтах, которые продвигают эту функцию. Мне бы очень хотелось, чтобы они были немного более откровенны в отношении того, насколько ненадежна эта функция и насколько важен этот параметр времени ожидания, если вы хотите, чтобы ваш обработчик ошибок работал правильно .
Я пытался преподавать этот материал студентам сегодня, и у меня была неловкая ситуация, когда мой собственный компьютер (на проекторе и нескольких больших экранах) молча давал сбой, тогда как около 80% студентов получали результат почти мгновенно (используя точно такая же беспроводная сеть). Очень трудно решить эти проблемы, когда мои ученики также делают опечатки и другие оплошности, и когда мой компьютер тоже выходит из строя.
Во всяком случае, я надеюсь, что это поможет некоторым из вас, ребята. Спасибо за проверку вменяемости!
источник
timeout
опцияgetCurrentPosition()
. Это не время для пользователя, чтобы разрешить или отклонить запрос геолокации, но сколько времени сети может потребоваться, чтобы вернуть местоположение после предоставления разрешения. Если пользователь не отвечает на запрос геолокации, обработчик ошибок никогда не будет вызван. Таким образом, вам нужен второй тайм-аут, как в ответе @ xiaohouzi79.Это хакерский способ обойти это, по крайней мере, он работает во всех современных браузерах (в Windows у меня нет Mac):
Это также будет работать, если кто-то нажмет на кнопку «Закрыть» или выберет «Нет» или выберет параметр «Никогда не делиться» в Firefox.
Неуклюжий, но это работает.
источник
geolocFail();
обработчика ошибок иgetcodeLatLng();
геокодера.Это работает для меня каждый раз:
Хотя это не очень точно. Самое смешное, что на одном и том же устройстве, когда я запускаю это, он отодвигает меня примерно на 100 метров (каждый раз), но если я захожу на карты Google, он точно находит мое местоположение. Так что, хотя я думаю, что enableHighAccuracy: true помогает ему работать последовательно, похоже, он не делает его более точным ...
источник
Это уже старый вопрос, но все ответы не решили мою проблему, поэтому давайте добавим тот, который я наконец нашел. Пахнет как хак (и он один), но всегда работает в моей ситуации. Надеюсь, в вашей ситуации тоже.
источник
Те же самые люди, это прекрасно работает между прочим в Chrome (stable, dev и canary), но не в FF и Safari. Он также отлично работает на моем iPhone и iPad (Safari!). Это может быть связано с относительной новизной этой функции (т.е. это ошибка). Я трачу почти неделю на это сейчас, и я просто не могу заставить его работать в этих браузерах
Вот что я нашел:
При первом вызове getCurrentPosition он работает отлично. Любой последующий вызов никогда не возвращается, то есть он не запускает функции successCallback или errorCallback. Я добавил несколько вариантов позиции в свой звонок, чтобы доказать свою точку зрения:
и это время ожидания каждый раз (после первого успешного вызова). Я думал, что смогу исправить это с помощью MaximumAge, но, похоже, это не сработает, так как предполагается, что тоже будет работать:
это должно предотвратить фактический вызов функции getCurrentPosition, если вы вызываете ее в течение 60 секунд, но она игнорирует это (однако, это может быть связано с тем, что я фактически обновляю свою страницу, чтобы вызвать второй вызов, не уверенный, является ли это постоянным во всех вызовах)
Кстати, даже примеры Google не работают на этих браузерах, что заставляет меня поверить, что это действительно ошибки браузера, попробуйте, загрузите его дважды в Safari, и он не будет работать во второй раз.
Если кто-нибудь найдет решение для этого, ПОЖАЛУЙСТА, дайте мне знать :-)
Приветствия.
источник
Вы не получаете сообщение об ошибке, потому что по умолчанию оно не имеет времени ожидания (по крайней мере, я так думаю). У меня была такая же проблема с Firefox только для меня Firefox всегда дает тайм-аут. Вы можете установить тайм-аут самостоятельно, как это.
Моя функция прекрасно работает в Chrome, но в Firefox я получаю тайм-аут.
Я рекомендую внимательно следить за вашими ошибками. Быть ожидаемым для всего. Есть план резервного копирования для всего. Я сам использую некоторые значения по умолчанию или значения из своей базы данных на случай, если не удастся как геолокации Google, так и геолокации навигатора.
источник
Я все еще получаю точные результаты в 2017 году, и у меня есть теория: в документации API говорится, что вызов теперь доступен только «в безопасном контексте», то есть через HTTPS. У меня проблемы с получением результата в моей среде разработки (http на localhost), и я считаю, что именно поэтому.
источник
Я опубликую это здесь на случай, если это кому-нибудь пригодится ...
В iOS Safari вызовы
navigator.geolocation.getCurrentPosition
прервались бы, если бы у меня была активнаяnavigator.geolocation.watchPosition
функция.Запуск и остановка
watchPosition
правильного использования,clearWatch()
как описано здесь, работали: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPositionисточник
вот мое решение благодаря закрытию:
источник
navigator && navigator.geolocation
Так что я столкнулся с тем же. Я попробовал тайм-аут решение, которое работало, но не надежно. Я обнаружил, что если вы просто позвоните дважды, то место обновится должным образом
это, конечно, немного медленнее, но у меня не было, чтобы это дало мне неправильную позицию однажды. У меня было несколько раз, и он не возвращал ничего, кроме того, что он прекрасно работает. Я знаю, что это все еще немного хакерски, и я с нетерпением жду, когда кто-то найдет реальное решение.
Или, если вы хотите убедиться, что он будет продолжать пытаться, пока вы не захотите сдаться, вы можете попробовать что-то вроде этого.
У меня, вероятно, есть некоторые опечатки и некоторые орфографические ошибки, но я надеюсь, что вы поняли идею. Дайте мне знать, если у кого-то есть вопросы или кто-то найдет что-то лучшее.
источник
Для тех, кто работает над приложением для iPhone ...
Если ваш код работает в UIWebView на iOS 9+, то вы должны установить его
NSLocationWhenInUseUsageDescription
в списке приложений.Если вы не установите его, то
getCurrentPosition
никогда не перезвонит, и пользователю никогда не будет предложено.источник
Я обнаружил, что этот способ не работает
Но
этот способ работает идеально
источник
Ответ @ brennanyoung отличный, но если вам интересно, что делать в случае сбоя, вы можете использовать API геолокации IP, такой как https://ipinfo.io (который является моей службой). Вот пример:
См. Https://ipinfo.io/developers/replacing-getcurrentposition для получения более подробной информации.
источник
У меня были подобные проблемы, и я искал возможность того, что браузеры имеют ограничения на частоту вызова getCurrentPosition. Кажется, я часто могу найти местоположение, но если я обновлю страницу сразу же, она истечет. Если я немного подожду, я снова смогу найти место. Это обычно происходит с FF. В Chrome и Safari я еще не заметил тайм-аут getCurrentPosition. Просто мысль...
Хотя я не могу найти никакой документации, подтверждающей это, к такому выводу я пришел после долгих испытаний. Возможно, у кого-то есть информация об этом?
источник
Наконец-то я нашел рабочую версию для Firefox, Chrome и стандартного навигатора в Android (только для 4.2):
источник
Второй передаваемый параметр
Geolocation.getCurrentPosition()
- это функция, которую вы хотите обрабатывать при любых ошибках геолокации. Функция обработчика ошибок сама получаетPositionError
объект с подробной информацией о том, почему попытка геолокации не удалась. Я рекомендую выводить ошибку на консоль, если у вас есть какие-либо проблемы:При этом в моем коде появилось сообщение «Поставщик сетевого расположения на странице https://www.googleapis.com/ : возвращен код ошибки 400». Оказывается, Google Chrome использует API Google для определения местоположения на устройствах, которые не имеют встроенного GPS (например, большинство настольных компьютеров). Google возвращает приблизительную широту / долготу в зависимости от IP-адреса пользователя. Однако в сборках Chrome для разработчиков (таких как Chromium в Ubuntu) ключ сборки API не включен в сборку браузера. Это приводит к тому, что запрос API завершается неудачно. См. Chromium Issue 179686: Геолокация с ошибкой 403 для получения более подробной информации.
источник
У меня есть эта проблема в Mozilla. Все время: Ошибка: неизвестная ошибка получения позиции .
Сейчас я использую 47 Mozilla. Я перепробовал все, но все время эта проблема. НО тогда я открываю about: config в моей панели адресов, захожу на geo.wifi.ui и меняю его значение на « https://location.services.mozilla.com/v1/geolocate?key=test ». работает!
Если у вас есть ошибка тайм-аута получения позиции , попробуйте увеличить значение тайм-аута:
источник
Возможно, будет хорошей идеей использовать службу географического местоположения IP-адреса в качестве запасного метода при
getCurrentPosition
сбое. Например, с нашими API https://ip-api.ioисточник
В нашем случае это всегда работает с первого раза, но при повторном запуске функции более 3-4 раз происходит сбой.
Простой обходной путь: сохраните его значение в LocalStorage.
Перед:
После:
источник
Я сам недавно заметил эту проблему, и я не уверен, как она возникает, но иногда кажется, что Firefox застревает на чем-то загруженном в кеш. После очистки кеша и перезапуска Firefox он снова работает.
источник
Эта библиотека добавляет в вызовы геолокации требуемый параметрAcucuracy и maxWait, что означает, что она будет продолжать пытаться получить позицию, пока точность не окажется в заданном диапазоне.
источник
Спасибо всем за их вклад, это помогло мне.
В дополнение к необходимости использовать watchPosition () вместо getCurrentPosition (), я также обнаружил, что мне нужно переместить вызов из Document.ready () в заголовок.
источник
Это случилось со мной при использовании адаптивного режима дизайна Firefox. Был подан отчет об ошибке . Пока не используйте режим адаптивного дизайна при использовании API Geolocation.
источник
Может быть, это кому-то поможет, на Android у меня возникла та же проблема, но я решил ее, используя
setTimeout
внутреннюю часть,document.ready
чтобы она работала для меня. Во-вторых, нужно увеличить тайм-аут, только если пользователь разрешил свое местоположение через несколько секунд, поэтому я сохранил его до 60000 мили (1 минута), позволяющие вызывать мою функцию успеха, если пользователь нажимает кнопку разрешения в течение 1 минуты.источник