发生popstate事件时,是否可以防止滚动文档的默认行为?
我们的网站使用jQuery动画滚动和History.js,并且状态更改应使用户通过pushstate或popstate滚动到页面的不同区域。问题是浏览器在发生popstate事件时会自动恢复先前状态的滚动位置。
我尝试使用设置为文档宽度和高度100%的容器元素,并在该容器内滚动内容。我发现的问题是,它似乎不像滚动文档那样平滑。尤其是在使用大量css3(例如框阴影和渐变)的情况下。
我还尝试了在用户启动滚动期间存储文档的滚动位置,并在浏览器滚动页面后(在popstate上)恢复了它的位置。在Firefox 12中可以正常工作,但在Chrome 19中,由于正在滚动和还原页面,因此会出现闪烁。我认为这与滚动和被触发的滚动事件(恢复滚动位置)之间的延迟有关。
Firefox在popstate触发之前先滚动页面(并触发scroll事件),Chrome先触发popstate然后再滚动文档。
我见过的所有使用历史API的网站都使用与上述类似的解决方案,或者在用户后退/前进时忽略滚动位置更改(例如GitHub)。
是否可以防止在popstate事件中根本滚动文档?
document.body.clientHeight
但我还没有看到它在所有浏览器中都能正常工作。