Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript HTML5历史API-在加载第一页时不触发window.onpopstate事件_Javascript_Jquery_Asp.net Mvc_Html_Browser History - Fatal编程技术网

Javascript HTML5历史API-在加载第一页时不触发window.onpopstate事件

Javascript HTML5历史API-在加载第一页时不触发window.onpopstate事件,javascript,jquery,asp.net-mvc,html,browser-history,Javascript,Jquery,Asp.net Mvc,Html,Browser History,使用HTML5历史API,我创建了如下内容: (function (d, w) { $(function () { $("#indicator").hide(); if (typeof history.pushState !== 'undefined') { $("#citylinks a").click(function (e) { history.pushState({ path: th

使用HTML5历史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);
完整代码如下:

这里的问题是,我不想在页面第一次从服务器发出时触发
w.onpopstate
事件

我之所以要这样做,是因为我想在服务器端填充页面,而不希望客户端代码这样做。如果我删除
w.onpopstate
事件,我将无法捕获
history.go()
事件


有没有办法解决这个问题?

一个非常简单的方法是:

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

这意味着第一次触发
onpopstate
事件时,您的函数将被设置为事件处理程序(替换当前处理程序),有效地为事件在页面加载时运行创建一个noop。

。一件事是它在每个
windows.onpopstate
事件上运行。我试图阻止它(如果
null
undefined
,则检查
window.onpopstate
事件),但无法让它工作。这是一个有点黑客式的解决方案。你可以试试这样的东西。@Ryan:也许有点黑,但我真的看不出来。 如果有什么区别的话,它更高效,因为它不需要对链接到的示例进行额外检查。 当然,我们谈论的是微秒,这并不重要,但从另一方面来说,我认为使用这种技术没有任何问题。 这是我在许多脚本中多次看到的,不幸的是,我现在无法及时回忆起:-pFirefox中的这项工作将考虑到它不会为pageload触发onpopstate,因此函数将首先错误地设置在有效的.back()/.forward()事件上?该错误已在Chrome 34 canary build上修复。