В современных браузерах существует возможность получить координаты юзера. Обычно это делается конструкцией вида:
if (navigator.geolocation) {
navigator.geolocation.watchPosition(showPosition);
} else {
...
}
И обычно эта конструкция вешается на событие готовности загрузки страницы (через JQuery):
$(document).ready(function () {
if (navigator.geolocation) {
А является ли асинхронным сам вызов
if (navigator.geolocation)
?
Ведь он (вроде бы) приводит к появлению всплывающего окошка браузера с текстом вроде "Этот сайт хочет отслеживать ваше местоположение, разрешить?" и парой кнопок. При этом, мне непонятно, будет ли вызываться последующий код, понавешанный на событие готовности страницы с помощью:
$(document).ready(function () {
А может быть вообще не стоит ожидать полной готовности страницы? Пусть себе запрос к пользователю и последующая работа с полученными координатами идут параллельно с загрузкой страницы.
Как лучше сделать?
Здравствуйте, Слава, Вы писали:
С>А является ли асинхронным сам вызов
С>if (navigator.geolocation)
?
Так тут же объект, а не промис, значит все синхронно. Вообще не помню, чтобы проперти бывали асинхронными. А вот watchPosition() и getCurrentPosition() уже асинхронные, они-то и "вернут" ошибку, если не дали разрешения.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, Слава, Вы писали:
С>А является ли асинхронным сам вызов
С>if (navigator.geolocation)
?
В JavaScript нет неявной асинхронности. В браузерном API также практически нет блокирующих вызовов. Что написано, то и происходит. Данный код по сути проверяет, есть ли у объекта navigator свойство geolocation, то бишь поддерживает ли вообще браузер данное API.
С>Ведь он (вроде бы) приводит к появлению всплывающего окошка браузера с текстом вроде "Этот сайт хочет отслеживать ваше местоположение, разрешить?" и парой кнопок.
Нет, это окошко появится после вызова watchPosition. Если пользователь разрешит, то будет вызываться переданная парметром функция.
C> При этом, мне непонятно, будет ли вызываться последующий код
Будет. Хотя сама причина, почему непонятно — непонятна. Поставь там console.log и экспериментируй, чего гадать.
С>А может быть вообще не стоит ожидать полной готовности страницы? Пусть себе запрос к пользователю и последующая работа с полученными координатами идут параллельно с загрузкой страницы.
Почему бы и нет. Просто учти, что у тебя в момент вызова твоего коллбэка страница может быть ещё не загружена.
С>Как лучше сделать?
По-мне проще делать как ты сейчас делаешь, меньше думать, что у тебя там загрузилось, не загрузилось. С другой стороны если ты можешь раньше сделать что-то осмысленное и пользователю это будет полезно, возможно лучше и так.
Здравствуйте, Слава, Вы писали:
С>А является ли асинхронным сам вызов
С>if (navigator.geolocation)
?
О, геолокация. Я на ней собаку съел
Этот вызов синхронный, так как он просто проверяет, есть ли объект геолокацкии у браузера — т.е. просто поддерживается ли такая фича.
С>Ведь он (вроде бы) приводит к появлению всплывающего окошка браузера с текстом вроде "Этот сайт хочет отслеживать ваше местоположение, разрешить?" и парой кнопок. При этом, мне непонятно, будет ли вызываться последующий код, понавешанный на событие готовности страницы с помощью:
С>$(document).ready(function () {
А может быть вообще не стоит ожидать полной готовности страницы? Пусть себе запрос к пользователю и последующая работа с полученными координатами идут параллельно с загрузкой страницы.
Следующей строчкой с watchPositions он собственно и сделает запрос, результат будет передан в фукнцию по готовности. А запрос параллельно с загрузкой страницы приведёт к тому, что страница запросит геолокацию у пользователя, когда ещё может толком ничего и не загружено, и в этом случае он навряд ли разрешит это действие
С>Как лучше сделать?
Использовать Google Map Geolocation API —
ссылка.
1. Нет окна запроса геолокации у пользователя — а с этим окном бывают большие проблемы, если браузер встроен — можно обойти, вписав permission в настройках браузера, но это некошерно и не всегда возможно;
2. Работает и на HTTP ресурасах — свежие бразуеры разрешают naviagtor.geolocation только на https ресурсах. Ну и на localhost для отладки
Правда скоро это апи будет платным, надо смотреть какие там бесплатные лимиты.