当浏览器没有立即触发popstate事件时如何处理后退按钮

bit*_*inn 22 javascript html5 browser-history

这个问题可能听起来很奇怪,因为大多数时候popstate会在用户按下后退按钮时同步触发.

但是,W3C规范规定允许UA(浏览器)在遍历历史时对popstate进行排队(参见第14项),即.popstate是异步触发的(即使此时URL已更改).

浏览器供应商以不同方式解释和实现此规 Mozilla决定 Firefox应该能够在popstate之前发布load,并且有充分的理由,以便慢速图像不会阻塞popstate.

Chrome/Safari另有决定,它引发了我们的问题:

在管理Web应用程序的历史记录时,通常需要尽快启动历史记录管理,例如.在DOMContentLoaded代替load.但作为回报,用户无法退出pushState,因为所有人popstate都排队等候load.

我们正在寻求处理此类方案的方法的建议.我自己想出几个:

  • Lazyload图像,因此load可以尽快解雇.
  • 阻止UI直到load被触发.
  • Init框架load而不是DOMContentLoaded.

有更好的解决方案吗?

更新:当之前有一个ajax触发时load,如果那些请求导致DOM更改,并且DOM更改恰好有一些图像,load则会延迟,直到这些图像被加载/超时,这意味着popstate排队等待更长时间.

更新2:要为它添加一个简单的演示,请访问带有chrome的jsbin页面,看到popstate将被阻止直到load被触发.您可以比较缓存图像和未缓存图像之间的结果.

小智 2

您可以尝试在卸载上一页期间调用 popstate 吗?例如,如果您位于页面 1 并想要移至页面 2,那么为什么不在页面 1 的卸载事件中调用 pop 状态,而不是在页面 2 的加载/就绪期间调用 pop 状态呢?

不确定是否满足您的场景。但我没能在你的垃圾箱里尝试一下。