如何防止点击“#”链接跳到页面顶部?


212

我目前<a>在jQuery中使用标签来启动诸如点击事件之类的事情。

例子是 <a href="#" class="someclass">Text</a>

但是我讨厌'#'如何使页面跳到页面顶部。我该怎么办?



2
我和戴维· 多沃德( David Dorward)在一起,还有关于重复的链接问题的gargantaun。如果您的网站上有链接,则它们需要充当普通链接。如果JavaScript拦截了它们并且做了不同的事情,那么一切都很好,但是您需要在那里有一个真实的链接,该链接指向一个真实的页面。出于各种原因,这是必要的,其中最重要的就是SEO和可访问性。
丹尼尔·普里登

“愚蠢是愚蠢的。”我们之前都去过那里:)
需要

Answers:


241

在jQuery中,当您处理click事件时, 返回false可阻止链接以通常的方式响应防止发生默认操作,即访问href属性(根据PoweRoy的评论和Erik的回答):

$('a.someclass').click(function(e)
{
    // Special stuff to do when this link is clicked...

    // Cancel the default action
    e.preventDefault();
});

1
@pranay:OP指定他正在使用jQuery处理这些链接。
BoltClock

8
而不是返回false,而是执行event.preventDefault()。对于将要阅读您的代码的人来说,这更加清楚。
RvdK

@PoweRoy:知道了。我进行了编辑,并学到了一些新的东西:)
BoltClock

5
@BoltClock OP应该使用按钮而不是锚来处理单击事件。您的答案非常有用,但是当href指向某个位置并且您此时不需要重定向。防止根本不需要采取默认操作的行为是一种建议,例如:握住刀子,抓住刀片并用手柄锤打钉子:)采取正确的工具进行工作!
Takehin 2010年

1
如果是jquery:$('a[href=#]').click(function(e) { e.preventDefault(); });
Snufkin '18

297

所以这很古老,但是...以防万一有人在搜索中找到它。

只需使用"#/"代替,"#"页面就不会跳转。


2
正是我需要的!即使在您发表评论一年后,这对我还是有帮助的,所以
扎克2015年

49
之所以有效,是因为它导航到名为的锚/,而不是因为#/没有任何意义。你可以做同样的事情#whateveryouwant,它会阻止跳转到顶部
俚语

3
这应该是最好的答案。谢谢你
GilbertoSánchez'16

1
@slang,虽然您是对的,但这只是挑剔,但我更喜欢使用“#/”而不是“ #whateveryouwant”,因为“#/”的用法非常普遍,因此可以显示意图(清洁代码)。虽然它仍然可能是答案的补充。
Jobbert

22
当心-这会在浏览器历史记录中创建一条记录,因此单击后退将不会执行用户认为单击#/或链接后的操作,例如#whatever
达伦·斯威尼

61

您甚至可以这样写:

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

林不知道它是一个更好的方法,但它是一种方法:)


这种方法对于HTML 4之前的版本来说是很好的方法,但是今天它是非常不好的做法,因为它破坏了太多的导航操作,例如“在新标签页中打开链接”。
Steve-o 2010年

7
您也许是对的,但是..在这种情况下,这无关紧要,因为他正在执行onclick事件,因此无论如何在新标签页中打开链接都
无法

快捷方式很href='javascript:;'不错,但是要小心,它会触发IE中的window.beforeUnload事件
Mihir,

这可能会破坏自己的功能吗?因为如果执行此操作,将不再触发渲染幻灯片的功能。
user3806549

29

解决方案1 ​​:(普通)

<a href="#!" class="someclass">Text</a>

解决方案2 :(需要javascript

<a href="javascript:void(0);" class="someclass">Text</a>

解决方案#3 :(需要jQuery

<a href="#" class="someclass">Text</a>
<script>
$('a.someclass').click(function(e) {
    e.preventDefault();
});
</script>

3
第一个解决方案是完美的。简短,干净,简单。这应该是公认的答案。谢谢!
AlmostPitt

1号是一个了不起的解决方案。谢谢!
布伦顿·斯科特


11

只需使用<input type="button" />代替,<a>然后使用CSS设置样式即可使其看起来像一个链接(如果您愿意)。

按钮是专门为单击而制作的,它们不需要任何href属性。

最好的方法是使用onload操作创建按钮并将其通过javascript附加到需要的位置,因此禁用javascript时,它们将不会显示,也不会使用户感到困惑。

使用时,href="#"您会得到大量指向同一位置的不同链接,当代理不支持JavaScript时,该链接将不起作用。


1
@kingjeffrey但是,无所事事总比导航到更好#
罗伯特

8

如果您想使用锚点,则可以使用http://api.jquery.com/event.preventDefault/,如建议的其他答案一样。

您还可以使用任何其他元素(例如跨度),并将click事件附加到该元素。

$("span.clickable").click(function(){
alert('Yeah I was clicked');
});

7

您可以将其#0用作href,因为0不允许将其用作ID,因此页面不会跳转。

<a href="#0" class="someclass">Text</a>

5
$('a[href="#"]').click(function(e) {e.preventDefault(); });

3
您能补充一个简短的解释吗?
JF Meier 2016年

在我看来,他在与href关联为“#”的任何锚点上添加了一个点击处理程序。这样,您将不必搜索已经存在的所有单击处理程序,并在其中添加e.preventDefault()。
Mani5556 '16

4

只需使用

<a href="javascript:;" class="someclass">Text</a>

JQUERY

$('.someclass').click(function(e) { alert("action here"); }

4

如果该元素没有有意义的href值,那么它实际上不是链接,那么为什么不使用其他元素呢?

正如Neothor所建议的那样,跨度是适当的,并且如果设置正确的样式,则可以作为单击项明显可见。您甚至可以附加一个悬停事件,以在用户的​​鼠标移到上方时使它“照亮”。

但是,话虽如此,您可能需要重新考虑您网站的设计,使其不使用javascript即可运行,但是在可用时可以通过javascript进行增强。


4

带有href =“#”的链接几乎应始终替换为button元素:

<button class="someclass">Text</button>

使用带有href =“#”的链接也是可访问性问题,因为这些链接对屏幕阅读器是可见的,屏幕阅读器将读出“链接-文本”,但是如果用户单击,它将不会出现在任何地方。


3

您可以只传递没有href属性的锚标记,然后使用jQuery进行所需的操作:

<a class="foo">bar</a>


我通常不推荐这种方法,因为如果用户禁用了js,则不会进行任何后备操作。但是考虑到您已经将href设置为#,我认为这对您来说不是问题,因此提供了此解决方案,因为它可能是满足您需求的最简单方法。
kingjeffrey

1
a:linkCSS选择器将不会定位到该锚标记。
BoltClock

BoltClock,这是事实。但是st4ck0v3rfl0w并不表示有此需要。
kingjeffrey

然后也可以使用<div>。我相信维护<a>的目的是保持其样式,这已经由常规<a>定义了。没有href,就不会像其他<a>一样检测到该样式并设置其样式。
MarsAndBack


3

#/技巧有效,但是将历史事件添加到浏览器。因此,单击后退不起作用,因为用户可能希望/期望这样做。

$('body').click('a[href="#"]', function(e) {e.preventDefault() }); 是我采用的方式,因为它适用于现有内容,并且在加载后将任何元素添加到DOM。

具体来说,我需要在.btn-group(Reference)内的引导下拉菜单中执行此操作,所以我做了:

$('body').click('.dropdown-menu li a[href="#"]', function(e) {e.preventDefault() });

这样,它就成为目标,并且不会影响页面上的其他任何内容。



3

有四种类似的方法可以防止没有任何JavaScript的页面跳转到顶部:

选项1:

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

选项2:

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

选项3:

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

选项4(不推荐):

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

但是,event.preventDefault()如果要在jQuery中处理click事件,最好使用。


3
尽管此代码可以回答问题,但提供有关如何和/或为什么解决问题的其他上下文将提高​​答案的长期价值。
苏力曼

2

您还可以在处理完jQuery后返回false。

例如。

$(".clickableAnchor").live(
    "click",
    function(){
        //your code
        return false; //<- prevents redirect to href address
    }
);

1
那和live方法都已被弃用,不应再使用。
昆汀2014年

2

我用这样的东西:

<a href="#null" class="someclass">Text</a>

2

为防止页面跳动,您需要在致电e.stopPropagation();后致电e.preventDefault();

stopPropagation防止事件沿DOM树上升。此处提供更多信息:https : //api.jquery.com/event.stoppropagation/


您能提供我可以粘贴到html中的完整代码吗?我正在使用Zurb Foundation 5.5.3。
Julie S.

2

如果要迁移到同一页面上的“锚定部分”而又不向上跳,请使用:

只需使用“#/”代替“#”即可

<a href="#/home">Home</a>
<a href="#/about">About</a>
<a href="#/contact">contact</a> page will not jump up on click..

1

之后添加一些东西,#将页面焦点设置到具有该ID的元素上。#/即使使用jQuery,最简单的解决方案是使用。但是,如果要在jQuery中处理事件,event.preventDefault()则是一种方法。


0

<a href="#!">Link</a><a href="#/">Link</a>不工作,如果一个人在同一个输入点击超过一次..它只是发生在1次时点击每多投入。

仍然最好的方法是 <a href="#">Link</a>

然后,

event.preventDefault();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.