如果您不想对添加到onpopstate的每个处理程序采取特殊措施,那么我的解决方案可能对您很有趣。该解决方案的一大优势还在于,可以在页面加载完成之前处理onpopstate事件。
在添加任何onpopstate处理程序之前,只需运行一次此代码,一切便会按预期工作(也像在Mozilla ^^中一样)。
(function() {
// There's nothing to do for older browsers ;)
if (!window.addEventListener)
return;
var blockPopstateEvent = document.readyState!="complete";
window.addEventListener("load", function() {
// The timeout ensures that popstate-events will be unblocked right
// after the load event occured, but not in the same event-loop cycle.
setTimeout(function(){ blockPopstateEvent = false; }, 0);
}, false);
window.addEventListener("popstate", function(evt) {
if (blockPopstateEvent && document.readyState=="complete") {
evt.preventDefault();
evt.stopImmediatePropagation();
}
}, false);
})();
这个怎么运作:
Chrome,Safari和其他Webkit浏览器在文档加载后会触发onpopstate事件。这不是故意的,因此我们将阻止popstate事件,直到加载文档后的第一个事件循环提示为止。这是通过preventDefault和stopImmediatePropagation调用完成的(与stopPropagation stopImmediatePropagation不同,它立即停止所有事件处理程序调用)。
但是,由于当Chrome错误地触发onpopstate时,文档的readyState已经处于“完成”状态,因此我们允许opopstate事件,该事件在文档加载完成之前就已触发,以允许在加载文档之前进行onpopstate调用。
2014年4月23日更新:修复了以下错误:如果在加载页面后执行脚本,则会阻止popstate事件。