如果您不想为添加到 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 事件被阻止的错误。