如果您不想对添加到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事件。