HTML5 и занимательная геолокация

Возможность высокоуровневой геолокации — не совсем часть HTML5. Несмотря на это, W3C предоставляет спецификацию API геолокации, которой следует придерживаться при создании, например, браузеров. Что и демонстрируют Chrome, Firefox и (боги!) даже Internet Explorer 9.

С помощью этого интерфейса узнать, где физически находится посетитель вашего сайта, не представляет труда. На эту тему уже появилось достаточное количество статей (например, эта), но все они в той или иной степени пересказывают спецификацию.

Полученные данные можно использовать для Google Maps, причем не обязательно для визуального отображения этих самых данных. Можно воспользоваться Geocoder, входящим в Google Maps API и получить по широте и долготе название страны, населенного пункта или другой доступной информации. В общем, очень нужная и удобная возможность персонализировать выводимую пользователю информацию, узнать о нем с большей достоверностью немного больше, чем он предполагает. Разумеется, только с разрешения самого посетителя.

Это и есть свинья, подложенная разработчиками FF и Chrome.

В момент загрузки страницы с помощью if (navigator.geolocation) можно убедиться, что геолокация как таковая поддерживается браузером посетителя и можно попытаться получить данные о его местонахождении методом navigator.geolocation.getCurrentPosition(). Данный метод получает на вход две функции и набор опций. Если последние можно опустить для тестирования сайта, то передать определения функций успешного и ошибочного определения координат необходимо.

Первая сработает только в случае, если геолокация удалась, вторая — во всех ошибочных случаях. Таковыми могут быть недоступность данных, слишком долгое выполнения запроса геолокации, запрет от пользователя и т.п. 

Перечисленные браузеры предлагают пользователю соответствующий выбор — разрешить передачу своего местонахождения или нет. Но. В них также присутствует кнопка «Не сейчас», попросту крестик, предлагающий скрыть всплывающее окно с вопросом и не давать определенного ответа.

Плохо здесь то, что пользователю выводится неблокирующее сообщение о том, что сайт пытается что-то там про вас узнать. Его можно фактически проигнорировать двумя способами — просто оставить как есть и ничего не нажимать, либо нажать на предлагаемый «крестик» и не дать ответа вашему приложению.

Такой подход неоднократно обсуждался в багрепортах Mozilla, но разработчики реагируют однозначно — сообщение ошибки геолокации при скрытии попапа геолокации «по крестику» недопустимо и не предусматривается архитектурой браузера. Это равнозначно тому, что клиентская машина не поддерживает ее.

В итоге веб-разработчику никак нельзя надеяться и ждать, что пользователь прореагирует на запрос данных, и предусматривать возможность их получения иными способами. Данные геолокации в любом случае придут в приложение асинхронно, если вообще придут.

Идеальным в таком случае является «многослойная» геолокация. Например, определение координат пользователя по GeoIP на стороне сервера. Данные, пришедшие в любой момент посещения ресурса по Geolocation API от браузера, можно рассматривать как дополняющие и реагировать на их появление только лишь по факту.

Rambler's Top100