【问题标题】:window.onload and expected behaviorwindow.onload 和预期行为
【发布时间】:2018-01-14 22:29:47
【问题描述】:

我在一个页面上有以下代码:

window.onload = function () {
  window.scrollTo(0, 0);
}

我的预期行为是每次显示页面时都会使页面滚动到0,0(左上角)。但这不是真的,只有当我“重新加载”页面时才会这样做。例如,如果我转到页面,它会滚动到顶部,但如果我离开并返回,它就不起作用。不知何故,onload 没有被触发。

由于我只是在学习,我假设我在期待一些不真实的东西。有人能帮我解释一下吗?

【问题讨论】:

标签: javascript


【解决方案1】:

当您返回已访问过的页面时,浏览器会将页面滚动到您上次离开时​​的位置。

window.onload 调用的scrollTo 要么被忽略,要么在浏览器进入路径并恢复滚动位置之前执行

这是为了给用户更好的浏览体验,实际上这是用户通常所期望的,特别是在通过“返回”按钮导航回页面时。

但是,如果您真的愿意,您可以通过在onload 之后和代码滚动页面到(0,0) 之前等待一段时间来覆盖浏览器行为:

window.onload = function () {
    setTimeout( function () {
        window.scrollTo(0, 0);
    }, 500 );
};

这样window.scrollTo被“预定”在页面加载后0.5秒执行。

...并且会成功

另见Prevent automatic browser scroll on refresh


注意:因为window.onload会在整个页面加载(包括图片、链接、框架...)事件(以及随后滚动到@987654330 @) 可能会被过度延迟或根本不触发(如果资源加载失败)。

我建议使用(或至少尝试)document.onload,它会在页面被解析、DOM 结构准备好并且链接资源开始加载时触发。

你的代码变成:

document.onload = function () {
    setTimeout( function () {
        window.scrollTo(0, 0);
    }, 500 );
};

由于这会在您遇到问题时很早就触发,因此您可以将延迟值提高到 7501000 毫秒。


供您参考:window.onload vs document.onload

【讨论】:

  • 这给了我大部分时间想要的效果。我怀疑外部脚本的加载时间超过了 0.5 秒。有没有办法在特定项目(div、脚本等)加载后触发?
  • @Vonedaddy - 查看我对答案的编辑。希望这会有所帮助。
【解决方案2】:

window.onload 在浏览器完成解析(也就是读取)html 后被调用。每当您加载页面时,浏览器只需要解析一次 html,因此它只会被调用一次。

如果您希望在重新聚焦选项卡时调用它,您可以使用window.onfocus 属性。

【讨论】:

  • 好的,如果我打开选项卡并返回它(很高兴知道),它会起作用。我所说的离开是指在同一个选项卡内的同一个网站上的不同页面。因此,如果我的“联系人”页面上有原始的 window.onload sn-p,然后转到主页并返回,它不会触发(window.onfocus 也不会)。
  • 这不是我们想要的行为。 OP 要求在加载页面和通过单击后退按钮导航到页面时触发一个事件
猜你喜欢
  • 1970-01-01
  • 2014-06-16
  • 2012-02-08
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多