JavaScript. Подробное руководство, 6-е издание, стр. 373

• В главе 21 были представлены элементы

<b>&lt;audio&gt;, &lt;video&gt;</b>
и
<b>&lt;canvas&gt;,</b>
а также средства для работы с векторной графикой SVG.

Эта глава охватывает ряд других прикладных интерфейсов HTML5:

• В разделе 22.1 рассматривается прикладной интерфейс объекта

<b>Geolocation</b>
, позволяющий броузерам определять географическое местонахождение пользователя (с его разрешения).

• В разделе 22.2 рассказывается о прикладных интерфейсах управления историей посещений, которые позволяют веб-приложениям сохранять и обновлять информацию о своем состоянии в ответ на использование кнопок

<b>Back</b>
(Назад) и
<b>Forward</b>
(Вперед) броузера, без необходимости выполнять полную перезагрузку страницы с веб-сервера.

• В разделе 22.3 описывается простой прикладной интерфейс передачи сообщений между документами с различным происхождением. Он обеспечивает безопасный способ обхода ограничений политики общего происхождения (раздел 13.6.2), препятствующих непосредственному взаимодействию документов, полученных от разных веб-серверов.

• В разделе 22.4 охватывается новая важная особенность HTML5: возможность выполнять программный код на языке JavaScript в отдельном фоновом потоке выполнения и безопасно взаимодействовать с этими «рабочими» потоками.

• В разделе 22.5 рассматриваются специальные типы данных для работы с массивами байтов и чисел, более экономно расходующие память.

• В разделе 22.6 будут представлены двоичные объекты (Blob): нетипизированные порции данных, которые служат основным форматом обмена данными, используемым различными новыми прикладными интерфейсами для работы с двоичными данными. В этом разделе также охватывается несколько типов данных, связанных с большими двоичными объектами, и их прикладные интерфейсы: объекты

<b>File</b>
и
<b>FileReader</b>
, тип
<b>BlobBuilder</b>
и URL-адреса вида blob://.

• В разделе 22.7 демонстрируется прикладной интерфейс к файловой системе, посредством которого веб-приложения могут читать и писать файлы в частной файловой системе. Это один из пока не устоявшихся прикладных интерфейсов, и он не описывается в справочном разделе книги.

• В разделе 22.8 демонстрируется прикладной интерфейс объекта

<b>IndexedDB</b>
, предназначенный для сохранения и извлечения объектов в простых базах данных. Как и интерфейс к файловой системе, прикладной интерфейс
<b>IndexedDB</b>
пока является нестабильным и не описывается в справочном разделе.

• Наконец, раздел 22.9 охватывает прикладной интерфейс веб-сокетов Web Sockets, позволяющий веб-приложениям устанавливать соединения с веб-серверами и использовать двунаправленные сетевые каналы на основе потоков вместо модели сетевых взаимодействий типа запрос/ответ, поддерживаемой с помощью объекта

<b>XMLHttpRequest</b>
.

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

22.1. Геопозиционирование

Прикладной интерфейс объекта

<b>Geolocation</b>
(і http://www.iv3.org/TR/geolocation-API/) позволяет программам на языке JavaScript запрашивать у броузера географическое местонахождение пользователя. Такие приложения могут отображать карты, маршруты и другую информацию, связанную с текущим местонахождением пользователя. При этом, конечно, возникает важная проблема соблюдения тайны частной информации, поэтому броузеры, поддерживающие прикладной интерфейс
<b>Geolocation</b>
, всегда запрашивают у пользователя подтверждение, прежде чем передать JavaScript-программе информацию о физическом местонахождении пользователя.

Броузеры с поддержкой интерфейса

<b>Geolocation</b>
определяют свойство
<b>navigator.geolocation</b>
. Это свойство ссылается на объект с тремя методами:

<b>navigator.geolocation.getCurrentPosition()</b>

Запрашивает текущее географическое местонахождение пользователя.

<b>navigator.geolocation.watchPosition()</b>

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

<b>navigator.geolocation.clearWatch()</b>

Останавливает слежение за местонахождением пользователя. В аргументе этому методу следует передавать число, возвращаемое соответствующим вызовом метода

<b>watchPosition()</b>
.

В устройствах, включающих аппаратную поддержку GPS, имеется возможность определять местонахождение с высокой степенью точности с помощью устройства GPS. Однако чаще информация о местонахождении поступает из Всемирной паутины. Если броузер отправит ІР-адрес специализированной веб-службе, она в большинстве случаев сможет определить (на основе информации о поставщиках услуг Интернета), в каком городе находится пользователь (и рекламодатели часто пользуются этой возможностью, реализуя определение местонахождения на стороне сервера). Броузер часто в состоянии получить еще более точную информацию о местонахождении, запросив у операционной системы список ближайших беспроводных сетей и силы их сигналов. Затем эта информация отправляется веб-службе, которая позволяет вычислить местонахождение с большой точностью (обычно с точностью до микрорайона в городе).

Эти технологии определения географического местонахождения связаны либо с обменом данными по сети, либо с взаимодействием с несколькими спутниками, поэтому прикладной интерфейс объекта

<b>Geolocation</b>
является асинхронным: методы
<b>getCurrentPosition()</b>
и
<b>watchPosition()</b>
возвращают управление немедленно, но они принимают функцию, которая будет вызвана броузером, когда он определит местонахождение пользователя (или когда местонахождение изменится). В простейшем случае запрос местонахождения выглядит так:

<b>navigator.geolocation.getCurrentPosition(function(pos) {</b>