Управление историей просмотров. Как проверить, может ли пользователь вернуться в историю браузера или нет
16
ответов
Короткий ответ: вы не можете.
Технически существует точный способ проверки подлинности:
History.previous
Однако это не сработает.
Проблема в том, что в большинстве браузеров это считается нарушением безопасности и обычно просто возвращает undefined
.. p >
History.length
Это свойство, которое другие предложили... Однако
длина не работает полностью, поскольку в истории вы не указываете , где
. Кроме того, он не всегда начинается с того же номера. Например, браузер, не настроенный на целевую страницу, начинается с 0, тогда как другой браузер, который использует страницу перевязки, начинается с 1.
History.back();
History.go(-1);
и он просто ожидал, что если вы не сможете вернуться, то щелчок по ссылке ничего не делает.
Мой код позволяет браузеру вернуться на одну страницу, и если это не удается, он загружает резервный URL-адрес. Он также обнаруживает изменения хэштегов.
Если кнопка "Назад" недоступна, резервный url будет загружен через 500 мс, поэтому браузер имеет достаточно времени для загрузки предыдущей страницы. Загрузка обратного URL сразу после window.history.go(-1); приведет к тому, что браузер будет использовать резервный URL-адрес, потому что js script еще не остановился.
Function historyBackWFallback(fallbackUrl) {
fallbackUrl = fallbackUrl || "/";
var prevPage = window.location.href;
window.history.go(-1);
setTimeout(function(){
if (window.location.href == prevPage) {
window.location.href = fallbackUrl;
}
}, 500);
}
это похоже на трюк:
Function goBackOrClose() {
window.history.back();
window.close();
//or if you are not interested in closing the window, do something else here
//e.g.
theBrowserCantGoBack();
}
Вызов history.back(), а затем window.close(). Если браузер сможет вернуться в историю, он не сможет перейти к следующему утверждению. Если он не сможет вернуться, он закроет окно.
Однако, обратите внимание, что если страница была достигнута, набрав URL-адрес, то firefox не позволит script закрыть окно.
Вы не можете напрямую проверить, доступна ли кнопка "Назад". Вы можете посмотреть history.length>0 , но это будет верно, если страницы впереди и на текущей странице. Вы можете только быть уверены, что кнопка "Назад" непригодна, если history.length===0 .
Если это не достаточно хорошо, обо всем, что вы можете сделать, это позвонить history.back() и, если ваша страница все еще загружена, кнопка "Назад" недоступна! Конечно, это означает, что если кнопка "Назад" доступна, вы просто перешли от страницы. Вам не разрешено отменять навигацию в onunload , поэтому обо всем, что вы можете сделать, чтобы остановить обратное на самом деле, это вернуть что-то из onbeforeunload , что приведет к появлению большого раздражающего приглашения. Это не стоит.
На самом деле обычно это действительно плохая идея делать что-либо с историей. Навигация по истории - для браузера Chrome, а не для веб-страниц. Добавление ссылок "вернуться" обычно вызывает больше недоумения пользователей, чем это стоит.
Вот как я это сделал.
Я использовал событие "beforeunload"
, чтобы установить логическое значение. Затем я установил тайм-аут, чтобы посмотреть, запускается ли "beforeunload".
Кажется, он работает в основных браузерах (тестировал FF, Chrome, IE11 до сих пор).
В моих проектах есть фрагмент:
Function back(url) {
if (history.length > 2) {
// if history is not empty, go back:
window.History.back();
} else if (url) {
// go to specified fallback url:
window.History.replaceState(null, null, url);
} else {
// go home:
window.History.replaceState(null, null, "/");
}
}
К вашему сведению: я использую History.js для управления историей браузера.
Зачем сравнивать history.length с номером 2?
Потому что стартовая страница Chrome считается первым элементом в истории браузера.
Существует несколько возможностей history.length и поведения пользователя:
Пользователь открывает новую пустую вкладку
в браузере, а затем запускает страницу. history.length = 2 и мы хотим отключить back() в этом случае, потому что пользователь перейдет на пустую вкладку.
Пользователь открывает страницу в новой вкладке
, щелкая ссылку где-то раньше. history.length = 1 и снова мы хотим отключить метод back() .
И, наконец, пользователь попадает на текущую страницу после перезагрузки нескольких страниц
. history.length > 2 и теперь back() можно включить.
Примечание:
я пропускаю случай, когда пользователь попадает на текущую страницу после нажатия на ссылку с внешнего сайта без target="_blank" .
Примечание 2:
document.referrer пуст, когда вы открываете веб-сайт, вводя его адрес, а также когда веб-сайт использует ajax для загрузки подстраниц, поэтому я прекратил проверку этого значения в первом случае.
history.length бесполезен, так как он не показывает, может ли пользователь вернуться в историю.
Также разные браузеры используют начальные значения 0 или 1 - это зависит от браузера.
Рабочее решение - использовать событие $(window).on("beforeunload" , но я не уверен, что он будет работать, если страница загружается через ajax и использует pushState для изменения истории окна.
Итак, я использовал следующее решение:
Var currentUrl = window.location.href;
window.history.back();
setTimeout(function(){
// if location was not changed in 100 ms, then there is no history back
if(currentUrl === window.location.href){
// redirect to site root
window.location.href = "/";
}
}, 100);
Будьте осторожны с window.history.length потому что оно также содержит записи для window.history.forward()
Таким образом, вы можете иметь window.history.length с более чем 1 записями, но без записей истории. Это означает, что ничего не произойдет, если вы запустите window.history.back()
Я придумал следующий подход. Он использует событие onbeforeunload, чтобы определить, покидает ли браузер страницу или нет. Если в определенный промежуток времени он не будет перенаправлен на резервную копию.
Var goBack = function goBack(fallback){
var useFallback = true;
window.addEventListener("beforeunload", function(){
useFallback = false;
});
window.history.back();
setTimeout(function(){
if (useFallback){ window.location.href = fallback; }
}, 100);
}
Вы можете вызвать эту функцию, используя goBack("fallback.example.org") .
window.location.pathname выдаст вам текущий URI. Например, https://domain/question/1234/i-have-a-problem выдаст /question/1234/i-have-a-problem . См. Документацию о window.location
Затем вызов функции split() даст нам все фрагменты этого URI. поэтому, если мы возьмем наш предыдущий URI, у нас будет что-то вроде ["", "question", "1234", "i-have-a-problem"] . См. Документацию о String.prototype.split() для получения дополнительной информации.
Вызов filter() здесь для того, чтобы отфильтровать пустую строку, созданную обратной косой чертой. Он будет возвращать только фрагмент URI, длина которого больше 1 (непустая строка). Таким образом, у нас будет что-то вроде ["question", "1234", "i-have-a-question"] . Это можно было бы написать так:
См. Документацию о Array.prototype.filter() и назначении Destructuring для получения дополнительной информации.
Теперь, если пользователь пытается вернуться, находясь на https://domain/ , мы не будем запускать оператор if и поэтому не window.history.back() вызывать метод window.history.back() чтобы пользователь оставался на нашем веб-сайте. Этот URL будет эквивалентен который имеет длину 0 , а 0 > 0 - false. Следовательно, молча терпит неудачу. Конечно, вы можете что-то зарегистрировать или выполнить другое действие, если хотите.
"use strict";
function previousPage() {
if (window.location.pathname.split("/").filter(({ length }) => length > 0).length > 0) {
window.history.back();
} else {
alert("You cannot go back any further...");
}
}
Ограничения
Конечно, это решение не будет работать, если браузер не поддерживает History API . Проверьте документацию, чтобы узнать больше об этом, прежде чем использовать это решение.
Перевод: Влад Мержевич
Адресная строка браузера это, пожалуй, наиболее чокнутая часть пользовательского интерфейса в мире. Адреса сайтов есть на рекламных щитах, на поездах и даже на уличных граффити. В сочетании с кнопкой «Назад» - наиболее важной кнопкой в браузере - у вас есть мощный способ двигаться вперед и назад через огромное множество взаимосвязанных ресурсов называемых вебом.
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 в адресной строке браузера без запуска полного обновления страницы. В неподдерживаемых браузерах - или в действительности поддерживаемых браузерах, где пользователь отключил скрипты - ссылки просто работают как обычные ссылки, переводя вас на новую страницу с полным ее обновлением.
Это поднимает важный момент.
Профессор Маркап говорит
Если ваше веб-приложение потерпит неудачу в браузерах с отключенными скриптами, собака Якоба Нильсена придет к вам домой и насрет на ваш ковер.
Давайте обратимся к демо и посмотрим, как оно работает. Это соответствующий код для одной фотографии.
Ничего необычного здесь нет. Фотография это
внутри
Основная функция программы получить каждую из этих ссылок и передать ее функции addClicker()
, которая делает фактическую работу по созданию пользовательского обработчика click
.
Function setupHistoryClicks() {
addClicker(document.getElementById("photonext"));
addClicker(document.getElementById("photoprev"));
}
Функция 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 напрямую).
Выглядит знакомо? Так и должно быть. Это тот же основной код, что у исходной страницы, используемый для отображения первой фотографии.
Вторая половина функции swapPhoto()
выполняет второй шаг нашей трехэтапной иллюзии: вставляет этот новый загруженный код в текущую страницу. Помните, что существует
Также обратите внимание на вызов 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
.
После того как вы использовали функцию history.pushState()
для смещения поддельного URL в стеке истории браузера, когда пользователь нажимает кнопку «Назад», в браузере срабатывает событие popstate
на объекте window
. Это ваш шанс завершить иллюзию раз и навсегда. Потому что не достаточно сделать исчезновение чего-то, вы также должны вернуть его.
В этой демонстрации «вернуть его» так же просто, как смена исходной фотографии, которую мы делаем с помощью вызова swapPhoto()
в текущей локации. К тому времени popstate
будет вызван, URL отображается в адресной строке браузера как измененный на предыдущий URL. Кроме того, глобальное свойство location
уже был обновлено с предыдущим URL.
Чтобы помочь вам представить это, давайте пройдем по шагам через всю иллюзию от начала до конца:
Пользователь загружает http://diveintohtml5.info/examples/history/fer.html , смотрит историю и фотографию Фер.
Вместо перехода на http://diveintohtml5.info/examples/history/casey.html с полной перезагрузкой страницы, пользовательский обработчик click
на элементе
перехватывает щелчок и выполняет собственный код.
Наш собственный обработчик click
вызывает функцию swapPhoto()
, которая создает объект XMLHttpRequest
для синхронной загрузки фрагмента HTML по адресу http://diveintohtml5.info/examples/history/gallery
/casey.html .
Функция swapPhoto()
устанавливает свойство innerHTML
обертке фотогалереи (элемент
Наконец, наш обработчик click
вызывает функцию
history.pushState()
, чтобы вручную изменить URL в адресной строке браузера на http://diveintohtml5.info/examples/history/casey.html .
Пользователь нажимает кнопку «Назад» браузера.
Браузер замечает, что URL вручную помещается в стек истории (по функции history.pushState()
). Вместо того, чтобы перейти на предыдущий URL и перерисовать всю страницу, браузер просто обновит адресную строку на предыдущий URL (http://diveintohtml5.info/examples/history/fer.html) и запустит событие popstate
.
Наш пользовательский обработчик popstate
снова вызовет функцию swapPhoto()
, на этот раз с предыдущим URL, что сейчас уже видно в адресной строке браузера.
Снова используя XMLHttpRequest
, функция swapPhoto()
загружает фрагмент HTML расположенный в http://diveintohtml5.info/examples/history/gallery
/fer.html и устанавливает свойство innerHtml
для элемента
Иллюзия завершена. Все видимые доказательства (содержание страницы и URL в адресной строке) убеждают пользователя, что у него был переход вперед и назад на страницу. Но полного обновления страницы не происходит - все это было тщательно выполненной иллюзией.
History API представляет собой одно из интересных новшеств HTML 5. Благодаря ему появляется возможность навигации по истории одного таба браузера без перезагрузки страницы, при этом браузер корректно отрабатывает функции "назад" и "вперед".
Это дает замечательные возможности при использовании History API совместно с Ajax. Теперь нет необходимости использовать традиционную конструкцию #!, можно просто заменить URL целиком. Благодаря этому мы получаем следующие преимущества:
в URL теперь отображается реальный адрес страницы, пользователи могут спокойно копировать ссылку на страницу из адресной строки браузера и распространять ее;
отказ от конструкции #! при использовании Ajax позволяет не беспокоиться о потерянных для индексации поисковыми системами ссылках;
ссылки просто становятся чище и красивее.
В этой статье мы кратко рассмотрим HTML5 History API и создадим простой пример с использованием плагина History.js для популярного Javascript фреймворка jQuery. В качестве примера реализуем постраничную Ajaxнавигацию на странице листинга продуктов Magento.
Обзор HTML5 History API
За работу с историей отвечает объект History. Мы можем получить этот объект для текущего таба через readonly ссылку window.history.
Основные методы и свойства объекта History:
window.history.state
Возвращает текущий объект истории. С помощью этого объекта можно получить данные, которые передаются методами pushState и replaceState путем доступа к свойствам этого объекта.
window.history.length
Свойство lenght показывает количество записей в истории.
window.history.go(n)
Переход к определенной позиции в истории, в качестве аргумента передается смещение относительно текущий позиции. Этот метод существовал до появления HTML5.
window.history.back()
Переход к предыдущему элементу в истории, идентично вызову go(- 1).
window.history.forward()
Переход к следующему элементу в истории, идентичный вызову go(1).
Методы window.history.back() и window.history.forward() также существовали до HTML5.
window.history.pushState(data, title [, url])
Добавляет новый элемент в историю. Метод принимает три параметра:
Данные состояния истории. Эти данные можно получить затем в обработчике события popstate. Если дополнительные данные не требуются можно передавать null;
Заголовок страницы, который отобразится в окне браузер, так же можно передавать null;
URL, который должен отображаться в адресной строке.
Если текущий URL был http://yoursite.com/path/to/page.html, то он будет заменен на http://yoursite.com/path/to/myurl.html, как если бы мы перешли по ссылке обычным способом.
URL, передаваемый третьим параметром, может быть как относительным так и абсолютными, но использование Ajax накладывает ограничение на использование только текущего домена.
window.history.replaceState(data, title [, url])
Этот метод очень похож на pushState и имеет те же параметры. Отличие заключается в том, что данный метод не добавляет новую запись, а изменяет текущую запись в истории.
popstate
Это событие срабатывает при переход от одного элемента истории к другому. При этом history.pushState() и history.replaceState() не приводят к вызову этого события. Только нажатие кнопок вперед/назад в браузере, либо вызов history.back() или аналогичной функции в Javascript.
Window.addEventListener("popstate", function(e) {
// код обработчика события
});
Поддержка браузерами
History Api и jQuery
Существует интересный плагин History.js , который предоставляет единый интерфейс для всех популярных браузеров для работы с историей просмотра. Он базируется на HTML5 History API и содержит практически те же самые методы, что и объект window.history. Используя данный плагин, можно не беспокоиться о работе скрипта в старых браузерах. Если браузер не имеет поддержки History API, то для его эмуляции будет использован # (якорь URL).
Для обращения к функциям плагина используется объект History. Например, вызов функции History.pushState(data,title,url) практически аналогичен вызову history.pushState. Детально ознакомиться с Api плагина можно на его сайте. Однако, есть 2 момента, на которые стоит обратить внимание:
Плагин использует собственное событие «statechange» вместо стандартного «popstate» для определения момента перехода по истории;
Методы History.pushState и History.replaceState приводят к вызову события «statechange», тогда как аналогичные методы объекта window.history нет.
Живой пример
Для демонстрации работы плагина добавим Ajax с динамической сменой URL к стандартной постраничной навигации продуктов Magento.
Скачать плагин можно по этой ссылке https://github.com/browserstate/history.js/ . Нам потребуется только один файл jquery.history.js из папки scripts/bundled/html4+html5 (минимизированная версия с поддержкой HTML4). Подключаем файл плагина и библиотеку jQuery, если она еще не подключена. В версии Magento 1.9.0.1, которую я использовал для этого примера, jQuery подключен по умолчанию, поэтому мне достаточно подключить только файл плагина.
Копируем jquery.history.js в папку /skin/frontend///js/lib/. В моем случае это папка skin/frontend/rwd/default/js/lib/. В файле разметки page.xml текущей темы в в самый конец блока «head» добавляем:
...
skin_jsjs/lib/jquery.history.js
Кроме этого, нам потребуется отдельный файл для инициализации плагина и написания собственного кода обработчиков событий. Создадим файл main.js и так же поместим его в папку текущего скина по адресу skin/frontend///js/.
Мы использовали именно такой синтаксис для избежания конфликтов с библиотекой Prototype, которую Magento использует по умолчанию.
(function ($) {
// код
})(jQuery);
Мы добавили обработчик события «click» на ссылки постраничной навигации и отменили стандартное поведение ссылок с помощью метода e.preventDefault. Затем мы используем History.pushState для добавления нового элемента в историю и в фоновом режиме загружаем новую страницу с помощью функции loadPage.
Первым параметром передаем null, так как нам не требуется передавать дополнительные параметры в объект State. Вторым параметром передаем текущий заголовок документа, поскольку при переходе на следующую страницу нам не нужно менять заголовок. И третьим параметром передаем новый URL - ссылка, на которую нажал пользователь.
Для проверки работы этого примера нужно зайти в любую категорию с товарами, где количество товаров достаточно для появления постраничной навигации, и перейти на любую другую страницу. После этого URL в адресной строке заменяется на новый, как если бы мы перешли по этому URL, и после небольшой паузы подгружаются товары с новой страницы.
Наш пример справляется со своей задачей, однако при нажатии кнопки «назад» в браузере ничего не происходит. Для обработки события перехода истории нам требуется назначить обработчик на событие «statechange».
History.Adapter.bind(window, "statechange", function(e){
var State = History.getState();
loadPage(State.url);
});
Поскольку событие «statechange» срабатывает всякий раз, когда происходит переход по истории, нам больше не требуется вызывать функцию loadPage после History.pushState.
После внесения необходимых правок, наш код выглядит следующим образом:
(function ($) {
$(function(){
var $categoryProducts = $(".category-products");
$categoryProducts.on("click", ".pages a", function(e){
e.preventDefault();
History.pushState(null, document.title, $(this).attr("href"));
});
function loadPage(url) {
$categoryProducts.load(url + " .category-products > *");
}
History.Adapter.bind(window, "statechange",function(e){
var State = History.getState();
loadPage(State.url);
});
});
})(jQuery);
Теперь при нажатии в браузере кнопок вперед/назад срабатывает событие «statechange» и содержимое страницы корректно обновляется. Для наглядного отображения процесса загрузки немного изменим функцию loadPage, добавив изменение прозрачности блока с продуктами на время загрузки контента.
На этом наш простой пример завершен. Как видите, использование History API не представляет особых сложностей. Вы легко можете использовать красивые URL в Ваших Ajax-приложениях, не боясь проблем с поисковиками, а использованный в примере плагин позволит избежать проблем в старых браузерах.
Спасибо за внимание!
Если вам никогда раньше не приходилось встречаться с объектом history, не стоит волноваться по этому поводу. До сих пор он не мог предложить нам ничего полезного. В действительности, традиционный объект history имеет только одно свойство и три основных метода. Это свойство length
- содержит информацию о количестве элементов в списке истории просмотров (т.е. в поддерживаемом браузером списке недавно посещенных веб-страниц). Вот пример использования этого свойства:
Alert("У вас сохранено " + history.length +
" страниц, в истории браузера.");
History.back();
Эффект этого метода равнозначен нажатию пользователем кнопки браузера "Назад". Подобным образом можно использовать метод forward()
для перемещения на один шаг вперед или метод go()
для перехода вперед или назад на определенное количество шагов.
Но все это не представляет большой ценности, если только вы не хотите создать для веб-страницы собственные кнопки "Назад" и "Вперед". Но HTML5 добавляет этому объекту history несколько дополнительных возможностей, которые можно использовать для реализации намного более амбициозных задач.
Главной из этих возможностей является метод pushState()
, который позволяет изменить URL в адресной строке браузера, не обновляя при этом содержимого страницы. Эта возможность приходится кстати в специфической ситуации, а именно при создании динамических страниц, которые незаметно загружают новое содержимое и плавно обновляют себя. В такой ситуации URL страницы и ее содержимое могут рассогласоваться.
Например, если страница загрузит в динамическом режиме содержимое с другой страницы, первоначальный 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, есть бесплатная демо-версия.
Всем привет! Сегодня мы перейдем с вами к видеомонтажу. И первым делом мне хотелось бы дать вам подробную инструкцию, как пользоваться сони вегас про 13, даже если вы начинающий пользователь. На сегодняшний день эта программа является одной из лучших. Ко
Для организации и взаимодействия с приложениями на Android используются лаунчеры. Которые обычно состоят из серии домашних экранов, где мы можем организовать ярлыки приложений, виджеты и так далее. Каждый телефон поставляется с лаунчером, но не все лаунче
Откройте окно с задачей "Мой компьютер
". Если значки в окне мелкие, то измените их на крупные. Конечно, с помощью Правила Внешнего вида!Окно задачи будет выглядеть приблизительно так, как на рисунке:В данном примере значки (C:), (D:) и (E:) обозначают ло