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

Posted

技术标签:

【中文标题】我应该为 JavaScript 链接使用哪个“href”值,“#”还是“javascript:void(0)”?【英文标题】:Which "href" value should I use for JavaScript links, "#" or "javascript:void(0)"? 【发布时间】:2010-09-13 04:28:37 【问题描述】:

以下是构建链接的两种方法,该链接的唯一目的是运行 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>

【问题讨论】:

【参考方案1】:

'#' 会将用户带回页面顶部,所以我通常使用void(0)

javascript:; 的行为也类似于 javascript:void(0);

【讨论】:

避免这种情况的方法是在 onclick 事件处理程序中返回 false。 在事件处理程序中返回 false 并不能避免如果 JavaScript JS 没有成功运行。 使用“#someNonExistantAnchorName”效果很好,因为它无处可跳转。 如果您有基本 href,那么 ##something 会将您带到 基本 href 页面上的锚点,而不是当前页面。 shebang (#!) 可以解决问题,但这绝对是不好的做法。【参考方案2】:

第一个,最好有一个真实的链接,以防用户禁用 JavaScript。只要确保返回 false 以防止在 JavaScript 执行时触发 click 事件。

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

如果你使用 Angular2,这种方式可行:

&lt;a [routerLink]="" (click)="passTheSalt()"&gt;Click me&lt;/a&gt;.

请看这里https://***.com/a/45465728/2803344

【讨论】:

所以在启用了 JavaScript 且支持此功能的用户代理中运行一个 JavaScript 函数,回退(对于 JS 因任何原因失败的用户代理)到页面顶部的链接?这很少是一个明智的后备。 “如果用户禁用了 JavaScript,最好有一个真正的链接可以跟随”,它应该转到一个有用的页面而不是#,即使它只是解释该站点需要 JS 才能工作。至于失败,我希望开发人员在部署之前使用适当的浏览器功能检测等。【参考方案3】:

不要忽视您的 URL 可能是必需的这一事实 - 在遵循引用之前触发 onclick,因此有时您需要在离开页面之前在客户端处理某些内容。

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

两者都不是。

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

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

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

查看 Unobtrusive JavaScriptProgressive enhancement(均为***)。

【讨论】:

“如果那不可能,那么”使用一个按钮。这个答案应该是这样结束的。【参考方案6】:

理想情况下你会这样做:

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

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

【讨论】:

【参考方案7】:

让禁用了 JavaScript 的用户可以访问您的网站非常好,在这种情况下,href 指向的页面执行与正在执行的 JavaScript 相同的操作。否则,我使用“#”和“return false;”来防止其他人提到的默认操作(滚动到页面顶部)。

谷歌搜索“javascript:void(0)”提供了很多关于这个主题的信息。其中一些,比如this one 提到了不使用 void(0) 的原因。

【讨论】:

博客条目没有引用关于为什么应该避免使用 javascript:void(0) 的参考。 链接现在(有效地)断开了。 可访问性不好的解决方案:dequeuniversity.com/rules/axe/3.0/href-no-hash 如果您想使用禁用内联 JavaScript 的严格内容安全策略,javascript:void(0); 也不好。【参考方案8】:

理想情况下,您应该有一个真实的 URL 作为非 JavaScript 用户的后备。

如果这没有意义,请使用# 作为href 属性。我不喜欢使用onclick 属性,因为它直接在HTML 中嵌入了JavaScript。更好的主意是使用外部 JS 文件,然后将事件处理程序添加到该链接。然后,您可以阻止默认事件,以便 URL 在用户单击后不会更改为附加 #

【讨论】:

【参考方案9】:

如果你问我也不行;

如果您的“链接”的唯一目的是运行一些 JavaScript 代码,则它不属于链接;而是一段带有 JavaScript 函数的文本。我建议使用带有onclick handler&lt;span&gt; 标签和一些基本的CSS 来模仿链接。链接是为导航而创建的,如果您的 JavaScript 代码不是用于导航,则它不应该是 &lt;a&gt; 标记。

例子:

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

【讨论】:

这种方法将“链接”限制为仅限鼠标操作。可以通过键盘访问锚点,并在按下 Enter 键时触发其 'onclick' 事件。 在 CSS 中硬编码颜色会阻止浏览器使用用户可能定义的自定义颜色,这可能是可访问性的问题。 &lt;span&gt;s 并不意味着任何事情。 &lt;A&gt;nchors 和 &lt;buttons&gt; 用于此目的! 在这里使用buttons 是更好的选择,而使用span 则不是。 “链接是为导航而创建的,如果您的 JavaScript 代码不是用于导航,则它不应该是 &lt;a&gt; 标记。” — 即使 JavaScript 代码是“用于导航”,链接可能不适合每次。【参考方案10】:

根据您想要完成的任务,您可以忘记 onclick 并只使用 href:

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

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

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

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

【讨论】:

唯一的缺点(从记忆中,我可能错了)是如果你没有href,IE不会认为A是A。 (所以 CSS 规则不起作用)【参考方案11】:

我相信您提出了错误的二分法。这不是唯一的两个选择。

我同意 D4V360 先生的建议,即使您使用的是锚标签,但您在这里并不真正拥有锚。您所拥有的只是文档的一个特殊部分,该部分的行为应该略有不同。 &lt;span&gt; 标签更合适。

【讨论】:

此外,如果您要将 a 替换为 span,则需要记住通过键盘使其可聚焦。【参考方案12】:

如果您使用链接作为一种方式只是执行一些 JavaScript 代码(而不是使用像 D4V360 强烈建议的跨度),只是这样做:

<a href="javascript:(function()%7Balert(%22test%22)%3B%7D)()%3B">test</a>

如果您使用带有 onclick 的链接进行导航,请不要在 JavaScript 关闭时使用 href="#" 作为后备。当用户点击链接时,这通常很烦人。相反,如果可能,请提供 onclick 处理程序将提供的相同链接。如果您不能这样做,请跳过 onclick 并在 href 中使用 JavaScript URI。

【讨论】:

如果 JS 关闭而不是看似什么都不做或只是转到页面顶部,这将给出错误 @mplungjan 如果 JS 处于关闭状态,则单击它不会执行任何操作,如果 JS 正在执行的操作没有非 js 替代表示/操作,这是有道理的。在我描述的情况下,将 href 设置为“#”或某个 URI 不再有用。 所以有 href="jsdisabled.html" 代替 @mplungjan 你可以。但是,这会离开页面。 @mplungjan 明白了。你可以这样做。那里没有争论。我个人只是有一个“这个页面需要 JS”的消息,当 JS 打开时,页面会消失。【参考方案13】:

我使用javascript:void(0)

三个原因。鼓励开发人员团队使用# 不可避免地会导致一些人使用这样调用的函数的返回值:

function doSomething() 
    //Some code
    return false;

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

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

第三个原因是在某些情况下onclick 事件属性是动态分配的。我更喜欢能够调用函数或动态分配它,而不必专门为一种或另一种连接方法编写函数。因此,我在 HTML 标记中的onclick(或任何东西)看起来像这样:

onclick="someFunc.call(this)"

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

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

因此,如果您是一个单独的开发人员,那么您显然可以做出自己的选择,但如果您作为一个团队工作,您必须声明:

使用href="#",确保onclick最后总是包含return false;,任何被调用的函数都不会抛出错误,如果你将函数动态附加到onclick属性,请确保以及不抛出错误它返回false

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

第二个显然更容易沟通。

【讨论】:

快进到 2013 年:javascript:void(0) 在启用 CSP 的 HTTPS 页面上违反了Content Security Policy。一种选择是在处理程序中使用href='#'event.preventDefault(),但我不太喜欢这个。也许您可以建立一个约定来使用href='#void',并确保页面上的任何元素都没有id="void"。这样,单击指向不存在锚点的链接将不会滚动页面。 您可以使用“#”,然后将点击事件绑定到所有带有“#”的链接作为href。这将在 jQuery 中完成:$('a[href="#"]').click(function(e) e.preventDefault ? e.preventDefault() : e.returnValue = false; ); #void 仍然会在浏览器历史记录中添加一个条目。另一种方法是使用返回 HTTP 状态 204 的资源的 URL(并且仍然使用 preventDefault - 204 只是一个后备)。 @Nathan Non-jquery: const voidLinks = document.querySelectorAll('a[href="#"') for (const voidLink of voidLinks) voidLink.addEventListener('click', e =&gt; e.preventDefault ? e.preventDefault() : e.returnValue = false ) voidLink.addEventListener('keypress', e =&gt; if (e.keyCode === 13) e.preventDefault ? e.preventDefault() : e.returnValue = false ) 这包括按键 Enter(代码 13)上的事件侦听器,用于人们使用键盘浏览页面。 @s3c 回车键已经触发了点击事件,那么最后一个监听器有必要吗?【参考方案14】:

如果您使用的是&lt;a&gt; 元素,请使用以下内容:

<a href="javascript:myJSFunc();" />myLink</a>

我个人稍后会附加一个带有 JavaScript 的事件处理程序(使用 attachEventaddEventListener 或者也许)。

【讨论】:

有人可以解释为什么这个答案有这么多反对意见吗? 这个答案有很多人反对,因为(如其他回复中所述)将 javascript 放在实际标签中被认为是非常糟糕的做法。点击处理程序不应该在 HTML 本身中。最佳答案最详细地解释了这一点。【参考方案15】:

我同意其他地方的建议,即您应该在 href 属性中使用常规 URL,然后在 onclick 中调用一些 JavaScript 函数。缺陷是,他们会在通话后自动添加return false

这种方法的问题是,如果功能不起作用或出现任何问题,链接将无法点击。 onclick 事件会一直返回false,所以不会调用正常的URL。

有一个非常简单的解决方案。如果它工作正常,让函数返回true。然后使用返回值来判断是否应该取消点击:

JavaScript

function doSomething() 
    alert( 'you clicked on the link' );
    return true;

HTML

<a href="path/to/some/url" onclick="return !doSomething();">link text</a>

注意,我否定了doSomething() 函数的结果。如果它有效,它将返回true,因此它将被否定(false)并且不会调用path/to/some/URL。如果函数将返回false(例如,浏览器不支持函数中使用的某些内容或其他任何错误),则将其取反为true,并调用path/to/some/URL

【讨论】:

【参考方案16】:

我建议改用&lt;button&gt; 元素,尤其是,如果控件应该对数据产生变化。 (类似于 POST。)

如果你不显眼地注入元素会更好,这是一种渐进增强。 (见this comment。)

【讨论】:

这取决于您是否需要 html 的 bem(块元素模型)上的按钮。【参考方案17】:

通常,您应该始终有一个后备链接,以确保禁用 JavaScript 的客户端仍然具有某些功能。这个概念被称为不显眼的 JavaScript。

示例...假设您有以下搜索链接:

<a href="search.php" id="searchLink">Search</a>

您始终可以执行以下操作:

var link = document.getElementById('searchLink');

link.onclick = function() 
    try 
        // Do Stuff Here        
     finally 
        return false;
    
;

这样,禁用 JavaScript 的人会被定向到 search.php,而使用 JavaScript 的观众会看到您的增强功能。

【讨论】:

【参考方案18】:

最好用jQuery,

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

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

锚标记标记将类似于

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

够简单!

【讨论】:

这就是我要说的。如果链接有一个有意义的后备网址,请使用它。否则,只需省略 href 或使用比 在语义上更合适的东西。如果每个人都提倡包括 href 在内的唯一原因是让手指悬停,那么简单的“a cursor: pointer; ”就可以解决问题。 我可以说这是 SO 决定采用的选项。例如,检查“标志”链接。 这提供了可怕的可访问性。在 SO 中尝试:不使用鼠标就无法标记帖子。 “链接”和“编辑”链接可以通过 Tab 键访问,但“标志”不是。 我同意这个选项。如果锚点除了 JavaScript 之外没有其他用途,那么它不应该有 href。 @Fatih:使用 jQuery 意味着如果 JavaScript 被禁用,链接将没有指针。 如果你要走这条路,为什么不使用jQuery绑定点击呢?使用 jQuery 的部分好处是能够将 javascript 与标记分开。【参考方案19】:

只是为了了解其他一些人提到的观点。

最好绑定事件 'onload'a 或 $('document').ready;然后将 JavaScript 直接放入点击事件中。

在 JavaScript 不可用的情况下,我会使用一个 href 指向当前 URL,也许还可以使用一个指向链接位置的锚点。该页面对于没有 JavaScript 的人仍然可以使用,那些不会注意到任何差异的人。

我手头有,这里有一些 jQuery 可能会有所帮助:

var [functionName] = function() 
   // do something
;

jQuery("[link id or other selector]").bind("click", [functionName]);

【讨论】:

如果你有很多复杂的行为,LowPro 非常适合不显眼的 JS。【参考方案20】:

你也可以像这样在锚中写一个提示:

<a href="javascript:void('open popup image')" onclick="return f()">...</a>

这样用户就会知道这个链接的作用。

【讨论】:

【参考方案21】:

我使用以下

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

改为

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

【讨论】:

href="javascript:"href="javascript:void 0;" 也都是等价的,但它们都同样糟糕。【参考方案22】:

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

    污染历史 实例化引擎的新副本 在全局范围内运行并且不考虑事件系统。

当然,带有防止默认操作的 onclick 处理程序的“#”会更好。此外,一个仅用于运行 JavaScript 的链接并不是真正的“链接”,除非您在出现问题时将用户发送到页面上的某个合理的锚点(只有 # 将发送到顶部)。您可以简单地使用样式表模拟链接的外观和感觉,而完全忘记 href。

另外,关于cowgod的建议,特别是这个:...href="javascript_required.html" onclick="...这个方法很好,但是它没有区分“JavaScript disabled”和“onclick failed”两种情况。

【讨论】:

【参考方案23】:

#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 属性和协议被认为是不好的形式。

【讨论】:

@Muhd:返回应该在链接上激活click...【参考方案24】:

与整体观点完全一致,需要时使用void(0),需要时使用有效网址。

使用URL rewriting,您可以使 URL 不仅可以在禁用 JavaScript 的情况下执行您想做的事情,而且还可以准确地告诉您它要做什么。

<a href="./Readable/Text/URL/Pointing/To/Server-Side/Script" id="theLinkId">WhyClickHere</a>

在服务器端,你只需要解析 URL 和查询字符串,然后做你想做的事。如果您很聪明,您可以允许服务器端脚本以不同的方式响应 Ajax 和标准请求。让您拥有简洁的集中式代码来处理页面上的所有链接。

URL rewriting tutorials

优点

显示在状态栏中 通过 JavaScript 中的 onclick 处理程序轻松升级到 Ajax 实际上是自我调整 防止您的目录被一次性使用的 HTML 文件弄得乱七八糟

缺点

仍应在 JavaScript 中使用 event.preventDefault() 在服务器端进行相当复杂的路径处理和 URL 解析。

我敢肯定还有很多缺点。随意讨论它们。

【讨论】:

【参考方案25】:

这里还有一件更重要的事情要记住。 Section 508 合规性。 正因为如此,我觉得有必要指出您需要屏幕阅读器的锚标记,例如JAWS,以便能够通过选项卡对其进行聚焦。因此,“只使用 JavaScript 并忘记开头的锚点”的解决方案不是其中一些选项。仅当您无法让屏幕跳回顶部时,才需要在 href 中触发 JavaScript。您可以使用 0 秒的 settimeout 并将 JavaScript 触发到您需要关注的位置,但即使是 apage 也会跳到顶部然后返回。

【讨论】:

【参考方案26】:

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

【讨论】:

【参考方案27】:

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

【讨论】:

作为参考,#self 似乎并不特别。任何与文档中任何元素的名称或 id 不匹配的片段标识符(并且不是空白或“顶部”)都应该具有相同的效果。【参考方案28】:

我强烈希望尽可能地让我的 JavaScript 远离我的 HTML 标记。如果我使用&lt;a&gt; 作为点击事件处理程序,那么我建议使用&lt;a class="trigger" href="#"&gt;Click me!&lt;/a&gt;

$('.trigger').click(function (e) 
    e.preventDefault();
    // Do stuff...
);

值得注意的是,许多开发人员认为将锚标记用于点击事件处理程序并不好。他们希望您使用 &lt;span&gt;&lt;div&gt; 和一些添加 cursor: pointer; 的 CSS。这是一个争论不休的问题。

【讨论】:

【参考方案29】:

我基本上是在转述this practical article using progressive enhancement。 简短的回答是你永远不要使用javascript:void(0);#,除非你的用户界面已经推断出JavaScript 已启用,在这种情况下你应该使用javascript:void(0);。另外,不要使用 span 作为链接,因为这在语义上是错误的。

在您的应用程序中使用 SEO 友好的 URL 路由,例如 /Home/Action/Parameters 也是一种很好的做法。如果你有一个链接到一个没有 JavaScript 的页面,你可以在之后增强体验。使用指向工作页面的真实链接,然后添加 onlick 事件以增强演示效果。

这是一个示例。 Home/ChangePicture 是页面上的表单的工作链接,带有用户界面和标准的 HTML 提交按钮,但它看起来更好地注入到带有 jQ​​ueryUI 按钮的模式对话框中。无论哪种方式都有效,具体取决于满足移动优先开发的浏览器。

<p><a href="Home/ChangePicture" onclick="return ChangePicture_onClick();" title="Change Picture">Change Picture</a></p>

<script type="text/javascript">
    function ChangePicture_onClick() 
        $.get('Home/ChangePicture',
              function (htmlResult) 
                  $("#ModalViewDiv").remove(); //Prevent duplicate dialogs
                  $("#modalContainer").append(htmlResult);
                  $("#ModalViewDiv").dialog(
                      width: 400,
                      modal: true,
                      buttons: 
                          "Upload": function () 
                              if(!ValidateUpload()) return false;
                              $("#ModalViewDiv").find("form").submit();
                          ,
                          Cancel: function ()  $(this).dialog("close"); 
                      ,
                      close: function ()  
                  );
              
        );
        return false;
    
</script>

【讨论】:

在 SEO 方面我更喜欢这种方式。使用尽可能多的友好 URL 肯定会提高页面价值因素。【参考方案30】:

我从你的话中了解到,你想创建一个链接只是为了运行 JavaScript 代码。

那么你应该考虑到有些人在他们的浏览器中阻止了 JavaScript。

因此,如果您真的打算将该链接仅用于运行 JavaScript 函数,那么您应该动态添加它,这样即使用户没有在浏览器中启用他们的 JavaScript 并且您正在使用它,也不会看到它链接只是为了触发一个 JavaScript 函数,当在浏览器中禁用 JavaScript 时,使用这样的链接是没有意义的。

因此,当 JavaScript 被禁用时,它们都不好。

如果启用了 JavaScript 并且您只想使用该链接来调用 JavaScript 函数,那么

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

比使用更好的方法

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

因为 href="#" 会导致页面执行不需要的操作。

另外,&lt;a href="javascript:void(0)" onclick="myJsFunc();"&gt;Link&lt;/a&gt; 优于 &lt;a href="#" onclick="myJsFunc();"&gt;Link&lt;/a&gt; 的另一个原因是 JavaScript 被用作大多数浏览器的默认脚本语言。以 Internet Explorer 为例,它使用 onclick 属性来定义将使用的脚本语言的类型。除非弹出另一种好的脚本语言,否则 Internet Explorer 也会默认使用 JavaScript,但如果使用另一种脚本语言 javascript:,它将让 Internet Explorer 了解正在使用的脚本语言。

考虑到这一点,我更喜欢使用和锻炼

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

足以使其成为一种习惯并更加用户友好,请在 JavaScript 代码中添加此类链接:

$(document).ready(function()
    $(".blabla").append('<a href="javascript:void(0)" onclick="myJsFunc();">Link</a>')
);

【讨论】:

以上是关于我应该为 JavaScript 链接使用哪个“href”值,“#”还是“javascript:void(0)”?的主要内容,如果未能解决你的问题,请参考以下文章

我应该使用哪个JavaScript库进行客户端连字?

在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?

在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?

在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?

在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?

在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?