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

时间:2014-06-07 11:34:37

标签: javascript html5 browser-history

这个问题可能听起来很奇怪,因为大部分时间popstate会在用户按下后退按钮时同步启动。

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

浏览器供应商以不同方式解释和实施此规范。 Mozilla decides Firefox应该能够在popstate之前触发load,并且有充分的理由,以便慢速图像不会阻止popstate

Chrome / Safari另有决定,这导致了我们的问题:

在管理网络应用的历史记录时,通常需要尽快启动历史记录管理,例如。在DOMContentLoaded而不是load但作为回报,用户无法退出任何pushState,因为所有popstate排队等候load

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

  • 延迟加载图片,因此load可以尽快解决。
  • 阻止用户界面,直到load被解雇。
  • load上的初始化框架,而不是DOMContentLoaded

有更好的解决方案吗?

更新:如果ajax在load之前触发,如果这些请求导致DOM更改,并且DOM更改恰好有一些图像load,那么事情会变得很难看延迟,直到这些图像被加载/超时,这意味着popstate排队等待更长时间。

更新2 :要为其添加一个简单的演示,请访问带{chrome的jsbin page,然后popstate将被阻止,直到load被解雇为止。您可以比较缓存图像和未缓存图像之间的结果。

1 个答案:

答案 0 :(得分:2)

您可以在卸载上一页时尝试调用popstate吗?例如,如果您在第1页并且想要转到第2页,而不是在第2页的加载/准备期间调用pop状态,为什么不在第1页的unload事件中调用pop状态?< / p>

不确定它是否满足您的情况。但我无法在你的箱子里试试。