JavaScript 在 Windows 上检测 Firefox 和 IE Edge 哈希 URL 上浏览器端滚动重新定位的事件

JavaScript event to detect browser-side scrolling reposition on hash URLs in Firefox and IE Edge on Windows

在尝试调整一些滚动脚本以在某些页面上执行 "jump to" 链接时,我注意到如果您的页面在 URL 中包含哈希标记,则行为会有所不同,具体取决于在浏览器上,当您在地址栏上按 Enter 键时,页面加载后。

例如,如果您在 URL 中加载带有 has 的页面,然后滚动离开目标元素,我注意到在 Firefox 和 IE 上,如果您将光标放在地址栏上,然后按 enter 键,页面将移回与主题标签具有相同 id 属性的 HTML 元素,但不会重新加载 页面.

我还注意到在这种情况下既不会触发 popstate 也不会触发 hashchange 事件。 scroll 事件很可能会被触发,但我们怎么知道这不是用户滚动而是浏览器重置其位置?

有没有在浏览器中检测到此类事件的?鉴于这是在视口之外,我有点好奇。但是我有一个场景,我想根据页面向上或向下滚动来重新定位菜单。

尝试解释我在寻找什么:

  1. 包含主题标签 #test 和元素 <div id="test"> 的页面
  2. 按 F5,页面位置本身就在 <div>
  3. 的位置
  4. 向上或向下滚动
  5. 转到地址栏并按回车键
  6. ----寻找一个事件来检测之前的动作---
  7. 页面位置本身 就在 <div> 所在的位置

JSBin 中的示例(在 Firefox 中打开):

http://jsbin.com/rifikereze/1/edit?html,js,output

输出:

http://output.jsbin.com/rifikereze/1#test2

  1. 在 Firefox 中打开控制台
  2. 确保在 Firefox 设置中启用 "persistent logs" 以在页面重新加载后保留日志
  3. 按 F5(您应该会看到一条控制台消息 "reloaded")
  4. 现在尝试移动页面,将光标放在地址栏中并按回车键
  5. 您会看到页面不会重新加载

我们如何检测这些事件(滚动事件除外)?

如果尝试重现,请确保在 Windows 上使用 Firefox。看起来其他操作系统有其他行为。

鉴于缺少答案,我推测的答案是 No

无法使用 URL 和地址栏中的片段标识符(又名 hash)检测浏览器的重新定位。

除此之外,浏览器似乎有不一致的行为:

  1. Firefox 在 Linux 上的行为与在 Windows 上的行为不同(它会重新加载页面)。
  2. Chrome 似乎忽略了重新定位,除非在卸载前将页面位置设置回顶部。
  3. 关于正常行为是重新加载还是重新定位似乎没有跨浏览器的标准。

检测片段标识符重新定位的唯一安全方法是在加载页面时。