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.
我们正在寻求处理此类方案的方法的建议.我自己想出几个:
load可以尽快解雇.load被触发.load而不是DOMContentLoaded.有更好的解决方案吗?
更新:当之前有一个ajax触发时load,如果那些请求导致DOM更改,并且DOM更改恰好有一些图像,load则会延迟,直到这些图像被加载/超时,这意味着popstate排队等待更长时间.
更新2:要为它添加一个简单的演示,请访问带有chrome的jsbin页面,看到popstate将被阻止直到load被触发.您可以比较缓存图像和未缓存图像之间的结果.
小智 2
您可以尝试在卸载上一页期间调用 popstate 吗?例如,如果您位于页面 1 并想要移至页面 2,那么为什么不在页面 1 的卸载事件中调用 pop 状态,而不是在页面 2 的加载/就绪期间调用 pop 状态呢?
不确定是否满足您的场景。但我没能在你的垃圾箱里尝试一下。