Ответ 1
popstate
содержит только состояние, когда оно есть.
Когда это будет выглядеть следующим образом:
- загружена начальная страница
- загружена новая страница с добавлением состояния через
pushState
- нажата кнопка назад
тогда нет состояния, потому что начальная страница загружалась регулярно, а не с помощью pushState
. В результате событие onpopstate
запускается с state
из null
. Поэтому, когда оно null
, это означает, что исходная страница должна быть загружена.
Вы можете реализовать его таким образом, чтобы history.pushState
вызывался последовательно, и вам нужно только предоставить функцию изменения состояния следующим образом: Нажмите здесь для ссылки jsFiddle
function change(state) {
if(state === null) { // initial page
$("div").text("Original");
} else { // page added with pushState
$("div").text(state.url);
}
}
$(window).on("popstate", function(e) {
change(e.originalEvent.state);
});
$("a").click(function(e) {
e.preventDefault();
history.pushState({ url: "/page2" }, "/page2", "page 2");
});
(function(original) { // overwrite history.pushState so that it also calls
// the change function when called
history.pushState = function(state) {
change(state);
return original.apply(this, arguments);
};
})(history.pushState);