Управление историей для пользы и развлечения. Введение в HTML5 History API

Using history.pushState() changes the referrer that gets used in the HTTP header for XMLHttpRequest objects created after you change the state. The referrer will be the URL of the document whose window is this at the time of creation of the XMLHttpRequest object.

Example of pushState() method

Suppose http://mozilla.org/foo.html executes the following JavaScript:

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

This will cause the URL bar to display http://mozilla.org/bar.html , but won"t cause the browser to load bar.html or even check that bar.html exists.

Suppose now that the user navigates to http://google.com, then clicks the Back button. At this point, the URL bar will display http://mozilla.org/bar.html and history.state will contain the stateObj . The popstate event won"t be fired because the page has been reloaded. The page itself will look like bar.html.

If we click Back again, the URL will change to http://mozilla.org/foo.html , and the document will get a popstate event, this time with a null state object. Here too, going back doesn"t change the document"s contents from what they were in the previous step, although the document might update its contents manually upon receiving the popstate event.

The pushState() method

pushState() takes three parameters: a state object, a title (which is currently ignored), and (optionally) a URL. Let"s examine each of these three parameters in more detail:

    state object - The state object is a JavaScript object which is associated with the new history entry created by pushState() . Whenever the user navigates to the new state, a popstate event is fired, and the state property of the event contains a copy of the history entry"s state object.

    The state object can be anything that can be serialized. Because Firefox saves state objects to the user"s disk so they can be restored after the user restarts the browser, we impose a size limit of 640k characters on the serialized representation of a state object. If you pass a state object whose serialized representation is larger than this to pushState() , the method will throw an exception. If you need more space than this, you"re encouraged to use sessionStorage and/or localStorage .

    title - Firefox currently ignores this parameter, although it may use it in the future. Passing the empty string here should be safe against future changes to the method. Alternatively, you could pass a short title for the state to which you"re moving.

    URL - The new history entry"s URL is given by this parameter. Note that the browser won"t attempt to load this URL after a call to pushState() , but it might attempt to load the URL later, for instance after the user restarts the browser. The new URL does not need to be absolute; if it"s relative, it"s resolved relative to the current URL. The new URL must be of the same origin as the current URL; otherwise, pushState() will throw an exception. This parameter is optional; if it isn"t specified, it"s set to the document"s current URL.

Note: In Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1) through Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2), the passed object is serialized using JSON. Starting in Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3), the object is serialized using the structured clone algorithm . This allows a wider variety of objects to be safely passed.

In a sense, calling pushState() is similar to setting window.location = "#foo" , in that both will also create and activate another history entry associated with the current document. But pushState() has a few advantages:

  • The new URL can be any URL in the same origin as the current URL. In contrast, setting window.location keeps you at the same document only if you modify only the hash.
  • You don"t have to change the URL if you don"t want to. In contrast, setting window.location = "#foo"; creates a new history entry only if the current hash isn"t #foo .
  • You can associate arbitrary data with your new history entry. With the hash-based approach, you need to encode all of the relevant data into a short string.
  • If title is subsequently used by browsers, this data can be utilized (independent of, say, the hash).

Note that pushState() never causes a hashchange event to be fired, even if the new URL differs from the old URL only in its hash.

Specifications Specification Status Comment
HTML Living Standard
Living Standard No change from HTML5 .
HTML5
The definition of "History" in that specification.
Recommendation Initial definition.
Browser compatibility

The compatibility table on this page is generated from structured data. If you"d like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.

Update compatibility data on GitHub

Desktop Mobile Chrome Edge Firefox Internet Explorer Opera Safari Android webview Chrome for Android Edge Mobile Firefox for Android Opera for Android Safari on iOS Samsung Internet History back forward go length pushState replaceState scrollRestoration state
Chrome Full support Yes Edge Full support Yes Firefox Full support Yes IE Full support Yes Opera Full support Yes Safari Full support Yes Samsung Internet Android ?
Chrome Full support Yes Edge Full support 12 Firefox Full support Yes IE ? Opera ? Safari ? WebView Android Full support Yes Chrome Android Full support Yes Edge Mobile ? Firefox Android Full support Yes Opera Android ? Safari iOS ? Samsung Internet Android ?
Chrome Full support Yes Edge Full support 12 Firefox Full support Yes IE ? Opera ? Safari ? WebView Android Full support Yes Chrome Android Full support Yes Edge Mobile ? Firefox Android Full support Yes Opera Android ? Safari iOS ? Samsung Internet Android ?
Chrome Full support Yes Edge Full support 12 Firefox Full support Yes IE ? Opera ? Safari ? WebView Android Full support Yes Chrome Android Full support Yes Edge Mobile ? Firefox Android Full support Yes Opera Android ? Safari iOS ? Samsung Internet Android ?
Chrome Full support Yes Edge Full support 12 Firefox Full support Yes IE ? Opera ? Safari ? WebView Android Full support Yes Chrome Android Full support Yes Edge Mobile ? Firefox Android Full support Yes Opera Android ? Safari iOS ? Samsung Internet Android ?
Chrome Full support 5 Edge Full support 12 Firefox Full support 4

Notes

Full support 4

Notes

Notes
IE Full support 10 Opera Full support 11.5 Safari Full support 5 WebView Android Full support Yes Chrome Android Full support Yes Edge Mobile Full support Yes Firefox Android Full support Yes Opera Android Full support Yes Samsung Internet Android ?
Chrome Full support 5 Edge Full support 12 Firefox Full support 4

Notes

Full support 4

Notes

Notes In Firefox 2 through 5, the passed object is serialized using JSON. Starting in Firefox 6, the object is serialized using . This allows a wider variety of objects to be safely passed.
IE Full support 10 Opera Full support 11.5 Safari Full support 5 WebView Android Full support Yes Chrome Android Full support Yes Edge Mobile Full support Yes Firefox Android Full support Yes Opera Android Full support Yes Safari iOS Full support 4.3 Samsung Internet Android ?
Chrome Full support 46 Edge No support No Firefox Full support 46 IE No support No Opera Full support 33 Safari Full support Yes WebView Android No support No Chrome Android Full support 46 Edge Mobile No support No Firefox Android Full support Yes Opera Android Full support Yes Safari iOS Full support Yes Samsung Internet Android ?
Chrome Full support Yes Edge Full support 12 Firefox Full support Yes IE ? Opera ? Safari ? WebView Android Full support Yes Chrome Android Full support Yes Edge Mobile ? Firefox Android Full support Yes Opera Android ? Safari iOS ? Samsung Internet Android ?
Legend Full support Full support No support No support Compatibility unknown Compatibility unknown See implementation notes. See implementation notes.

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

Однако теперь, обе операции доступны благодаря HTML5 History API. Теперь мы можем создавать одностраничные приложения, не применяя значение хеш-функций. Это также позволяет нам создавать приложения благоприятно совместимые с SEO. Кроме того, данная техника позволяет уменьшать трафик - но как?

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

Отправка контента должна осуществляться со стороны сервера.

Браузерная поддержка

На время написания данной статьи HTML5 History API довольно-таки неплохо поддерживается браузерами. Однако, в самом начале скрипта мы создадим проверку. Это позволит проверить браузерную совместимость.

Чтобы определить программным путем, поддерживает ли ваш браузер API, используйте следующую проверку:

Return !!(window.history && history.pushState);

Если вы используете Modernizr, то проверка будет следующей:

If (Modernizr.history) { // History API Supported }

Если ваш браузер не поддерживает History API, то вы можете использовать полизаполнение history.js .

Взаимодействие с историей
  • history.pushState()
  • history.replaceState()
  • С помощью данных функций можно добавлять и обновлять состояние истории. Они работают почти одинаково и принимают один и тот же же набор параметров. В дополнение, можно упоминуть ещё об одной функции: popstate . Чуть позже мы увидим их в действии.

    Функции pushState и replaceState принимают одинаковое число параметров:

    • state строка в формате JSON.
    • title на данный момент игнорируется всеми браузерами поэтому его лучше установить как null.
    • url представляет собой любой электронный адрес. Данное значение будет обновлено в браузере. Нет разницы, существует данный URL или нет. Самое главное, что страница не будет перезагружена.

    Различия между данными методами состоит в том, что pushState добавит новую запись в историю, а replaceState заменит текущее значение. Давай рассмотрим работу данных функций на примере.

    Предположим у нас есть несколько блоков, расположенных в стеке, названные 1 и 2. Так же у нас есть блок 3. Когда мы выполним команду pushState , блок 3 добится в существующий стек. В результате в нём будет 3 блока.

    Теперь представьте ту же ситуацию. При выполнении функции replaceState , блок 2 будет заменён на блок 3. Таким образом количество блоков останется тем же.

    Наглядный пример:

    Метот popstate будет запускаться, при передвижении по истории, используя методы history.go или history.back . В браузерах WebKit команда popstate запускалась бы после события onload , но это не касается Firefox и IE.

    Примеры: HTML

    Click on Links above to see history API usage using pushState method. Home!

    Lorem Ipsum is simply dummy text of the printing and typesetting industry.

    JavaScript

    jQuery("document").ready(function(){ jQuery(".historyAPI").on("click", function(e){ e.preventDefault(); var href = $(this).attr("href"); // Getting Content getContent(href, true); jQuery(".historyAPI").removeClass("active"); $(this).addClass("active"); }); }); // Adding popstate event listener to handle browser back button window.addEventListener("popstate", function(e) { // Get State value using e.state getContent(location.pathname, false); }); function getContent(url, addEntry) { $.get(url) .done(function(data) { // Updating Content on Page $("#contentHolder").html(data); if(addEntry == true) { // Add History Entry using pushState history.pushState(null, null, url); } }); }

    Всем привет.
    Тут проскакивала эта тема, не могу найти.
    Подскажите, пожалуйста - где можно скачать новый XEvil 4.0?

    Очень нужно! (это программа для обхода любой капчи, включая РеКапчу2).
    Отблагодарю Биткоинами!

    Mashalot2017@gmail точка com



    Вы будете удивлены, но это свершившийся факт,
    о котором пока мало кто знает: СМИ молчат, ушалости не желая этого замечать.


    Распознавание капчи Google (ReCaptcha-1, ReCaptcha-2), Facebook, Yandex, VKontakte, Captcha Com и свыше 8400 тысяч других типов!

    Подробности на официальном сайте XEvil.Net, есть бесплатная демо-версия.

    См. YouTube "XEvil ReCaptcha2"

    Вы будете удивлены, но это свершившийся факт,
    о котором пока мало кто знает: СМИ молчат, ушалости не желая этого замечать.

    XEvil 4.0 - революционное приложение, способное обходить практически любую антибот-защиту.
    Распознавание капчи Google (ReCaptcha-1, ReCaptcha-2), Facebook, Yandex, VKontakte, Captcha Com и свыше 8400 тысяч других типов!

    Подробности на официальном сайте XEvil.Net, есть бесплатная демо-версия.

    См. YouTube "XEvil ReCaptcha2"

    Вы будете удивлены, но это свершившийся факт,
    о котором пока мало кто знает: СМИ молчат, ушалости не желая этого замечать.

    XEvil 4.0 - революционное приложение, способное обходить практически любую антибот-защиту.
    Распознавание капчи Google (ReCaptcha-1, ReCaptcha-2), Facebook, Yandex, VKontakte, Captcha Com и свыше 8400 тысяч других типов!

    Подробности на официальном сайте XEvil.Net, есть бесплатная демо-версия.

    См. YouTube "XEvil ReCaptcha2"

    XEvil 4.0 - революционное приложение, способное обходить практически любую антибот-защиту.
    Распознавание капчи Google (ReCaptcha-1, ReCaptcha-2), Facebook, Yandex, VKontakte, Captcha Com и свыше 8400 тысяч других типов!

    Подробности на официальном сайте XEvil.Net, есть бесплатная демо-версия.

    См. YouTube "XEvil ReCaptcha2"

    XEvil 4.0 - принципиально новый софт, способный обходить практически любую антибот-защиту.
    Распознавание капчи Google (ReCaptcha-1, ReCaptcha-2), Facebook, Yandex, VKontakte, Captcha Com и свыше 8400 тысяч других типов!

    Подробности на официальном сайте XEvil.Net, есть бесплатная демо-версия.

    См. YouTube "XEvil ReCaptcha2"

    XEvil 4.0 - революционное приложение, способное обходить практически любую антибот-защиту.
    Распознавание капчи Google (ReCaptcha-1, ReCaptcha-2), Facebook, Yandex, VKontakte, Captcha Com и свыше 8400 тысяч других типов!

    Подробности на официальном сайте XEvil.Net, есть бесплатная демо-версия.

    См. YouTube "XEvil ReCaptcha2"

    Перевод: Влад Мержевич

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

    API истории HTML5 представляет собой стандартизированный способ манипулировать историей браузера через скрипт. Часть этого API - навигация по истории - была доступна в предыдущих версиях HTML. Новые части в HTML5 включают способ добавления записей в историю браузера, чтобы заметно изменить URL в адресной строке браузера (без переключения обновления страницы) и события, которые запускаются, когда эти записи удаляются из стека пользователя нажатием кнопки браузера «Назад». Это означает, что URL в адресной строке браузера может продолжать выполнять свою работу как уникальный идентификатор для текущего ресурса, даже в приложениях нагруженными скриптами, которые не всегда выполняют полное обновление страницы.

    Почему

    Почему бы вам вручную не изменять адресную строку браузера? В конце концов, простая ссылка может перейти на новый URL, этот способ работал в течение 20 лет. И он будет продолжать работать таким образом. Этот API не пытается подорвать веб. Как раз наоборот. В последние годы веб-разработчики нашли новые и увлекательные способы подрыва веба без какой-либо помощи со стороны новых стандартов. API истории HTML5 на самом деле предназначен для того, чтобы адреса продолжали быть полезными в веб-приложениях нагруженными скриптами.

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

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

    API истории HTML5 позволяет сделать это. Вместо запуска полного обновления страницы вы можете использовать скрипт, который, в сущности, скачивает половину страницы. Эта иллюзия довольно хитрая для воплощения и потребует некоторых усилий с вашей стороны. Вы внимательно следите?

    Скажем, у вас есть две страницы, страница А и страница Б. Две страницы на 90% идентичны и только 10% содержимого страниц различается. Пользователь переходит на страницу А, затем пытается перейти к странице Б. Но вместо запуска полного обновления страницы, вы прерываете эту навигацию и совершаете следующие шаги вручную:

  • Загружаете 10% из страницы Б, которые отличаются от страницы А (возможно с помощью XMLHttpRequest ). Это потребует некоторых серверных изменения в вашем веб-приложении. Вам нужно будет написать код, который возвращает только 10% от страницы Б, отличающихся от страницы А. Это может быть скрытый URL или параметр запроса, невидимый конечному пользователю.
  • Обмениваете измененное содержание (с использованием innerHtml или других методов DOM). Вам также может понадобиться сбросить любой обработчик событий для элемента внутри обменного содержания.
  • Обновляете строку браузера с адресом страницы Б, используя особый метод из API истории HTML5, что я вам покажу в данный момент.
  • В конце этой иллюзии (если выполнена правильно) браузер получает DOM идентичный странице Б, как если бы вы перешли страницу Б напрямую. Строка браузера будет содержать URL, который идентичен странице Б, как если бы вы перешли на страницу Б напрямую. Но в действительности вы не переходили на страницу Б и не делали полного обновления страницы. Это иллюзия. Но поскольку «компилированная» страница выглядит так же, как страница Б и имеет тот же URL, что у страницы Б, пользователь ни за что не заметит разницы (и не оценит ваш тяжелый труд по микроуправлению этого опыта).

    Как

    API истории HTML5 это просто горстка методов объекта window.history плюс одно событие в объекте window . Вы можете использовать их, чтобы определить поддержку для API истории. Поддержка в настоящее время ограничивается самыми последними версиями некоторых браузеров, помещая эти методы прямо в лагерь «прогрессивного улучшения».

    Поддержка истории
    IE Firefox Safari Chrome Opera iPhone Android
    9.0 4.0+ 5.0+ 8.0+ 11.10 4.2.1+ -

    Dive into dogs это простой, но не тривиальный пример использования API истории HTML5. Он демонстрирует типичный шаблон: большая статья со связанной встроенной фотогалереей. В поддерживаемых браузерах нажатие на ссылки Next и Previous в фотогалерее будет обновлять фото в том же месте и обновлять URL в адресной строке браузера без запуска полного обновления страницы. В неподдерживаемых браузерах - или в действительности поддерживаемых браузерах, где пользователь отключил скрипты - ссылки просто работают как обычные ссылки, переводя вас на новую страницу с полным ее обновлением.

    Это поднимает важный момент.

    Профессор Маркап говорит

    Если ваше веб-приложение потерпит неудачу в браузерах с отключенными скриптами, собака Якоба Нильсена придет к вам домой и насрет на ваш ковер.

    Давайте обратимся к демо и посмотрим, как оно работает. Это соответствующий код для одной фотографии.

    Html">Next > Fer, 1972

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

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

    Function setupHistoryClicks() { addClicker(document.getElementById("photonext")); addClicker(document.getElementById("photoprev")); }

    Это функция addClicker() . Она берет элемент и добавляет обработчик click . С этим обработчиком получается интереснее.

    Function addClicker(link) { link.addEventListener("click", function(e) { swapPhoto(link.href); history.pushState(null, null, link.href); e.preventDefault(); }, false); }

    Функция swapPhoto() выполняет первые два шага из трех нашей трехэтапной иллюзии. В первой половине функции swapPhoto() берется часть адреса ссылки - casey.html, adagio.html и др. - и строится URL в скрытой странице, которая содержит только код, требуемый для следующей фотографии.

    Function swapPhoto(href) { var req = new XMLHttpRequest(); req.open("GET", "gallery/" + href.split("/").pop(), false); req.send(null);

    Этот образец разметки возвращает http://diveintohtml5.info/examples/history/gallery/casey.html (вы можете проверить это в браузере, вставив URL напрямую).

    Html">Next > Casey, 1984

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

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

    If (req.status == 200) { document.getElementById("gallery").innerHTML = req.responseText; setupHistoryClicks(); return true; } return false; }

    Также обратите внимание на вызов setupHistoryClicks() . Это необходимо, чтобы сбросить пользовательский обработчик событий click для новых вставленных ссылок. Установка innerHtml стирает любые следы старых ссылок и их обработчиков событий.

    Теперь давайте вернемся к функции addClicker() . После успешной смены фотографии есть еще один шаг в нашей трехэтапной иллюзии: установить URL в адресной строке браузера без перезагрузки страницы.

    History.pushState(null, null, link.href);

    Функция history.pushState() содержит три параметра:

  • state может быть любой структурой данных JSON. Он передается обратно обработчику событий popstate , о котором вы узнаете чуть позже. Нам не нужно следить за state в этой демонстрации, так что я оставил его как null .
  • title может быть любой строкой. Этот параметр в настоящее время не используется основными браузерами. Если вы хотите установить заголовок страницы, вы должны сохранить его в аргументе state и установить вручную в popstate .
  • url может быть, ну, любым URL. Это URL, который должен отображаться в адресной строке браузера.
  • Вызов history.pushState немедленно изменит URL в адресной строке браузера. Так это конец иллюзии? Ну, не совсем. Нам еще нужно сказать о том, что происходит, когда пользователь нажимает важную кнопку «Назад».

    Обычно, когда пользователь переходит на новую страницу (с полным обновлением страницы), браузер помещает новый URL в стек истории, загружает и отрисовывает новую страницу. Когда пользователь нажимает кнопку «Назад», браузер сдвигает одну страницу в стеке истории и перерисовывает предыдущую страницу. Но что происходит теперь, когда вы сделали короткое замыкание этой навигации, чтобы избежать полного обновления страницы? Итак, вы поддельно «двинулись вперед» на новый URL, так что теперь необходимо также поддельно «двинуться назад» к предыдущему URL. И ключ к поддельному «двинуться назад» в событии popstate .

    Window.addEventListener("popstate", function(e) { swapPhoto(location.pathname); }, false)

    После того как вы использовали функцию history.pushState() для смещения поддельного URL в стеке истории браузера, когда пользователь нажимает кнопку «Назад», в браузере срабатывает событие popstate на объекте window . Это ваш шанс завершить иллюзию раз и навсегда. Потому что не достаточно сделать исчезновение чего-то, вы также должны вернуть его.

    В этой демонстрации «вернуть его» так же просто, как смена исходной фотографии, которую мы делаем с помощью вызова swapPhoto() в текущей локации. К тому времени popstate будет вызван, URL отображается в адресной строке браузера как измененный на предыдущий URL. Кроме того, глобальное свойство location уже был обновлено с предыдущим URL.

    Чтобы помочь вам представить это, давайте пройдем по шагам через всю иллюзию от начала до конца:

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

    Великий и могучий Интернет прочно вошел в нашу жизнь и развивается не только высокими темпами, но и часто неисповедимыми путями. Именно поэтому многие блестящие новаторские решения вынужденно дожидаются лучших времен, т.к. не могут в полной мере функционировать в неспокойном океане сети, где браузеры, воюя за превосходство либо устанавливают свои правила, либо игнорируют чужие. Не обошла такая участь и замечательную API истории HTML5. Речь в этой статье пойдет о миниатюрной и простой библиотеке History, российского программиста Дмитрия Пахтинова, которая позволяет пользоваться всеми замечательными способностями History API без опасения быть отвергнутым старыми и/или капризными браузерами.



    Кратко напомню, что History API это небольшой набор методов JavaScript объекта window.history, которые позволяет управлять историей браузера, например записывать в историю требуемые адреса - history.pushState(), реагировать на события нажатия кнопок браузера "Вперед" и "Назад" - событие popstate, переписывать текущее состояние - history.replaceState() и т.д. Весь этот простой набор, однако позволяет разработчику создавать ультрасовременные динамические сайты, на которых подгрузка контента происходит без перезагрузки страницы, но при этом по доброй старой традиции меняется запись в адресной строке, заполняется история и поддерживается полноценная навигация по пройденным, а на самом деле - динамически подгруженным страницам.

    Такая структура очень удобна и современна, наиболее популярные сайты (читай социальные сети, и даже не будем показывать пальцем, какие) успешно взяли ее на вооружение. Страница не мелькает и не дергается при загрузке новой информации, как это обычно происходит при перезагрузке, продолжает работать запущенный медиа-плеер, или иной процесс на странице. Повторяю, это достигается отменой перезагрузки страницы при переходе по ссылкам, и манипуляцией адресной строкой и историей из JavaScript. И все бы было чудесно, но беде случилась все та же - не поддержка History API старыми браузерами. В результате, разработчикам приходилось использовать громоздкие решения сторонних библиотек и прочие костыли. Но теперь, я с удовольствием сообщаю, что проблеме пришел конец в лице программиста devote и его библиотеки history.js.

    Библиотека history.js по сути просто позволяет полноценно пользоваться способностями History API без опаски быть "непонятым" старыми браузерами и их пользователями. Так что если вы уважающий себя разработчик и желаете писать сайты по последнему слову техники, то можете смело за это браться. Библиотека history.js тестирована на таких старых браузерах как Opera 9+, FireFox3+, Internet Explorer 7+. Основные преимущества библиотеки в том, что она миниатюрна и полностью адаптивна. History.js использует стандартные методы History API, и при необходимости даже может быть легко удалена из сайта безо всякого нарушения его функциональности.

    Библиотека history.js очень проста в применении.

    Подключение библиотеки может сопровождаться внесением трех параметров:

    • basepath - базовый путь к сайту, по умолчанию имеет значение корня "/".
    • redirect - преобразование ссылок, по умолчанию true(включено).
    • type - строка начала якоря, по умолчанию ничего не подставляет

    Первый параметр необходим, если сайт помещен не в корневую директорию домена, а в одну из внутренних папок, тогда часть пути указанная в basepath будет дописываться в начало всех ссылок, обеспечивая корректные переходы Вторые два параметра служат для придания эстетической красоты ссылкам: redirect - убирает из ссылок символ якоря #, который необходим для совместимости со старыми браузерами. Дело в том, что в старых браузерах невозможно поменять ссылку в адресной строке не перезагрузив при этом страницу, и чтобы обойти это досадное свойство стали использовать метод якоря, который по спецификации ссылается на некое место текущей страницы, и не допускает обновления. А вот новые браузеры, знающие, что такое history.pushState(), не нуждаются в этом костыле, и параметр redirect умеет "очищать" ссылку для них, но добавлять символ # в адрес тем, кому history.pushState() не ведом. type - также служит для причесывания вида ссылок в строке, например чтобы якорь начинался со знака слеш.

    Параметры basepath, redirect и type можно комбинировать при вызове:

    History-1.2.6.min.js?type=/&redirect=fal se&basepath=/pathtosite/

    // порядок опций не имеет значение.

    Далее, я не стану вдаваться в подробности динамической загрузки контента, т.к. методы AJAX выходят далеко за рамки данной статьи. Основная идея состоит в том, чтобы при клике по ссылке, отменить перезагрузку (return false), подгрузить нужный контент (ajax) и записать путь в историю (pushState). Но прежде всего, нужно повесить обработчик на событие popstate, реагирующее на нажатие кнопок браузера "Вперед" и "Назад". Так разработчик описывает эту процедуру:

    на чистом JS:


    Window.onload = function() {

    // функция для ссылок обрабатывается при клике на ссылку

    Function handlerAnchors() {

    History.pushState(null, null, this.href);

    // не даем выполнить действие по умолчанию

    Return false;

    Var anchors = document.getElementsByTagName("a");

    For(var i = 0; i < anchors.length; i++) {

    Anchors[ i ].onclick = handlerAnchors;

    // вешаем событие на popstate которое срабатывает при нажатии back/forward в браузере

    Window.onpopstate = function(e) {

    // получаем нормальный объект Location

    /* заметьте, это единственная разница при работе с данной библиотекой,

    * так как объект document.location нельзя перезагрузить, поэтому

    * библиотека сформированный Location объект посылает через объект event

    Var returnLocation = e.location || document.location;

    // тут можете вызвать подгруздку данных и т.п.

    // просто сообщение

    Alert("Мы вернулись на страницу со ссылкой " + returnLocation.href);

    My Link



    
    Top