<a href="javascript:void(0)" id="loginlink">login</a>
我见过很多次这样的href
,但我不知道这到底是什么意思。
href="javascript:"
用于相同目的。如 this question 的答案中所述,void(0)
部分最初是为早期版本的浏览器设计的,其中 javascript:
URI 处理不同。但是现在我什至找不到速记不起作用的版本,至少 IE7 可以正确处理这个问题。
href="javascript://"
和 href="javascript:void(0)"
是等价的。 //
是 JS 注释。
void 运算符计算给定的表达式,然后返回 undefined。 void 运算符通常仅用于获取未定义的原始值,通常使用“void(0)”(相当于“void 0”)。在这些情况下,可以使用全局变量 undefined 代替(假设它没有被分配给非默认值)。
此处提供了解释:void
operator。
您希望使用链接的 href
执行此操作的原因是,通常,javascript:
URL 会将浏览器重定向到评估该 JavaScript 的结果的纯文本版本。但如果结果是 undefined
,那么浏览器将停留在同一页面上。 void(0)
只是一个简短的脚本,其计算结果为 undefined
。
除了技术答案,javascript:void
表示作者做错了。
没有充分的理由使用 javascript:
伪 URL(*)。在实践中,如果有人尝试“书签链接”、“在新选项卡中打开链接”等内容,将会导致混淆或错误。这种情况经常发生,现在人们已经习惯了中间点击新标签:它看起来像一个链接,你想在新标签中阅读它,但结果证明它根本不是真正的链接,并在中键单击时给出不需要的结果,例如空白页或 JS 错误。
<a href="#">
是一种常见的替代方案,可以说它可能不那么糟糕。但是,您必须记住在您的 onclick
事件处理程序中使用 return false
以防止链接被跟踪并向上滚动到页面顶部。
在某些情况下,可能有一个实际有用的地方可以指向链接。例如,如果您有一个控件,您可以单击它打开以前隐藏的 <div id="foo">
,使用 <a href="#foo">
链接到它是有意义的。或者,如果有一种非 JavaScript 的方式来做同样的事情(例如,'thispage.php?show=foo' 将 foo 设置为以开头可见),你可以链接到它。
否则,如果链接仅指向某个脚本,则它不是真正的链接,不应这样标记。通常的方法是将 onclick
添加到 <span>
、<div>
或不带 href
的 <a>
并以某种方式设置样式以明确您可以点击它。这就是 StackOverflow [在撰写本文时所做的;现在它使用 href="#"
]。
这样做的缺点是你失去了键盘控制,因为你不能在 span/div/bare-a 上制表符或用空格激活它。这是否真的是一个缺点取决于元素打算采取什么样的行动。您可以通过向元素添加 tabIndex
并监听 Space 按键来尝试模仿键盘交互性。但它永远不会 100% 再现真实的浏览器行为,尤其是因为不同的浏览器对键盘的响应可能不同(更不用说非可视浏览器了)。
如果您确实想要一个不是链接但可以通过鼠标或键盘正常激活的元素,您想要的是 <button type="button">
(或 <input type="button">
一样好,对于简单的文本内容)。如果你愿意的话,你总是可以使用 CSS 来重新设置它的样式,使它看起来更像是一个链接而不是一个按钮。但由于它的行为就像一个按钮,所以你应该这样标记它。
(*:无论如何,在网站创作中。显然它们对书签很有用。javascript:
伪 URL 是一个概念上的怪异:一个不指向位置的定位器,而是调用当前位置内的活动代码。它们有对浏览器和 web 应用程序都造成了巨大的安全问题,Netscape 不应该发明。)
href
的跨浏览器键盘导航性进行了一些研究,包括怪癖和副作用;你们中的一些人可能会觉得它很有用:jakub-g.github.com/accessibility/onclick
<a href="#">
比 <span>
好,所以我很高兴 SO 发生了变化。但我的偏好仍然是 <button type="button">
/<input type="button">
+ 样式。
void(0)
; “#”是一个 hack,它带来了很多问题(它在我正在编写的应用程序中不起作用,它把我带到了这个页面)。
preventDefault
。如果锚点被用作表单上的按钮,请不要这样做。
这意味着它不会做任何事情。这是试图让链接不在任何地方“导航”。但这不是正确的方法。
您实际上应该只在 onclick
事件中使用 return false
,如下所示:
<a href="#" onclick="return false;">hello</a>
如果链接正在做一些“JavaScript-y”的事情,通常会使用它。就像发布 AJAX 表单,或者交换图像,或者其他什么。在这种情况下,您只需让任何被调用的函数返回 false
。
但是,为了使您的网站变得非常棒,通常您会包含一个执行相同操作的链接,如果浏览它的人选择不运行 JavaScript。
<a href="backup_page_displaying_image.aspx"
onclick="return coolImageDisplayFunction();">hello</a>
<a href="enableJavaScriptToSeeMyCompletelyAwesomeSite.html" onclick="completelyAwesome();return false;">
之类的操作。
这是向 HTML 链接添加 JavaScript 函数的一种非常流行的方法。
例如:您在许多网页上看到的 [Print]
链接是这样编写的:
<a href="javascript:void(0)" onclick="callPrintFunction()">Print</a>
为什么我们需要 href
而只有 onclick
才能完成工作?因为当用户在没有 href
的情况下将鼠标悬停在文本“打印”上时,光标将变为插入符号 (ꕯ) 而不是指针 (👆)。只有在 a
标记上具有 href
才能将其验证为超链接。
href="javascript:void(0);"
的替代方法是使用 href="#"
。这种替代方案不需要在用户的浏览器中打开 JavaScript,因此它更兼容。
href
来获取指向手形光标;所需要的只是一点 CSS。
<a href="javascript:callPrintFunction()">
更干净(尽管它可能应该是 button
而不是 a
nchor,如果它实际上并没有带你去任何地方) .
href="#"
可能会导致令人讨厌的意外 - 例如中止的 xhr 请求,恰好在点击该链接时被调用。如果用户碰巧位于不是站点根目录的地址中,我最近很难调试一个中止 oidc 登录请求的网站。 #
href 导致它在 xhr 请求完成之前重新加载地址。
#
与 javascript:void(0);
的行为存在巨大差异。
#
会将您滚动到页面顶部,但 javascript:void(0);
不会。
如果您正在编写动态页面,这一点非常重要,因为用户在单击页面上的链接时不想返回顶部。
false
返回到事件处理程序来抑制:onclick="doSomething();return false;"
,或者如果 doSomething()
返回 false
,您可以使用 onclick="return doSomething();"
。
e.preventDefault()
。
"#"
不滚动到顶部。
event
用于 e
。 event
变量在内联 html onclick
处理程序中可用。 <a href="#" onclick="event.preventDefault();">...</a>
你应该总是在你的 a 标签上有一个 href 。调用返回“未定义”的 JavaScript 函数就可以了。链接到“#”也是如此。
Internet Explorer 6 中没有 href 的锚标记不会应用 a:hover
样式。
是的,这是一种可怕的反人类罪行,而且是轻微的罪行,但 Internet Explorer 6 总体上也是如此。
我希望这有帮助。
Internet Explorer 6 实际上是一项重大的反人类罪行。
值得一提的是,您有时会在检查未定义时看到 void 0
,这仅仅是因为它需要较少的字符。
例如:
if (something === undefined) {
doSomething();
}
相比:
if (something === void 0) {
doSomething();
}
出于这个原因,一些缩小方法将 undefined
替换为 void 0
。
void 0
。当许多方法使用默认参数值时,3 个字符的差异会迅速增加。
false
、0
、""
和其他一些事情上做一些事情。
使用 javascript:void(0)
意味着 HTML 的作者滥用了锚元素来代替按钮元素。
锚标签经常与 onclick 事件一起被滥用,通过将 href 设置为“#”或“javascript:void(0)”来创建伪按钮,以防止页面刷新。在复制/拖动链接、在新选项卡/窗口中打开链接、添加书签以及 JavaScript 仍在下载、出错或被禁用时,这些值会导致意外行为。这也将不正确的语义传达给辅助技术(例如,屏幕阅读器)。在这些情况下,建议使用
来源:MDN's <a>
Page。
Web 开发人员使用 javascript:void(0)
是因为它是防止 a
标记默认行为的最简单方法。 void(*anything*)
返回 undefined
,它是一个假值。并且返回一个虚假值就像 a
标记的 onclick
事件中的 return false
阻止其默认行为。
所以我认为 javascript:void(0)
是防止 a
标签默认行为的最简单方法。
void
是用于返回 undefined
值的运算符,因此浏览器将无法加载新页面。
Web 浏览器将尝试获取任何用作 URL 的内容并加载它,除非它是返回 null 的 JavaScript 函数。例如,如果我们点击这样的链接:
<a href="javascript: alert('Hello World')">Click Me</a>
然后会在不加载新页面的情况下显示警告消息,这是因为 alert
是一个返回空值的函数。这意味着当浏览器尝试加载新页面时,它会看到 null 并且没有要加载的内容。
关于 void 运算符需要注意的重要一点是它需要一个值并且不能单独使用。我们应该像这样使用它:
<a href="javascript: void(0)">I am a useless link</a>
要理解这个概念,首先应该理解 JavaScript 中的 void 运算符。
void 运算符的语法是:void «expr»
,它计算 expr 并返回 undefined。
如果将 void 实现为函数,则如下所示:
function myVoid(expr) {
return undefined;
}
这个 void 运算符有一个重要的用法,那就是 - 丢弃表达式的结果。
在某些情况下,与表达式的结果相反,返回 undefined 很重要。然后可以使用 void 来丢弃该结果。一种这样的情况涉及 javascript: URL,应该避免使用链接,但对小书签很有用。当您访问其中一个 URL 时,许多浏览器会用评估 URL“内容”的结果替换当前文档,但前提是结果不是未定义的。因此,如果您想打开一个新窗口而不更改当前显示的内容,您可以执行以下操作:
javascript:void window.open("http://example.com/")
function myVoid(expr) { expr(); return undefined; }
You forgot add expr();
myVoid()
时已计算 expr
(该表达式的 result 作为参数传递)
function() { alert("foo"); }
是一个有效的表达式。 void(function() { alert("foo"); })
返回 undefined
并不显示警报,而 myVoid(function() { alert("foo"); })
显示(在您的版本中,不是 Gopal Yadav 的版本)。
链接必须具有要指定的 href
目标,以使其成为可用的显示对象。
大多数浏览器不会解析 <a>
元素的 href
中的高级 JavaScript,例如:
<a href="javascript:var el = document.getElementById('foo');">Get element</a>
由于大多数浏览器中的 href
标记不允许空格或将空格转换为 %20
(空格的 HEX 代码),因此 JavaScript 解释器会遇到多个错误。
因此,如果您想使用 <a>
元素的 href
执行内联 JavaScript,您必须首先为 href
指定一个不太复杂(不包含空格)的有效值,然后在onClick
、onMouseOver
、onMouseOut
等事件属性标签。
典型的答案是做这样的事情:
<a href="#" onclick="var el = document.getElementById('foo');">Get element</a>
这工作正常,但它使页面滚动到顶部,因为 href
中的 #
告诉浏览器这样做。
在 <a>
元素的 href
中放置 #
可指定根锚点,默认情况下位于页面顶部,但您可以通过在 <a>
元素内指定 name
属性来指定不同的位置。
<a name="middleOfPage"></a>
然后,您可以更改 <a>
元素的 href
以跳转到 middleOfPage
并在 onClick
事件中执行 JavaScript:
<a href="#middleOfPage" onclick="var el = document.getElementById('foo');">Get element</a>
很多时候您不希望该链接跳来跳去,因此您可以做两件事:
<a href="#thisLinkName" name="thisLinkCame" onclick="var elem = document.getElementById('foo');">Get element</a>
现在它在单击时将无处可去,但它可能会导致页面从其当前视口重新居中。
使用 <a>
元素的 href
(但不必执行上述任何操作)使用内联 javascript 的最佳方式是 JavaScript:void(0);
:
<a href="javascript:void(0);" onclick="var el = document.getElementById('foo');">Get element</a>
这告诉浏览器不要去任何地方,而是在 href
中执行 JavaScript:void(0);
函数,因为它不包含空格,并且不会被解析为 URL。它将由编译器运行。
void
是一个关键字,当提供 0
参数时返回 undefined
,它不再使用任何资源来处理在没有指定 0
的情况下会出现的返回值(它是更多的内存管理/性能友好)。
接下来发生的事情是 onClick
被执行。页面没有移动,显示方面没有任何反应。
<a>
元素必须总是去某个地方;如果它只在页面上执行一些 javascript,则应使用 <button>
。使用 <button>
更加语义化,并且使您免于关于如何破解锚的 href
的整个辩论。 编辑:看起来@Ronnie Royston 下面的回答已经涵盖了这个论点。
void
运算符计算给定表达式,然后返回 undefined。它避免刷新页面。
据我所知,void
operator 在 JavaScript 中有 3 个常见用途。您所指的 <a href="javascript:void(0)">
是使 <a>
标记成为空操作的常用技巧。一些浏览器根据它们是否具有 href
来不同地对待 <a>
标记,因此这是一种创建带有 href
的链接的方法,它什么都不做。
void
运算符是一个一元运算符,它接受一个参数并返回 undefined
。所以 var x = void 42;
表示 x === undefined
。这很有用,因为在 strict mode 之外,undefined
实际上是一个有效的变量名。因此,一些 JavaScript 开发人员使用 void 0
而不是 undefined
。理论上,您也可以执行 <a href="javascript:undefined">
,它与 void(0)
相同。