MDN wants to learn about developers like you: https://qsurvey.mozilla.com/s3/MDN-dev-survey

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

Путешествие по истории

Перемещайтесь вперед и назад по истории, используя методы back(), forward() и go().

Передвижение вперёд и назад

Чтобы переместиться назад, сделайте:

window.history.back();

Это будет действовать так же, как если бы пользователь нажал на кнопку Назад на панели инструментов браузера.

Похожим образом, вы можете перемещаться вперед (как если бы пользователь нажал на кнопку Вперед), так:

window.history.forward();

Перемещение на определенный момент в истории

Вы можете использовать метод go(), чтобы загрузить конкретную страницу из истории сессии, определяемую относительной позицией к текущей странице (относительный показатель текущей страницы равен 0).

Переместиться на страницу назад (эквивалент back()):

window.history.go(-1);

Вперед на страницу(или вызвав forward()):

window.history.go(1);

Кроме того, вы можете двигаться вперед на 2 страницы, передавая 2, и так далее.

Вы можете определить количество страниц в стеке истории, посмотрев свойство length:

var numberOfEntries = window.history.length;
Замечание: Internet Explorer поддерживает передачу URL в go(); это не стандартизировано и не поддерживается в Gecko.

Добавление и изменение записей истории

В HTML5 были представлены методы history.pushState() и history.replaceState(), которые позволяют добавлять и изменять записи истории, соответственно. Эти методы работают вместе с событием window.onpopstate.

Используя history.pushState() можно изменить referrer, который будет использоваться в HTTP заголовке referrer для XMLHttpRequest объектов. Referrer будет URL документа, в окне которого создали объект XMLHttpRequest.

Пример

Представьте страницу http://mozilla.org/foo.html, которая выполняет следующий JavaScript:

var stateObj = { foo: "bar" };
history.pushState(stateObj, "page 2", "bar.html");

В этом случае адресная строка станет показывать http://mozilla.org/bar.html, но браузер не будет загружать страницу bar.html и даже проверять существует ли она.

Предположим, затем пользователь перешел на http://google.com, а затем кликнул Назад. В этом случае URL отобразится как http://mozilla.org/bar.html, а на странице произойдет событие popstate, тогда объект состояния будет содержать копию stateObj. Сама страница будет выглядеть как foo.html, хотя страница могла изменить своё содержание из-за события popstate.

Если мы опять нажмём назад, URL изменится на http://mozilla.org/foo.html, а в документе снова произойдёт событие popstate, в этот раз объект состояния будет пуст. Как видим, возвращаясь мы не изменяем содержимое документа, хотя документ может обновить содержимое сам после получения события popstate.

Метод pushState()

pushState() принимает три параметра: объект состояния, заголовок (сейчас игнорируется) и необязательный URL. Давайте рассмотрим каждый из этих трех параметров более детально:

  • объект состояния — JavaScript объект, ассоциированный с новой записью истории, созданной pushState(). Всякий раз, когда пользователь переходит к новому состоянию, происходит событие popstate, и свойство события state содержит копию объекта записи истории.

    Объект состояния может быть всем, что может сериализироваться. Так как Firefox сохраняет его на диск пользователя, он может быть восстановлен, после того, как пользователь перезапустит браузер. Мы наложили ограничение на этот объект в 640КБ. Если вы передадите больший объект в pushState(), метод бросит исключение. Если вам нужно больше места используйте sessionStorage и/или localStorage.

  • заголовок — Firefox в данный момент игнорирует этот параметр, хотя может начать использовать его в будущем. Передача пустой строки будет безопасна для следующих реализаций метода. Хотя можете добавить заголовок для состояния, к которому вы направляетесь.

  • URL —  URL новой записи истории. Заметьте, что браузер не пытается загрузить этот URL после вызова pushState(), хотя может попытаться позже, например, когда пользователь перезапустит браузер. URL не обязательно быть абсолютным, он может быть относительным текущей страницы. Новый URL должен идти на тот же домен, протокол и порт, иначе, pushState() будет ругаться. Параметр не обязателен, если он не указан будет использоваться URL текущего документа.

Замечание: В Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1) до Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2), передаваемый объект сериарилизовался в JSON. Начиная с Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3), объект обрабатывается по алгоритму структурированного клонирования. Он позволяет передавать более широкое разнообразие объектов.

В определенном смысле, вызов pushState() похож на установку window.location = "#foo", в обоих случаях будет создаваться и активироваться другая запись истории, связанная с текущим документом. Но у pushState() несколько преимуществ:

  • Новый URL может любым в пределах домена, порта и протокола. В отличие от установки window.location, оставляющего тот же document и измеющего только хэш.
  • Вам не нужно менять URL, если не хочется. Тогда как window.location = "#foo"; только создает новую запись истории, если текущий hash не #foo.
  • Вы можете связать произвольные данные с вашим новым элементом истории. При подходе на основе хэшей необходимо кодировать все соответствующие данные в короткую строку.
  • Если title в дальнейшем используется браузерами, эти данные можно удалить (независимо от хеша).

Стоит отметить, что pushState() никогда не вызывает событие hashchange, даже если новый URL отличается только хэшем.

В XUL-документах он создаёт указанный XUL-элемент.

В других документах он создаёт элемент с null namespace URI.

Метод replaceState()

history.replaceState() работает также, как и history.pushState(), но replaceState() заменяет последнюю запись истории вместо создания новой.

replaceState() особенно полезна, когда вы хотите обновить объект состояния или URL текущей записи истории в ответ на действия пользователя.

Замечание: В Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1) до Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2), передаваемый объект сериарилизовался в JSON. Начиная с Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3), объект обрабатывается по алгоритму структурированного клонирования. Он позволяет передавать более широкое разнообразие объектов.

Событие popstate

Popstate событие вызывается каждый раз, когда история изменятся. Если запись истории была создана с помощью вызова pushState или replaceState, свойство state события popstate содержит копию записи истории.

Смотрите пример использования window.onpopstate.

Чтение текущего состояния

Когда страница загружается, объект состояния может быть не null.  Это может произойти в случае, если страница установила объект состояния (используя pushState() или replaceState()), а затем пользователь перезагрузил браузер.  Когда страница перезагружается, произойдёт событие onload, но не popstate.  Однако, если вы прочитаете history.state, то получите объект состояния, который получили бы в случае, если событие popstate произошло.

Вы можете прочитать объект состояния текущей записи истории, без ожидания события popstate используя свойство history.state:

var currentState = history.state;

Пример

Для полного примера AJAX сайта, смотрите: Ajax пример навигации.

Спецификации

Спецификация Статус Комментарий
WHATWG HTML Living Standard
Определение 'History' в этой спецификации.
Живой стандарт Нет изменений по сравнению с HTML5.
HTML5
Определение 'History' в этой спецификации.
Рекомендация Изначальное определение

Поддержка браузерами

Функциональность Chrome Firefox (Gecko) Internet Explorer Opera Safari
replaceState, pushState 5 4.0 (2.0) 10 11.50 5.0
history.state 18 4.0 (2.0) 10 11.50 6.0
Функциональность Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
replaceState, pushState ? ? ? ? ?
history.state ? ? ? ? ?

Смотрите также

Метки документа и участники

Метки: 
 Внесли вклад в эту страницу: zhrivodkin, blackio, russiansoon, an2323, BychekRU, mxxn, fakedous, uleming, lysyi3m
 Обновлялась последний раз: zhrivodkin,