popstate - нужно дважды нажать на кнопку «назад», чтобы вернуться - PullRequest
4 голосов
/ 09 марта 2012

Я создаю одностраничную страницу и использую pushState для изменения адреса.Теперь, если я нажму назад, будет запущено popstate, и я хочу анимировать прокрутку страницы от текущей позиции до последней позиции.Это работает, конечно, но страница переходит наверх.

Кто-нибудь знает, как предотвратить такое поведение?Я использую jQuery для анимации прокрутки ....

Спасибо:)

// edit: хорошо, я узнал, если я анимирую прокрутку, а затемизменяя URL, он не будет прыгать - но теперь мне нужно дважды нажать кнопку «назад», чтобы вернуться ...
http://www.testwebseiten.at/user/falk/stein-jagersbacher.at

Код немного запутан, поэтому я объясняю этонемного:

    var scrollCurrentSection = function(event) {
        if (typeof event.preventDefault != 'undefined')
            event.preventDefault();

        var page = "";
        if (window.location.href.substr(-1) == '/')
            page = sjag.index;
        else
            page = window.location.href.match(/([^\/]+)$/)[1];

        $this       = $('a[href$="'+page+'"]');
        if ($this.length) {
            sjag.scrollToSection($this);
        }
    }
    window.onpopstate = scrollCurrentSection;

В sjag есть несколько опций и методов ... поэтому sjag.index содержит только 'index.php', sjag.scrollToSection содержит анимацию.

При нажатии наПо ссылке навигации, вызывается следующая функция:

    // set navi
    $("#navi a, #navi-add a").click(function(event) {
        var data = $(this).data('sjagpage');
        if (typeof data == 'undefined')
            return;

        event.preventDefault();
        // animate scrolling
        $this   = $(this);
        sjag.scrollToSection($(this), function() {
            history.pushState("", "", $this.attr('href'));
        });
    });

$(this).data('sjagpage') содержит элемент jQuery.

Когда я не анимирую прокрутку, для ее получения требуется всего один кликназад - но когда я сейчас его оживляю, нужно два ... зачем?

1 Ответ

0 голосов
/ 09 марта 2012

Думаю, проблема в том, что event.preventDefault - это функция, добавленная в объект event с помощью jQuery, но вы не привязываете обработчик событий с помощью jQuery.Таким образом, навигация по умолчанию не предотвращается, поэтому вы получаете 2 элемента истории, для которых необходимо вернуться назад.

Вместо:

window.onpopstate = scrollCurrentSection;

Вы должны связать его примерно так:

$(window).bind("popstate", scrollCurrentSection);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...