【发布时间】:2012-05-31 07:52:40
【问题描述】:
是否可以防止在 popstate 事件发生时滚动文档的默认行为?
我们的网站使用 jQuery 动画滚动和 History.js,状态变化应该通过 pushstate 或 popstate 将用户滚动到页面的不同区域。问题是当popstate事件发生时,浏览器会自动恢复之前状态的滚动位置。
我尝试使用设置为文档宽度和高度 100% 的容器元素并滚动该容器内的内容。我发现的问题是它似乎不像滚动文档那么流畅。尤其是在使用大量 css3(如 box-shadows 和渐变)时。
我还尝试在用户启动滚动期间存储文档的滚动位置,并在浏览器滚动页面后恢复它(在 popstate 上)。这在 Firefox 12 中运行良好,但在 Chrome 19 中,由于页面正在滚动和恢复,会出现闪烁。我认为这与滚动和触发滚动事件之间的延迟有关(恢复滚动位置)。
Firefox 在 popstate 触发之前滚动页面(并触发 scroll 事件),Chrome 先触发 popstate 然后滚动文档。
我见过的所有使用历史 API 的网站要么使用与上述类似的解决方案,要么在用户返回/前进时忽略滚动位置的变化(例如 GitHub)。
是否可以完全防止文档在 popstate 事件中滚动?
【问题讨论】:
-
在设置滚动位置后,您可能会成功读取元素尺寸(以强制页面重排)。例如
document.body.clientHeight但我还没有看到它适用于所有浏览器。 -
如果你操纵了文档的滚动功能,我至少会从这里开始。这里有一个解决方案:stackoverflow.com/questions/7035331/…
标签: javascript html dom-events browser-history