Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
location: example.com/example.html, state: nullи куда делось
history.pushState({page: 2}, «title 2», "?page=2");?
history.pushState({page: 2}, "title 2", "?page=2");
// заменить текущее состояние
history.replaceState({page: 3}, "title 3", "?page=3");
history.pushState({page: 1}, "title 1", "?page=1"); // location: http://example.com/example.html?page=1, state: {"page":1}
// теперь стек сотояний [null, {page: 1}]
history.pushState({page: 2}, "title 2", "?page=2"); // location: http://example.com/example.html?page=2, state: {"page":2}
// теперь стек сотояний [null, {page: 1}, {page: 2}]
history.replaceState({page: 3}, "title 3", "?page=3"); // location: http://example.com/example.html?page=3, state: {"page":3}
// здесь мы заменили текущее состояние, а не добавили его. поэтому грубо стек состояний таков:
[null, {page: 1}, {page:3}]
// Переходим назад по истории, получаем состояние {page: 1}
history.back(); // location: http://example.com/example.html?page=1, state: {"page":1}
// Переходим назад по истории, получаем состояние null
history.back(); // location: http://example.com/example.html, state: null
// Переходим на два состояния вперед, получаем состояние {page: 3}
history.go(2); // location: http://example.com/example.html?page=3, state: {"page":3}
Hash.add('key1', 'var1'); // добавляем значение в url
Hash.remove('key1'); // удаляем
Hash.set({'key1':'var1'}); // заменяем все значения своим массивом
Hash.get(); // получаем данные в url массивом
Hash.clear(); // удаляем все значения в url без перезагрузки
А вот второй параметр (title), не работает для большинства браузеров, title страницы надо вручную менять через document.title чтобы работало как положено
// Обработчик back/forward событий
window.onpopstate = function(event) {
console.log("location: " + location.href + ", state: " + JSON.stringify(event.state));
// меняем title
document.title = event.state.title;
};
// добавить состояние истории
history.pushState({page: 1, title: "title 1"}, "", "?page=1");
history.pushState({page: 2, title: "title 2"}, "", "?page=2");
// заменить текущее состояние
history.replaceState({page: 3, title: "title 3"}, "", "?page=3");
осталось только дописать как хранить динамический контент в event.state
<html>
<head>
<title>Some Title</title>
</head>
<body>
<a href="?page=1" title="Title 1">Page 1</a>
<a href="?page=2" title="Title 2">Page 2</a>
<a href="?page=3">Page 3</a>
<script>
window.onpopstate = function (event) {
document.title = event.state.title;
};
var a = document.querySelectorAll('a');
for (var i=0; i < a.length; i++) {
a[i].onclick = function() {
var title = document.title = this.title ? this.title : this.innerHTML;
history.pushState({title: title}, "", this.href);
return false;
}
}
</script>
</body>
</html>
Вы либо меня не поняли…
И к слову вместо ?page=1 и ?page=2, можно сделать красивые /page1 и /page2Это понятно… ?page=1 и ?page=2 взяты из примера самой статьи
нужно будет чутка только в .htaccess подшаманить, чтоб букмарки открывались так, как ожидает пользовательПишу на python/django по-этому ничего шаманить не надо
Я может придираюсь через чур, но как заметили ниже, статья введение на хабре уже была, раз уж это уже вторая о том же, можно было бы довести до полезного на практике примера.с этим я согласен… но акцент был на поддержку браузеров (то бишь даже ie поддерживает)
А вот второй параметр (title), не работает для большинства браузеров, title страницы надо вручную менять через document.title чтобы работало как положено
Для примера это имя вы можете увидеть при продолжительном нажатии на кнопки back/forward, то есть попробуйте нажать левой клавишей мыши на одну из этих стрелок с небольшой задержкой, откроется список, вот в нем и будут отображаться те самые имена что были занесены во второй параметр.
<title>Some Title</title>document.title = "Some Title";history.pushState(null, 'Новый заголовок');
history.pushState(null, 'Новый заголовок 2', '/urlurl');
onpopstate в хроме может вызывается при подписываниии (может тк если обернуть в setTimeout, то результат может быть не предсказуем).window.location = '/url' и имел отличную возможность использовать hash для всякого рода сообщений и выделений внутри страницы.pagechange = {
newUrl: string
, oldUrl: string
, popstate: boolean
}
Прекратите использовать location.hash, да здравствует HTML5 History API!