“ javascript:void(0)”是什么意思?


1378
<a href="javascript:void(0)" id="loginlink">login</a>

我已经看过href很多次了,但是我不知道那是什么意思。


12
javascript:是许多URI方案之一:en.wikipedia.org/wiki/URI_scheme,例如data:
Ciro Santilli冠状病毒审查六四事件法轮功

3
您可以将其href="javascript:"用于相同的目的。如对这个问题的回答所述,该void(0)部分最初旨在用于javascript:URI处理不同的早期版本的浏览器。但是现在我什至找不到速记无法使用的版本,至少IE7可以正确处理。
用户

1
我也看过href =“ javascript://”,这样更好吗?
光剑

href =“ javascript://”不适用于我void(0)可以完美工作。
Sandip

Answers:


1040

void运算符计算给定表达式,然后返回undefined

void操作者经常被用来仅获取undefined原始值,通常使用“ void(0)”(这是相当于“ void 0”)。在这些情况下,undefined 可以改用全局变量(假设尚未将其分配给非默认值)。

此处提供了说明:voidoperator

您希望使用的href链接执行此操作的原因是,通常,javascript:URL会将浏览器重定向到评估该JavaScript的纯文本版本。但是,如果结果为undefined,则浏览器将停留在同一页面上。void(0)只是一个简短而简单的脚本,其计算结果为undefined


9
给href提供“未定义的原始值”是什么意思?
OMG

7
“通常是javascript:URL会将浏览器重定向到评估该javascript的结果的纯文本版本。”您能在这里举个例子吗?我从未见过这样的用法。
OMG

87
凤凰城正在谈论的一个例子是<a href="javascript: dosomething();">立即开始!</a>。如果dosomething返回false,则单击链接只会使浏览器退出页面并显示“ false”。但是... <a href="javascript: dosomething(); void(0)">立即开始!</a>可以避免此问题。继续并粘贴javascript:1 + 1; 进入浏览器地址栏。浏览器应显示“ 2”
Breton

9
因为void是一元运算符。无效不是值,也不是函数。它需要一个值才能在其右边操作,否则将引发错误。
布列塔尼

14
尝试在错误控制台中查找?它肯定会引发语法错误。这是无效的javascript。道格拉斯·克罗克福德(Douglas crockford)建议您远离虚无,因为一元运算符/函数/值的混淆过于昂贵。
布列塔尼

435

除了技术答案外,还javascript:void意味着作者做错了。

没有充分的理由使用javascript:伪URL(*)。在实践中,如果任何人尝试“书签链接”,“在新标签页中打开链接”等操作,都会引起混乱或错误。现在,这种情况已经发生了很多,人们已经习惯了单击新标签的中间键:它看起来像一个链接,您想在新标签中阅读它,但事实证明它根本不是真正的链接,并在单击鼠标中键时显示空白页或JS错误等不良结果。

<a href="#">是一种常见的替代方案,可能会较差。但是,您必须记住return falseonclick事件处理程序进入,以防止链接被跟踪并向上滚动到页面顶部。

在某些情况下,可能会有一个实际有用的地方指向链接。例如,如果您有一个控件,则可以单击它打开一个先前隐藏的控件<div id="foo">,使用它可以<a href="#foo">链接到它。或者,如果有一种非JavaScript的方式做同样的事情(例如,“ thispage.php?show = foo”将foo开头可见),则可以链接到该脚本。

否则,如果链接仅指向某个脚本,则它实际上不是链接,因此不应将其标记为链接。通常的做法是添加onclick<span><div>或者<a>没有href以某种方式和风格也要想清楚,你可以点击它。这就是StackOverflow [在撰写本文时所要做的;现在它使用href="#"]。

这样做的缺点是您失去了键盘控制权,因为您无法切换到span / div / bare-a或使用空格激活它。这是否实际上是不利的,取决于该元素打算采取哪种动作。您可以尝试通过tabIndex在元素上添加a 并监听Space按键来模仿键盘的交互性。但这绝不会100%重现真实的浏览器行为,尤其是因为不同的浏览器对键盘的响应可能不同(更不用说非视觉浏览器了)。

如果您确实想要一个不是链接但可以通过鼠标或键盘正常激活的元素,则您想要的是一个元素<button type="button">(或者<input type="button">对于简单的文本内容也是如此)。您始终可以使用CSS对其进行样式更改,因此,如果需要,它看起来更像是链接而不是按钮。但是由于它的行为就像一个按钮,因此您应该真正对其进行标记。

(*:在现场创作,反正很显然他们是有用的bookmarklet。javascript:伪网址是一个概念bizarreness:一点不点的位置的定位,而是调用当前位置内激活码他们造成了巨大的安全。浏览器和Web应用程序都出现问题,而Netscape永远不会发明。)


7
除了@bobince的出色文章:几个月前,我还对hrefs的跨浏览器键盘的可导航性进行了一些研究,包括怪癖和副作用。某些人可能会发现它很有用:jakub-g.github.com/accessibility/onclick
jakub.g 2013

2
@ThinkBonobo:自2009年以来,情况已经发生了变化!更新。
bobince 2014年

59
这是一种观点,不能回答问题。void(0)在许多情况下是必需的;“#”是一个黑客,它带来了很多问题(它在我编写的应用程序中不起作用,这使我进入了此页面)。
felwithe

12
我同意@feltwithe。为什么要强迫其他人“以特殊方式做事”?民国15年编程我还没有看到的口号是“它应该永远做这样”不会导致人自己制造的一个烂摊子
史蒂芬德萨拉斯

4
从UX角度来看,使用fragment-id是一个坏主意,因为除非preventDefault使用文档,否则它会使文档跳到页面顶部。如果将锚点用作表单上的按钮,请不要这样做。
乔什·哈布达斯

124

这意味着它什么也不会做。试图使链接不在任何地方“导航”。但这不是正确的方法。

您实际上应该只是return falseonclick事件中,如下所示:

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

通常,如果链接正在执行某些“ JavaScript-y”操作,则使用它。就像发布AJAX表单,交换图片一样。在这种情况下,您只需执行任何称为return的函数false

但是,为了使您的网站更加出色,通常,如果浏览者选择不运行JavaScript,通常会包含一个执行相同操作的链接。

<a href="backup_page_displaying_image.aspx"
   onclick="return coolImageDisplayFunction();">hello</a>

33
否否
-return

22
javascript:url协议是事实上的标准,不是真正的标准。因此href =“#” onclick =“ return false;” 符合标准,而href =“ javascript:void(0)”不符合标准,因为没有官方标准指定应执行的操作。
布列塔尼

10
最重要的是,Douglas Crockford不喜欢void,因此jslint会抱怨它。基本上,由于void是一个运算符,而不是一个值,因此它很混乱,并产生了许多诸如此类的问题。最好完全避免它。哈哈。
布列塔尼

4
布兰登:请参阅布伦顿的回应。我推荐的方式是最受支持的方式,正如我在帖子的第二部分所说的那样,在“适当”的网站上,您甚至都不会使用“#”,因为您将提供后备系统来解决缺乏javascript。
中午16:00

19
+1(包括完整的示例)。即使您对JavaScript所做的工作没有静态的HTML后备,也可以始终执行<a href="enableJavaScriptToSeeMyCompletelyAwesomeSite.html" onclick="completelyAwesome();return false;">
格兰特·瓦格纳

73

“#”与javascript:void的行为存在巨大差异

“#”将您滚动到页面的顶部,而“ javascript:void(0);” 才不是。

如果您要编码动态页面,这非常重要。用户不希望仅单击页面上的链接就返回顶部。


26
@Salvin:可以通过返回事件处理程序来抑制滚动到页面顶部的行为falseonclick="doSomething();return false;"如果doSomething()返回false,则可以使用onclick="return doSomething();"
格兰特·瓦格纳

40
@GrantWagner-或5年后,e.preventDefault()
trysis 2014年

1
您可能需要编辑/删除这个答案,因为"#"没有当你返回false滚动到顶部。
纳文

4
@Navin您是正确的,但是现在已经过时了。trysis的评论现在被认为是正确的方式。
Tim Seguine 2015年

66

这是将JavaScript函数添加到HTML链接的一种非常流行的方法。
例如:[Print]您在许多网页上看到的链接是这样写的:

<a href="javascript:void(0)" onclick="callPrintFunction()">Print</a>

为什么我们需要href消磨onclick单独可以完成这项工作?因为当用户将鼠标悬停在“打印”文本上时href,光标将变为尖号(ꕯ)而不是指针(👆)。仅hrefa标签上才会将其验证为超链接。

的替代方法href="javascript:void(0);"是使用href="#"。此替代方法不需要在用户浏览器中打开JavaScript,因此更加兼容。


7
如果关闭javascript,也没有任何用处。
杰森

12
您无需href获取指向的手形光标;只需要一点CSS。
约翰·蒙哥马利

1
为什么不将JavaScript函数放在href中而不是onclick上?
悉达多·甘地

2
我同意@Sid-如果您使用它来触发javascript函数,则<a href="javascript:callPrintFunction()">它会更干净(尽管如果它实际上不会带您到任何地方,则可能应该是锚点button而不是a锚点)。
DaveMongoose

href="#"可能会导致令人讨厌的意外-就像中止的xhr请求一样,恰好在点击该链接时被调用。最近,我很难调试一个网站,如果用户碰巧不是该网站的根地址,则该网站将终止oidc登录请求。#href导致它在xhr请求完成之前重新加载地址。
JustAMartin

44

标签上应始终带有href 。调用返回“未定义”的JavaScript函数就可以了。因此将链接到“#”。

Internet Explorer 6中没有href的锚标记不会a:hover应用样式。

是的,这是可怕的,轻微的危害人类罪,但Internet Explorer 6也是这样。

我希望这有帮助。

Internet Explorer 6实际上是危害人类的主要罪行。


25

值得一提的是,在检查undefined时有时会看到void 0,这仅仅是因为它需要较少的字符。

例如:

something === undefined

something === void 0

因此,某些缩小方法会将undefined替换为void 0。


10
一个值得注意的例子是TypeScript(实时示例),它会编译默认参数值以进行检查void 0。当许多方法使用默认参数值时,三个字符的差异会迅速加起来。
John Weisz

1
“因此,某些缩小方法将undefined替换为void0。” 终于我明白了!感谢@squall的详尽回答。
艾哈迈德·马哈茂德

22

用法的使用javascript:void(0)意味着HTML的作者滥用了anchor元素而不是button元素。

通过将href设置为“#”或“ javascript:void(0)”以防止页面刷新,锚点标记通常会与onclick事件一起使用以创建伪按钮。当复制/拖动链接,在新选项卡/窗口中打开链接,添加书签以及JavaScript仍在下载,错误输出或被禁用时,这些值会导致意外行为。这也将不正确的语义传达给辅助技术(例如,屏幕阅读器)。在这种情况下,建议改用a <button>。通常,您应该只使用锚来使用正确的URL进行导航。

资料来源:MDN的<a>Page


4
+1用于在一个老问题上显示语义html ...链接到位,按钮执行操作-如果我们不希望它看起来像按钮,则应清除样式。
kevlarr

最大的例外是图像映射,可能需要执行JavaScript。并且由于它不是按钮,所以它是具有多边形边界的链接,这是“唯一”的方法。

17

void是用于返回undefined值的运算符,因此浏览器将无法加载新页面。

除非它是一个返回null的JavaScript函数,否则Web浏览器将尝试使用任何用作URL的内容并将其加载。例如,如果我们单击这样的链接:

<a href="javascript: alert('Hello World')">Click Me</a>

那么将显示一条警报消息,而无需加载新页面,这是因为alert该函数返回了空值。这意味着,当浏览器尝试加载新页面时,它会显示为null并且没有任何内容可加载。

有关void运算符的重要注意事项是它需要一个值,并且不能单独使用。我们应该这样使用它:

<a href="javascript: void(0)">I am a useless link</a>

1
我见过人们使用javascript:null而不是void ...但这是一个问题。Chrome null可以工作,在Firefox中,它尝试加载页面null。很高兴您更新了。有趣的错误。
加文·皮金

我在javascript:null这样的代码库中找到了其他用途,但使用了javascript:null()却未定义,因此可以使用。
加文·皮金

1
因此,基本上就像jquery的prevendDefault并返回false一样?
罗伯特·罗查

16

要理解这一概念,首先应该了解JavaScript中的void运算符。

void运算符的语法为:void «expr»评估expr并返回未定义。

如果将void实现为函数,则其外观如下:

function myVoid(expr) {
    return undefined;
}

该void运算符的一个重要用法是-丢弃表达式的结果。

在某些情况下,重要的是要返回undefined而不是表达式的结果。然后可以使用void放弃该结果。一种这样的情况涉及到javascript:URL,对于链接,应避免使用URL,但对小书签有用。当您访问这些URL之一时,许多浏览器都会用评估URL“内容”的结果来替换当前文档,但前提是结果没有不确定。因此,如果要打开新窗口而不更改当前显示的内容,则可以执行以下操作:

javascript:void window.open("http://example.com/")

2
感谢您澄清“ void”的含义是什么!在其他答案中还不清楚,只是“ void引起争论”。
dbeachy1

好的答案,但有一个细节,void实现将类似于: function myVoid(expr) { expr(); return undefined; } 您忘记添加 expr();
Juanma Menendez

1
@Juanma Menendez:不正确。exprmyVoid()调用时已经被评估(该表达式的结果作为参数传递)
Udo G

@UdoG我很好奇,你怎么知道那个男人?你能解释一下吗?
Juanma Menendez

@JuanmaMenendez:函数参数中的表达式始终在调用函数本身之前进行求值。抱歉,我手头上没有任何文件可以说明这一点,但请您尝试一下:function() { alert("foo"); }是有效的表达式void(function() { alert("foo"); })收益undefined和它显示警报,而myVoid(function() { alert("foo"); })不会(在你的版,而不是一个戈帕尔亚达夫)。
Udo G


9

Web开发人员javascript:void(0)之所以使用它,是因为它是防止a标记默认行为的最简单方法。void(*anything*)返回undefined,这是一个虚假的值。并且返回假值就像return false在标记onclick事件中a阻止其默认行为一样。

因此,我认为这javascript:void(0)是防止a标记默认行为的最简单方法。


8

链接必须具有要指定的HREF目标,才能使其成为可用的显示对象。

大多数浏览器不会在

<A HREF="" 

标签,例如:

<A href="JavaScript:var elem = document.getElementById('foo');" 

因为大多数浏览器中的HREF标记都不允许空格,或者会将空格转换为%20(相当于SPACE的十六进制),这使得JavaScript绝对对解释器毫无用处。

因此,如果要使用A HREF标签执行内联JavaScript,则必须为HREF FIRST指定一个不太复杂(不包含空格)的有效值,然后在事件属性标签(如OnClick)中提供JavaScript ,OnMouseOver,OnMouseOut等。

典型的答案是做这样的事情:

<A HREF="#" onclick="var elem = document.getElementById('foo');">Get the object</a>

这可以正常工作,但是由于井号/井号指示它可以使页面跳至顶部。

只需在A HREF标签中提供井号/哈希标签即可实际指定根锚,默认情况下,根锚始终位于页面顶部,您可以通过在A HREF标签内指定NAME属性来指定其他位置。

<A NAME='middleofpage'></A>

然后,您可以将A HREF标记更改为跳转到“ middleofpage”并在OnClick事件中执行JavaScript,如下所示:

<A HREF="#middleofpage" onclick="var elem = document.getElementById('foo');">Get the object</a>

在很多时候,您都不希望该链接跳来跳去,因此您可以做两件事:

<A HREF="#thislinkname" name='thislinkname' onclick="var elem = document.getElementById('foo');">Get the object</a>

现在单击时将无处可去,但是它可能导致页面从当前视口重新居中。不好看 什么是使用A HREF提供内联JavaScript的最佳方法,而无需执行上述任何操作?JavaScript:无效(0);

<A HREF="JavaScript:void(0);" onclick="var elem = document.getElementById('foo');">Get the object</a>

这告诉浏览器现在不运行,而是执行有效的JavaScript:void(0);。首先在HREF标记中起作用,因为它不包含空格,也不会被解析为URL。相反,它将由编译器运行。VOID是一个关键字,当提供0的性能参数时,它返回UNDEFINED,它不使用更多的资源来处理不指定0就会出现的返回值(它对内存管理/性能更友好)。

接下来发生的事情是执行OnClick。页面不会移动,在显示方面不会发生任何事情。


+1解释所有的不同的方式这样一个锚可以处理。但我认为,<a>元素必须始终位于某处;如果仅在页面上执行某些javascript,<button>则应改用a。使用不仅<button>具有语义,而且可以使您摆脱有关如何侵入锚点的整个辩论href编辑:看起来@Ronnie Royston在下面的答案已经包含了这个论点。
Rabadash8820

1

JavaScript:不包含网址;这是void可以用来编写较短代码的地方。

var error1 = false,
    error2 = false,
    error3 = false;

function error1() {

  error1 = true;
}

function myFunction() {

  // You can easily return and call a function at once, if you don't care about myFunction's return value
  if (!someCondition1)
    return error1();

  // What if you want to set a value first?
  if (!someCondition2) {
    error2 = true;
    return
  }

  // Shortest way to return and set a value at once
  if (!someCondition3)
    return void(error3 = true);

  // More code goes here
}

如果赞成票的人至少可以说出为什么反对票,那将是很好的。我知道这不是问题的话题,但是我正在考虑所有来自搜索结果的人。
Maciej Krawczyk
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.