这已经是一个 < a href=>" https://buggzilla.mozilla.mozilla.org/show_bug.cgi?id=679458" rel="noreferrer" 报告的莫兹拉开发器核心问题已经超过一年了 。 不幸的是,该票没有真正进展。 我认为铬是相同的:没有可靠的办法通过js解决滚动位置 onpopstate
,因为它是本地浏览器的行为。
不过,如果你看看HTML5历史spec ,明确希望在国家天体上代表滚动位置:
历史对象代表其浏览上下文的会话历史,作为会话历史条目的平坦列表。每个会话历史条目由 URL 组成,可选为状态对象,此外,还可以有标题、文档对象、格式数据、滚动位置和其他与之相关的信息。
如果您阅读上述mozilla票的评语, 可以在一定程度上表明, 在最近的将来, 可能不再恢复滚动位置 onpopstate
, 至少对于使用 push State
的人来说。
不幸的是,在此之前,当使用 < code> pushstate 时,滚动位置会被存储,而 < code> replacestate 并不取代滚动位置。 否则,它将相当容易,您可以使用 < code> replace State 来设置当前滚动位置,每次用户滚动该页面时都设置滚动位置(并有一些谨慎的在scroll处理器)。
此外,不幸的是,HTML5标准没有说明何时必须发射确切的popstate
事件,它只是说:“在某些情况下,当导航到会话历史条目时,会发射,这没有明确说它是在之前还是之后;如果以前总是这样,那么处理滚动事件的办法在流行国家之后就有可能发生。
<强 > 取消滚动事件? 强>
此外,如果可以取消滚动事件,那也很容易。如果是的话,你可以取消一个系列的第一个滚动事件(用户滚动事件就像利明斯一样,数十次,而历史重新定位所引发的滚动事件只是一次),你就会很好。
< 坚固> 现在没有解决方案 坚固 >
在我看来,我目前建议的唯一一件事就是等待HTML5 Spec 完全实施,并在此情况下随浏览器行为滚动,这意味着:当浏览器允许你滚动时,在浏览器允许你滚动时进行动画,并在出现历史事件时让浏览器重新定位页面。 < 坚固> 唯一能影响位置的方法是,当页面定位良好时,您使用 push State
。 任何其他解决方案要么注定有错误,要么过于特定浏览器,或者两者兼而有之。