API истории HTML5 - не запускать событие window.onpopstate при первой загрузке страницы - PullRequest
4 голосов
/ 23 января 2012

С помощью HTML5 History API я создал что-то вроде следующего:

(function (d, w) {

    $(function () {

        $("#indicator").hide();

        if (typeof history.pushState !== 'undefined') { 

            $("#citylinks a").click(function (e) {
                history.pushState({ path: this.href }, '', this.href);
                act(this.href);
                e.preventDefault();
            });

            w.onpopstate = function (event) {
                act(d.location);
            };
        }

        function act(location) {

            $("#results").hide();
            $("#indicator").show();

            $.getJSON(location, function (data) {

                $("#results").html(data.result);
                $("#results").fadeIn();

                $("#indicator").hide();
            });
        }

    });

})(document, window);

Полный код здесь:

https://github.com/tugberkugurlu/MvcMiracleWorker/commit/7c511f20678bbfe15462909c794eb323ce615372#diff-3

Проблема, с которой я столкнулся здесьчто я не хочу запускать событие w.onpopstate при первой загрузке страницы с сервера.

Причина, по которой я хотел бы сделать это, заключается в том, что я хотел бы заполнить страницу на стороне сервера иЯ не хочу, чтобы клиентский код делал это.Если я удалю событие w.onpopstate, я не смогу перехватить события history.go().

Есть ли способ решить эту проблему?

1 Ответ

4 голосов
/ 23 января 2012

Очень простой подход будет следующим:

w.onpopstate = function () {
    w.onpopstate = function (event) {
        act(d.location);
    }
}

Это означает, что в первый раз, когда срабатывает событие onpopstate, ваша функция устанавливается на обработчик событий (заменяя текущий обработчик), эффективно создавая noop , когда событие запускается при загрузке страницы.

...