история pushState и положение прокрутки
Я пытаюсь получить положение прокрутки, когда пользователь переходит обратно в историю браузера с помощью обработчика HTML5 popstate.
вот что у меня есть:
$(document).ready(function () {
$(window).on('popstate', PopStateHandler);
$('#link').click(function (e) {
var stateData = {
path: window.location.href,
scrollTop: $(window).scrollTop()
};
window.history.pushState(stateData, 'title', 'page2.html');
e.preventDefault();
});
});
function PopStateHandler(e) {
alert('pop state fired');
var stateData = e.originalEvent.state;
if (stateData) {
//Get values:
alert('path: ' + stateData.path);
alert('scrollTop: ' + stateData.scrollTop);
}
}
<a id="link" href="page2.html"></a>
когда я перехожу назад, я не могу получить значения stateData.
Я предполагаю, что это связано с тем, что popstate извлекает значения начальной загрузки страницы, а не состояние, которое я нажал на историю при нажатии гиперссылки.
Как я мог пойти о получение положения прокрутки при навигации назад?
2 ответов
мне удалось решить эту проблему самостоятельно:
мы должны перезаписать текущую страницу в стеке истории перед переходом на новую страницу.
Это позволяет нам сохранить положение прокрутки, а затем вытащить его из стека при перемещении назад:
$('#link').click(function (e) {
//overwrite current entry in history to store the scroll position:
stateData = {
path: window.location.href,
scrollTop: $(window).scrollTop()
};
window.history.replaceState(stateData, 'title', 'page2.html');
//load new page:
stateData = {
path: window.location.href,
scrollTop: 0
};
window.history.pushState(stateData, 'title', 'page2.html');
e.preventDefault();
});
найдите способ сделать это более динамичным с помощью jQuery, надеюсь, это поможет:
$(".lienDetail a").on('click',function(){
history.pushState({scrollTop:document.body.scrollTop},document.title,document.location.pathname);
}
вот решение без jQuery:
function pushHistory(e){
e = e || window.event;
var target;
target = e.target || e.srcElement;
if (target.className.match(/\blienDetail\b/)){
history.pushState({scrollTop:document.body.scrollTop},document.title,document.location.pathname);
}
}
if (document.body.addEventListener)
{
document.body.addEventListener('click',pushHistory,false);
}
else
{
document.body.attachEvent('onclick',pushHistory);
}
это будет нажимать состояние истории для каждого клика по ссылке с классом lienDetail для списка результатов, например