当点击触发 JavaScript 的链接时,如何阻止网页滚动到顶部?

当我有一个与 jQuery 或 JavaScript 事件相连接的链接时,例如:

<a href="#">My Link</a>

如何防止页面滚动到顶部?当我从锚移除 href 属性时,页面不会滚动到顶部,但是链接看起来不能点击。

195757 次浏览

您需要防止点击事件的默认操作(即导航到链接目标)发生。

有两种方法可以做到这一点。

选择1: event.preventDefault()

调用传递给处理程序的事件对象的 .preventDefault()方法。如果您使用 jQuery 绑定处理程序,那么该事件将是 jQuery.Event的一个实例,它将是 .preventDefault()的 jQuery 版本。如果使用 addEventListener绑定处理程序,那么它将是 Event和原始 DOM 版本的 .preventDefault()。无论哪种方式都能满足你的需要。

例子:

$('#ma_link').click(function($e) {
$e.preventDefault();
doSomething();
});


document.getElementById('#ma_link').addEventListener('click', function (e) {
e.preventDefault();
doSomething();
})

选择2: return false;

在 jQuery 中:

从事件处理程序返回 false 时,将自动调用 event.stop  传播()和 event.proventDefault ()

因此,使用 jQuery,您可以选择使用这种方法来防止默认的链接行为:

$('#ma_link').click(function(e) {
doSomething();
return false;
});

如果您使用的是原始 DOM 事件,那么这也可以在现代浏览器上使用,因为 HTML5规范规定了这种行为。但是,旧版本的规范没有这样做,所以如果您需要与旧版本浏览器的最大兼容性,应该显式地调用 .preventDefault()。有关规格细节,请参见 PreentDefault () vs return false (no jQuery)

试试这个:

<a href="#" onclick="return false;">My Link</a>

首先链接到比页面顶部更合理的地方。然后取消默认事件。

参见 务实的渐进增强规则2。

从您正在调用的代码返回 false 将会起作用,在许多情况下,这是首选的方法,但是您也可以这样做

<a href="javascript:;">Link Title</a>

当涉及到搜索引擎优化,它真的取决于你的链接将被用于什么。如果你真的要用它来链接到其他内容,那么我同意理想情况下你会希望这里有一些有意义的东西,但如果你是为了功能目的而使用链接,可能像 Stack Overflow 对于文章工具栏(粗体、斜体、超链接等)所做的那样,那么它可能并不重要。

一种简单的方法是利用这段代码:

<a href="javascript:void(0);">Link Title</a>

这种方法不强制页面刷新,因此滚动条保持不变。此外,它还允许您以编程方式更改 onclick 事件,并使用 jQuery 处理客户端事件绑定。

基于这些原因,上述解决方案比:

<a href="javascript:myClickHandler();">Link Title</a>
<a href="#" onclick="myClickHandler(); return false;">Link Title</a>

当且仅当 myClickHandler 方法没有失败时,最后一个解决方案将避免滚动跳转问题。

如果可以简单地更改 href值,则应使用:

<a href="javascript:void(0);">Link Title</a>

我刚想到的另一个简洁的解决方案是使用 jQuery 来阻止单击操作的发生并导致页面滚动,但仅限于 href="#"链接。

<script type="text/javascript">
/* Stop page jumping when links are pressed */
$('a[href="#"]').live("click", function(e) {
return false; // prevent default click action from happening!
e.preventDefault(); // same thing as above
});
</script>

您可以将 href 设置为 #!而不是 #

比如说,

<a href="#!">Link</a>

不会做任何滚动时点击。

小心!这仍然会在点击浏览器的历史记录中添加一个条目,这意味着在点击你的链接之后,用户的后退按钮不会将他们带到他们之前所在的页面。出于这个原因,最好使用 .preventDefault()方法,或者两者结合使用。

下面是一个小提琴的例子(只要把你的浏览器往下压,直到你得到一个滚动条) :
Http://jsfiddle.net/9deg7/


对于技术宅来说,为什么这么做:

这种行为在 HTML5规范的 导航到片段标识符部分中指定。与一个带有 href 的 "#"的链接导致文档滚动到顶部的原因是,这种行为被明确指定为处理空片段标识符的方法:

2. 如果 fragid是空字符串,那么文档的指定部分就是文档的顶部

使用 "#!"的 href 可以简单地工作,因为它避免了这个规则。这个叹号并没有什么神奇之处——它只是一个方便的片段标识符,因为它明显不同于一个典型的片段,而且不太可能与你页面上某个元素的 idname匹配。实际上,我们可以在 hash 之后放入几乎任何东西; 只有空字符串、单词‘ top’或匹配页面上元素的 nameid属性的字符串不够。

更确切地说,我们只需要一个片段标识符,这个片段标识符将使我们通过以下算法中的步骤8来从片段中确定 指明文件的一部分:

  1. 对 URL 应用 URL 解析器算法,并让 脆弱作为结果解析后的 URL 的片段组件。

  2. 如果 fragid是空字符串,那么指定的文档部分就是文档的顶部; 在这里停止算法。

  3. fragid bytes成为百分比解码 fragid的结果。

  4. decoded fragid成为将 UTF-8解码算法应用于 fragid bytes的结果。如果 UTF-8解码器发出解码器错误,则中止解码器并跳转到标记为 no decoded fragid的步骤。

  5. 如果 DOM 中有一个 ID 恰好等于 decoded fragid的元素,那么按树顺序排列的第一个这样的元素就是文档的指定部分; 在这里停止算法。

  6. 没有解码的片段 : 如果 DOM 中有一个元素,其 name 属性的值恰好等于 fragid(不是 decoded fragid) ,那么树形顺序中的第一个这样的元素就是文档的指定部分; 在这里停止算法。

  7. 如果 脆弱是字符串 top的不区分大小写的 ASCII 匹配,那么指定的文档部分就是文档的顶部; 在这里停止算法。

  8. 否则,文档中没有指定的部分。

只要我们进入第8步和 文件中没有指明的部分,下面的规则就会发挥作用:

如果没有指定的部分... 那么用户代理必须什么都不做。

这就是为什么浏览器不能滚动。

你也可以这样写:-

<a href="#!" onclick="function()">Delete User</a>

调用函数时,后面跟着 return false 例如:

<input  type="submit" value="Add" onclick="addNewPayment();return false;">

创建一个包含两个链接的页面-一个在顶部,一个在底部。单击顶部链接时,页面必须向下滚动到页面底部,其中存在底部链接。单击底部链接时,页面必须向上滚动到页面顶部。

此外,还可以在 点击属性中使用 事件,预防违约

<a href="#" onclick="event.preventDefault(); doSmth();">doSmth</a>

不需要编写额外的点击事件。

<a onclick="yourfunction()">

这将工作得很好。不需要添加 href = “ #”

你可能需要检查一下你的 CSS。在这里的例子中: https://css-tricks.com/the-checkbox-hack/position: absolute; top: -9999px;。这在 Chrome 上尤其愚蠢,因为 onclick="whatever"仍然跳转到被点击元素的绝对位置。

移除 position: absolute; top: -9999px;,对于 display: none;可能有帮助。

你应该把

<a href="#">My Link</a>

<a href="javascript:;">My Link</a>

这样,当点击链接时,页面不会滚动到顶部。这比使用 href = “ #”然后阻止默认事件运行要干净。

对于 这个问题的第一个答案,我有很好的理由,比如如果被调用的函数抛出一个错误,那么 return false;将不会执行,或者您可以将 return false;添加到 doSomething()函数中,然后忘记使用 return doSomething();

对于用于崩溃的 Bootstrap 3,如果您没有在锚点上指定 data-target 并依赖 href 来确定目标,那么事件将被阻止。如果使用 data-target,则需要自己防止事件的发生。

<button type="button" class="btn btn-default" data-toggle="collapse" data-target="#demo">Collapse This</button>


<div id="demo" class="collapse">
<p>Lorem ipsum dolor sit amet</p>
</div>

event.preventDefault()将停止滚动,但也不会改变链接状态到 visited (color),这是我需要的。 “3年后”的解决方案并不太晚,并消除了不可预见的副作用。 我创建的 href 在一个循环中(由“ i”索引)“ # i!”,其中 i 是包含锚标记文本的数组的索引。 非常有效。(只是 # 我也可以工作,除了我有其他 id 设置为 i)。

虽然我想使用‘ href = ‘ javascript: function ()’方法,但是这样会增加11个字节(javascript:)加上函数名的字节以及页面大小的参数。将此值乘以1000 + hrefs,即页面大小增加16kb + 。(是的,分页有帮助,但对用户没有帮助)。因此,在另一种情况下,我可能会使用 javascript: Solution。