Подтвердить что ты не робот

История pushState и позиция прокрутки

Я пытаюсь получить позицию прокрутки, когда пользователь переводит назад в историю браузера с помощью обработчика popstate HTML5.

Вот что у меня есть:

$(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 извлекает значения начальной загрузки страницы, а не состояние, которое я нажал на историю при нажатии гиперссылки.

Как я могу получить положение прокрутки при навигации?

4b9b3361

Ответ 1

Мне удалось решить эту проблему самостоятельно:

Мы переписываем текущую страницу в стеке истории перед переходом на новую страницу.

Это позволяет нам сохранить позицию прокрутки, а затем вытащить ее из стека, когда мы вернемся назад:

    $('#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();

    });

Ответ 2

Найдите способ сделать это более динамичным с помощью 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 для получения списка результатов, например