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

<b>history.go(-2); // Переход назад на 2 элемента, как если бы пользователь </b>

<b>                // дважды щелкнул на кнопке Back (Назад)</b>

Если окно содержит дочерние окна (такие как элементы

<b>&lt;iframe&gt;</b>
- подробности смотрите в разделе 14.8.2), истории посещений в дочерних окнах хронологически чередуются с историей посещений в главном окне. То есть вызов
<b>history.back()</b>
(например) в главном окне может вызвать переход назад, к ранее отображавшемуся документу, в одном из дочерних окон, оставив главное окно в текущем состоянии.

Современные веб-приложения способны динамически изменять содержимое страницы без загрузки нового документа (примеры приводятся в главах 15 и 18). Приложениям, действующим подобным образом, может потребоваться предоставить пользователям возможность использовать кнопки

<b>Back</b>
и
<b>Forward</b>
для перехода между этими динамически созданными состояниями приложения. Стандарт HTML5 определяет два способа реализации, и оба они описываются в разделе 22.2.

Управление историей посещений до появления стандарта HTML5 представляло собой довольно сложную задачу. Приложение, управляющее собственной историей, должно было создавать новые записи в списке истории окна, связывать эти записи с информацией о состоянии, определять момент щелчка на кнопке

<b>Back</b>
, чтобы перейти к другой записи в списке, получать информацию, связанную с этой записью и воссоздавать предыдущее состояние приложения в соответствии с этой информацией. Один из приемов реализации такого поведения опирается на использование скрытого элемента
<b>&lt;iframe&gt;</b>
, в котором сохраняется информация о состоянии и создаются записи в списке истории просмотра. Чтобы создать новую запись, в этот скрытый фрейм динамически записывается новый документ, с помощью методов
<b>open()</b>
и
<b>write()</b>
объекта
<b>Document</b>
(раздел 15.10.2). Документ должен включать всю информацию, необходимую для воссоздания соответствующего состояния приложения. Когда пользователь щелкнет на кнопке
<b>Back</b>
, содержимое скрытого фрейма изменится. До появления стандарта HTML5 не предусматривалось никаких событий, которые извещали бы об этом изменении, поэтому, чтобы определить момент щелчка на кнопке
<b>Back</b>
, приходилось использовать функцию
<b>setlnterval()</b>
(раздел 14.1) и с ее помощью 2-3 раза в секунду проверять наличие изменений в скрытом фрейме.

Однако на практике разработчики, когда требуется реализовать подобное управление историей просмотра, предпочитают использовать готовые решения. Многие фреймворки JavaScript включают такие решения. Например, для библиотеки jQuery существует расширение history. Существуют также автономные библиотеки управления историей. Например, одной из наиболее популярных является библиотека RSH (Really Simple History - действительно простое управление историей). Найти ее можно по адресу http://code.google.eom/p/reallysimplehistory/. В разделе 22.2 описывается, как реализуется управление историей в HTML5.

14.4. Информация о броузере и об экране

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

<b>navigator</b>
и
<b>screen</b>
объекта
<b>Window</b>
. Эти свойства ссылаются, соответственно, на объекты
<b>Navigator</b>
и
<b>Screen</b>
, содержащие информацию, которая дает возможность подстроить поведение сценария под существующее окружение.

14.4.1. Объект Navigator

Свойство

<b>navigator</b>
объекта
<b>Window</b>
ссылается на объект
<b>Navigator</b>
, содержащий общую информацию о номере версии и о производителе броузера. Объект
<b>Navigator</b>
назван «в честь» броузера Netscape Navigator, но он также поддерживается во всех других броузерах. (Кроме того, IE поддерживает свойство
<b>clientlnformation</b>
как нейтральный синоним для
<b>navigator</b>
. К сожалению, другие броузеры свойство с таким именем не поддерживают.)

В прошлом объект

<b>Navigator</b>
обычно использовался сценариями для определений типа броузера - Internet Explorer или Netscape. Однако такой подход к определению типа броузера сопряжен с определенными проблемами, т. к. требует постоянного обновления с появлением новых броузеров или новых версий существующих броузеров. Ныне более предпочтительным считается метод на основе проверки функциональных возможностей (раздел 13.4.3). Вместо того чтобы делать какие-либо предположения о броузерах и их возможностях, гораздо проще прямо проверить наличие требуемой функциональной возможности (например, метода или свойства).

Однако иногда определение типа броузера может представлять определенную ценность. Один из таких случаев - возможность обойти ошибку, свойственную определенному типу броузера определенной версии. Объект

<b>Navigator</b>
имеет четыре свойства, предоставляющих информацию о версии работающего броузера, и вы можете использовать их для определения типа броузера:

<b>appName</b>

Название веб-броузера. В IE это строка «Microsoft Internet Explorer». В Firefox значением этого свойства является строка «Netscape». Для совместимости с существующими реализациями определения типа броузера значением этого свойства в других броузерах часто является строка «Netscape».

<b>appVersion</b>

Обычно значение этого свойства начинается с номера версии, за которым следует другая информация о версии броузера и его производителе. Обычно в начале строки указывается номер 4.0 или 5.0, свидетельствующий о совместимости с четвертым или пятым поколением броузеров. Формат строки в свойстве

<b>appVersion</b>
не определяется стандартом, поэтому невозможно организовать разбор этой строки способом, не зависящим от типа броузера.

<b>userAgent</b>

Строка, которую броузер посылает в http-заголовке USER-AGENT. Это свойство обычно содержит ту же информацию, что содержится в свойстве

<b>appVersion</b>
, а также может включать дополнительные сведения. Как и в случае со свойством
<b>appVersion</b>
, формат представления этой информации не стандартизован. Поскольку это свойство содержит больше информации, именно оно обычно используется для определения типа броузера.