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

IT技术 javascript html performance optimization href
2020-12-12 16:35:07

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

6个回答

我用javascript:void(0).

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

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

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

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

第三个原因是在某些情况下,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)"

第二个显然更容易沟通。

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

两者都不。

如果您可以拥有一个有意义的实际 URL,请将其用作 HREF。如果有人中间点击您的链接以打开新选项卡,或者他们禁用了 JavaScript,则 onclick 不会触发。

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

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

查看Unobtrusive JavaScript渐进式增强(均来自维基百科)。

“如果那不可能,那么”改用按钮。这就是这个答案应该结束的方式。
2021-02-23 16:35:07

<a href="#" onclick="myJsFunc();">Link</a><a href="javascript:void(0)" onclick="myJsFunc();">Link</a>或任何其他包含onclick属性的事情- 五年前还可以,但现在这可能是一种不好的做法。原因如下:

  1. 它促进了侵入性 JavaScript 的实践 - 结果证明它难以维护且难以扩展。Unobtrusive JavaScript 中有更多关于这方面的信息

  2. 您将时间花在编写极其冗长的代码上——这对您的代码库几乎没有(如果有的话)好处。

  3. 现在有更好、更简单、更易于维护和可扩展的方法来实现预期的结果。

不引人注目的 JavaScript 方式

根本就没有href属性!任何好的 CSS 重置都会处理丢失的默认光标样式,因此这不是问题。然后使用优雅且不引人注目的最佳实践附加您的 JavaScript 功能 - 由于您的 JavaScript 逻辑保留在 JavaScript 中,而不是在您的标记中,因此更易于维护 - 这在您开始开发需要将您的逻辑拆分成的大规模 JavaScript 应用程序时至关重要黑盒组件和模板。更多关于大规模 JavaScript 应用程序架构的信息

简单的代码示例

// Cancel click event
$('.cancel-action').click(function(){
    alert('Cancel action occurs!');
});

// Hover shim for Internet Explorer 6 and Internet Explorer 7.
$(document.body).on('hover','a',function(){
    $(this).toggleClass('hover');
});
a { cursor: pointer; color: blue; }
a:hover,a.hover { text-decoration: underline; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a class="cancel-action">Cancel this action</a>

黑盒化的Backbone.js示例

有关可扩展的、黑盒化的 Backbone.js 组件示例 -请参阅此处的 jsfiddle 工作示例请注意我们如何利用不显眼的 JavaScript 实践,并且在少量代码中有一个组件可以在页面上多次重复,而不会产生副作用或不同组件实例之间的冲突。惊人的!

笔记

  • 省略元素href属性a将导致无法使用tab键导航访问该元素如果您希望通过tab访问这些元素,您可以设置tabindex属性,或使用button元素代替。您可以轻松地将按钮元素设置为看起来像Tracker1's answer 中提到的普通链接

  • 省略元素href属性a将导致Internet Explorer 6Internet Explorer 7不采用a:hover样式,这就是为什么我们添加了一个简单的 JavaScript shim 来实现这一点a.hover这完全没问题,好像您没有 href 属性并且没有优雅的降级,那么您的链接无论如何都无法工作 - 您将有更大的问题需要担心。

  • 如果您希望您的操作在禁用 JavaScript 的情况下仍能正常工作,那么使用一个a带有href属性元素,该属性会转到某个 URL,该 URL 将手动执行该操作,而不是通过 Ajax 请求或任何应该采用的方式。如果您这样做,那么您要确保event.preventDefault()在单击时调用以确保单击按钮时它不会跟随链接。此选项称为优雅降级。

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

javascript:; 也表现得像 javascript:void(0);

如果您有基本 href,则#or#something将带您到基本 href页面上的锚点,而不是当前页面上。
2021-02-15 16:35:07
使用“#someNonExistantAnchorName”效果很好,因为它无处可跳。
2021-02-23 16:35:07
shebang ( #!) 可以解决问题,但这绝对是不好的做法。
2021-02-25 16:35:07
避免这种情况的方法是在 onclick 事件处理程序中返回 false。
2021-03-03 16:35:07
如果 JavaScript JS 没有成功运行,在事件处理程序中返回 false 并不能避免这种情况。
2021-03-09 16:35:07

老实说,我都不建议。我会<button></button>为这种行为使用风格化

button.link {
  display: inline-block;
  position: relative;
  background-color: transparent;
  cursor: pointer;
  border: 0;
  padding: 0;
  color: #00f;
  text-decoration: underline;
  font: inherit;
}
<p>A button that looks like a <button type="button" class="link">link</button>.</p>

这样你就可以分配你的onclick。我还建议通过脚本绑定,而不是使用onclick元素标签上的属性。唯一的问题是无法禁用的旧 IE 中的伪 3d 文本效果。


如果您必须使用 A 元素,请javascript:void(0);出于已经提到的原因使用

  • 如果您的 onclick 事件失败,将始终拦截。
  • 不会发生错误的加载调用,或基于哈希更改触发其他事件
  • 如果点击失败(onclick 抛出),哈希标签可能会导致意外行为,避免它,除非它是适当的失败行为,并且您想要更改导航历史记录。

注意:您可以将 替换为0一个字符串,例如javascript:void('Delete record 123')它可以作为一个额外的指示器,显示点击实际上会做什么。

这个答案应该是最重要的。如果您遇到这种困境,很可能您实际上需要一个button. 而且IE9正在迅速失去市场份额,幸运的是,1px的主动效果应该不会阻止我们使用语义标记。<a>是一个链接,旨在将您发送到某个地方,以便我们采取行动<button>
2021-02-08 16:35:07