我应该为JavaScript链接使用哪个“ href”值,“#”或“ javascript:void(0)”?

JavaScript

Gil伽罗小宇宙

2020-03-09

以下是构建链接的两种方法,其唯一目的是运行JavaScript代码。在功能,页面加载速度,验证目的等方面哪个更好?

function myJsFunc() {
    alert("myJsFunc");
}
<a href="#" onclick="myJsFunc();">Run JavaScript Code</a>

要么

function myJsFunc() {
    alert("myJsFunc");
}
 <a href="javascript:void(0)" onclick="myJsFunc();">Run JavaScript Code</a>

第150篇《我应该为JavaScript链接使用哪个“ href”值,“#”或“ javascript:void(0)”?》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

22个回答
null 2020.03.09

我相信您提出的是错误的二分法。这些不是仅有的两个选择。

我同意D4V360先生的意见,他建议,即使您使用的是定位标记,也没有真正的定位标记。您所拥有的只是文档的特殊部分,其行为应略有不同。一个<span>标签是更为合适。

理查德十三 2020.03.09

我用开发人员工具在谷歌浏览器中尝试了两次,id="#"花了0.32秒。而该javascript:void(0)方法仅花费了0.18秒。因此,在谷歌浏览器中,javascript:void(0)效果更好,更快。

卡卡西卡卡西 2020.03.09

根据您要完成的工作,您可能会忘记onclick而仅使用href:

<a href="javascript:myJsFunc()">Link Text</a>

它绕过了返回false的需要。我不喜欢该#选项,因为如上所述,它将把用户带到页面顶部。如果您在其他地方未启用JavaScript来发送用户(这在我工作的地方很少见,但这是一个很好的主意),那么Steve提出的方法非常有用。

<a href="javascriptlessDestination.html" onclick="myJSFunc(); return false;">Link text</a>

最后,javascript:void(0)如果您不希望任何人去任何地方并且不想调用JavaScript函数,则可以使用。如果您有想要发生鼠标悬停事件的图像,则效果很好,但是用户没有任何可单击的东西。

猿小小 2020.03.09

如果没有,href也许没有理由使用锚标签。

您几乎可以在每个元素上附加事件(单击,悬停等),那么为什么不只使用a spandiv?呢?

对于禁用了JavaScript的用户:如果没有后备广告(例如,Alternative href),那么他们至少应该根本无法看到该元素并与之交互,无论它是<a>还是<span>标签。

小哥卡卡西 2020.03.09

如果碰巧正在使用AngularJS,则可以使用以下代码:

<a href="">Do some fancy JavaScript</a>

不会做什么。

此外

  • 与(#)一样,它不会带您到页面顶部。
    • 因此,您无需false使用JavaScript 显式返回
  • 简而言之
Sam番长逆天 2020.03.09

因此,当您使用<a />标记来做一些JavaScript事情时,如果您也放置标记,则href="#"可以在事件结束时添加return false (如果是内联事件绑定),例如:

<a href="#" onclick="myJsFunc(); return false;">Run JavaScript Code</a>

或者,您可以使用JavaScript 更改href属性,例如:

<a href="javascript://" onclick="myJsFunc();">Run JavaScript Code</a>

要么

<a href="javascript:void(0)" onclick="myJsFunc();">Run JavaScript Code</a>

但是从语义上讲,以上所有实现此目的的方法都是错误的(尽管效果很好)如果未创建任何元素来导航页面并且具有与之相关联的一些JavaScript东西,则该元素不应为<a>标记。

您可以简单地使用a <button />代替做事,也可以根据需要使用其他任何元素,例如b,span或任何适合的元素,因为您可以在所有元素上添加事件。


所以,有一个好处来使用<a href="#">这样做时,默认情况下会在该元素上获得光标指针a href="#"为此,我认为您可以为此使用CSS,cursor:pointer;也可以解决此问题。

最后,如果您要绑定JavaScript代码本身的事件,则可以event.preventDefault()在使用<a>标签的情况下实现此目的,但是,如果您不<a>为此使用标签,则可以得到好处,而不会不需要这样做。

因此,如果您看到了,最好不要对此类内容使用标签。

乐乐 2020.03.09

不要仅出于运行JavaScript的目的而使用链接。

使用href =“#”会将页面滚动到顶部;使用void(0)会在浏览器中造成导航问题。

而是使用链接以外的其他元素:

<span onclick="myJsFunc()" class="funcActuator">myJsFunc</span>

并使用CSS设置样式:

.funcActuator { 
  cursor: default;
}

.funcActuator:hover { 
  color: #900;
}
樱古一 2020.03.09

最好使用jQuery,

$(document).ready(function() {
    $("a").css("cursor", "pointer");
});

并省略href="#"href="javascript:void(0)"

锚标记标记将类似于

<a onclick="hello()">Hello</a>

很简单!

番长Jim路易 2020.03.09

我选择use javascript:void(0),因为使用此方法可能会阻止右键单击以打开内容菜单。但是javascript:;更短并且做同样的事情。

老丝村村 2020.03.09

我会用:

<a href="#" onclick="myJsFunc();return false;">Link</a>

原因:

  1. 这使得href简单的搜索引擎需要它。如果您使用其他任何东西(例如字符串),则可能会导致404 not found错误。
  2. 当鼠标悬停在链接上时,并不表示它是脚本。
  3. 通过使用return false;,页面不会跳到顶部或断开back按钮。
乐泡芙 2020.03.09

除非您使用JavaScript写出链接(以便您知道已在浏览器中启用该链接),否则,理想情况下,应该为禁用了JavaScript进行浏览的用户提供正确的链接,然后阻止onclick中该链接的默认操作事件处理程序。这样,那些启用了JavaScript的用户将运行该功能,而那些禁用JavaScript的用户将跳至相应的页面(或同一页面内的位置),而不仅仅是单击链接而没有任何反应。

乐卡卡西 2020.03.09

绝对哈希(#)更好,因为在JavaScript中,它是一个伪方案:

  1. 污染历史
  2. 实例化引擎的新副本
  3. 在全局范围内运行,并且不遵守事件系统。

当然,带有防止默认操作的onclick处理程序的“#”要好得多。而且,仅在运行JavaScript时才有的链接并不是真正的“链接”,除非您在出现问题时将用户引导到页面上的某个合理锚点(只是#会发送到顶部)。您可以简单地模拟与样式表链接的外观,而完全不用考虑href。

另外,关于cowgod的建议,尤其是这样:...href="javascript_required.html" onclick="...这是一个好方法,但是不能区分“ JavaScript禁用”和“ onclick失败”两种情况。

Ss Yy 2020.03.09

我通常去

<a href="javascript:;" onclick="yourFunction()">Link description</a>

它比javascript:void(0)短,并且执行相同的操作。

十三古一神奇 2020.03.09

我建议改用<button>元素,尤其是在控件应该在数据中进行更改的情况下。(有点像POST。)

如果不加干扰地注入元素(一种渐进增强),那就更好了。(请参阅此评论。)

宝儿小哥小卤蛋 2020.03.09

#比更好javascript:anything,但以下更好:

HTML:

<a href="/gracefully/degrading/url/with/same/functionality.ext" class="some-selector">For great justice</a>

JavaScript:

$(function() {
    $(".some-selector").click(myJsFunc);
});

您应该始终努力使性能降级(在用户未启用JavaScript的情况下……以及在符合规格和预算的情况下)。另外,直接在HTML中使用JavaScript属性和协议也被认为是不好的形式。

Sam神乐番长 2020.03.09

你也不要问我。

如果您的“链接”的唯一目的是运行一些JavaScript代码,则该链接不符合链接的条件;而是一段带有JavaScript函数的文本。我建议使用带有<span>标签的标签onclick handler和一些基本的CSS来模仿链接。链接用于导航,如果您的JavaScript代码不用于导航,则不应将其作为<a>标签。

例:

function callFunction() { console.log("function called"); }
.jsAction {
    cursor: pointer;
    color: #00f;
    text-decoration: underline;
}
<p>I want to call a JavaScript function <span class="jsAction" onclick="callFunction();">here</span>.</p>

猪猪十三 2020.03.09

我用以下

<a href="javascript:;" onclick="myJsFunc();">Link</a>

代替

<a href="javascript:void(0);" onclick="myJsFunc();">Link</a>
L前端 2020.03.09

使用只会#产生一些有趣的动作,因此,#self如果您希望节省的打字工作,我建议使用JavaScript bla, bla,

逆天路易 2020.03.09

理想情况下,您可以这样做:

<a href="javascriptlessDestination.html" onclick="myJSFunc(); return false;">Link text</a>

或者,甚至更好的是,您将在HTML中具有默认的动作链接,并且会在DOM呈现后通过JavaScript将onclick事件毫不费力地添加到元素中,从而确保如果不存在/未使用JavaScript,您不会有无用的事件处理程序使您的代码混乱,并可能混淆(或至少分散您的注意力)您的实际内容。

Tom猿 2020.03.09

我用javascript:void(0)

三个原因。鼓励#在一组开发人员中使用,不可避免地导致某些人使用这样的函数的返回值:

function doSomething() {
    //Some code
    return false;
}

但是后来他们忘记了return doSomething()在onclick中使用,而只是使用doSomething()

避免的第二个原因#是,return false;如果被调用的函数抛出错误,则最终将不会执行。因此,开发人员还必须记住在调用的函数中适当地处理任何错误。

第三个原因是在某些情况下,onclick事件属性是动态分配的。我更喜欢能够调用一个函数或动态分配它,而不必专门为一种附加方法或另一种附加方法编写函数。因此,我onclick(或任何形式)的HTML标记如下所示:

onclick="someFunc.call(this)"

要么

onclick="someFunc.apply(this, arguments)"

使用javascript:void(0)可以避免上述所有麻烦,而且我还没有发现任何不利方面的例子。

因此,如果您是一个孤独的开发人员,那么您可以明确地做出自己的选择,但是如果您是团队合作,则必须声明以下两种情况:

请使用href="#",确保onclick始终return false;在最后包含任何被调用的函数都不会引发错误,并且,如果您将函数动态地附加到onclick属性,请确保它不会抛出错误也返回false

要么

采用 href="javascript:void(0)"

第二种显然更容易沟通。

达蒙武藏 2020.03.09

第一个,理想情况下带有真实链接,以防用户禁用JavaScript。只要确保返回false即可防止JavaScript执行时触发click事件。

<a href="#" onclick="myJsFunc(); return false;">Link</a>

如果您使用Angular2,则这种方式有效:

<a [routerLink]="" (click)="passTheSalt()">Click me</a>

看到这里https://stackoverflow.com/a/45465728/2803344

L神无Mandy 2020.03.09

都不行

如果您可以使用一个有意义的实际URL,则可以将其用作HREF。如果有人在您的链接上单击鼠标中键以打开新标签,或者禁用了JavaScript,则onclick不会触发。

如果不可能,那么至少应使用JavaScript和适当的click事件处理程序将锚标记注入文档中。

我意识到这并非总是可能的,但我认为在开发任何公共网站时都应努力做到这一点。

查看Unobtrusive JavaScriptProgressive增强功能(均为Wikipedia)。

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android