【发布时间】:2015-12-31 06:06:40
【问题描述】:
我有一个单页网站,example.com。有两个部分:页面顶部的 intro 和页面底部的 contact。如果我想让某人访问 contact 部分而无需滚动浏览 intro,我会给他们这个链接:example.com/#contact .我在下面谈论这些访问。
浏览器自动向下滚动到contact部分,但是它忽略了页面顶部的固定导航,所以contact部分滚动到导航后面,所以contact 部分的顶部变得不可见。这就是我想使用 JavaScript 通过从滚动位置减去固定导航的高度来纠正的问题。让我们将此函数称为scrollCorrector。问题是我不知道这种自动滚动的确切时间,所以scrollCorrector 并不是每次都应该调用。
什么时候应该调用scrollCorrector?由于散列部分而发生自动滚动时。为什么不使用onscroll?因为这样我就无法区分自动滚动和用户滚动。为什么不在每个<a href="example.com/#contact"> 上使用onclick?我会使用它,但如果用户通过浏览器的后退按钮导航怎么办?好的,我也会使用onpopstate。但是,如果用户通过手动将 URL 重写为 example.com/#contact 而来自 example.com/#intro 怎么办?好的,我也会使用onhashchange。但是,如果用户已经在 example.com/#contact 上,点击地址栏,然后按 Enter 键而不做任何修改怎么办?以上都没有帮助。
那我应该听什么事件?如果不存在这样的事件,scrollCorrector 怎么会知道刚刚发生了自动滚动?
【问题讨论】:
-
问题是什么?什么是跳跃? (我可能是愚蠢的???)
-
我的意思是当浏览器滚动到文档中具有与 URL 的哈希部分匹配的 id 的特定元素时。
-
好的我想我现在明白了,但是你的问题很不清楚,你可能想更清楚地说明你的问题。没有内置功能可以执行您想要的操作,您可以执行类似stackoverflow.com/questions/487073/… 的操作,检查滚动时锚点是否可见。然后,当它“跳跃”时,您可以触发自定义事件。你的意思是这样的吗?
-
关于锚点只触发一个事件,您可以直接将事件绑定到锚点。但不幸的是,当用户在地址栏中按下回车键而不进行任何更改时,您将很难触发任何类型的事件。
-
我同意,但我不知道如何才能更清楚地描述问题。稍后我可能会重写它,但现在是凌晨 2 点,我没喝咖啡了。 :) 无论如何,谢谢你的帮助。我知道如何检查元素是否在视口中。我不知道什么时候应该检查它。我的意思是我知道何时检查它,但不知道事件是否发生。可以检测到对链接的点击。可以检测到哈希变化。但是无法检测到导致浏览器再次滚动到指定元素的“哈希更改为相同的哈希”。至少我还没弄明白。
标签: javascript dom-events anchor hashchange