Javascript HTML5历史API-在加载第一页时不触发window.onpopstate事件
使用HTML5历史API,我创建了如下内容: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
(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上修复。