javascript - 防止浏览器在 HTML5 History popstate 上滚动

标签 javascript html dom-events browser-history

是否可以防止发生 popstate 事件时滚动文档的默认行为?

我们的网站使用 jQuery 动画滚动和 History.js,无论是通过 pushstate 还是 popstate,状态更改都应将用户滚动到页面的不同区域。问题是浏览器会在 popstate 事件发生时自动恢复到之前状态的滚动位置。

我尝试使用一个容器元素设置为文档的 100% 宽度和高度,并滚动该容器内的内容。我发现的问题是它似乎不像滚动文档那样流畅;特别是如果使用大量 css3,例如框阴影和渐变。

我还尝试在用户启动滚动期间存储文档的滚动位置,并在浏览器滚动页面(在 popstate 上)后恢复它。这在 Firefox 12 中运行良好,但在 Chrome 19 中,由于页面正在滚动和恢复而出现闪烁。我认为这与滚动和触发滚动事件(恢复滚动位置)之间的延迟有关。

Firefox 在 popstate 触发之前滚动页面(并触发滚动事件),而 Chrome 首先触发 popstate 然后滚动文档。

我见过的所有使用历史 API 的网站要么使用与上述类似的解决方案,要么在用户后退/前进时忽略滚动位置变化(例如 GitHub)。

是否有可能完全阻止文档在 popstate 事件中滚动?

最佳答案

if ('scrollRestoration' in history) {
  history.scrollRestoration = 'manual';
}

(2015 年 9 月 2 日 Announced by Google)

浏览器支持:

Chrome:支持(从 46 开始)

Firefox:支持(从 46 开始)

IE:不支持

Edge:支持(从 79 开始)

Opera:支持(从 33 开始)

Safari :支持

有关详细信息,请参阅 Browser compatibility on MDN .

关于javascript - 防止浏览器在 HTML5 History popstate 上滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10742422/

相关文章:

javascript - popbox.css 和 bootstrap.css 之间的名称冲突

javascript - 在嵌套的 Prototype 子对象中使用 'this'

python - HTML <li> 有什么限制吗?

css - HTML5 Canvas 作为 CSS 背景图片?

javascript - 在 Javascript 中捕获表单提交的事件是什么?

javascript - 使用 node.js 或 javascript 在后端读取套接字 API

javascript - ShadowDOM v1 - 在 lightdom 中更改输入文本

jquery - 获取多个网址的网站标题/描述

javascript - 在 iOS Safari 中模拟/触发选择框(可能使用 touchend)

javascript - 当 Selenium 中自动下拉菜单时,无法触发 Angular ng-change 功能