没有href="#"的脚本链接

64

我的网络应用程序使用了很多 <a href="#">执行客户端脚本操作</a> 锚链接,用于编写脚本(这是我十多年前使用Dreamweaver时养成的习惯),现在我开始质疑这是否必要。

实际上,我不知道为什么首先要使用 <a href="#"> - 我的猜测是存在 href 属性会导致浏览器应用 :link:visited 伪类,简化样式表。它还使浏览器隐式应用 cursor: pointer 属性,这可能是理想的。

我使用 jQuery(经过短暂尝试 MooTools 后),即使没有 href="#" 属性和值,链接也能正常工作,所以我应该完全删除该属性并修改样式表以补偿 :link 伪类的移除吗?我可能忽略了其他事情吗?该属性赋予锚元素某种半文档化的神秘力量吗?

7个回答

109

<a> 代表锚点

如果在 <a> 元素上包含 [href] 属性,它就是一个指向某个位置的锚点,这意味着你可以跳转到一个新页面、当前页面的特定片段(因此称为片段标识符的 #)或新页面的特定片段。

没有 [href] 属性的 <a> 元素以前通常会被分配一个 [name] 属性,该属性可用作片段标识符的目标。后来浏览器添加了支持链接到任何项的 [id] 属性,并且现在将其视为链接到文档片段的首选方法。

这对独立的 <a> 元素意味着什么?

一个带有a[href]属性的元素是一个链接(这就是为什么它们与:link在css中匹配的原因)。链接可以被点击。如果没有[href]属性的a元素只是一个占位符,用于放置链接的位置, 不可点击,也不在页面的制表顺序中。
如果您想让您的链接可以通过键盘导航,这对无障碍性非常重要(WAI-ARIA),您需要执行以下操作之一:
  • 将元素更改为<button type="button">
  • 保留[href]属性
  • 添加[tabindex="0"],其中之一是[role="button"][role="link"](可能还需要一些样式)

关于[role]属性的更多信息可以在WAI-ARIA文档角色模型章节中找到。

更改标记

如果您没有保留[href]属性的理由,那么最好使用<button>元素:

<button type="button">
        ^^^^^^^^^^^^^

[type] 属性用于将元素设为通用按钮,否则 <button> 将默认为 [type="submit"],这可能不是理想的选择,因为它可能会触发表单提交。

如果您无法使用 <button>(通常在内部标记必须包含 <div> 时会出现),则可以使用以下方法模拟 <button>

<div role="button" tabindex="0">Some clickable text</div>

您需要监听keypress事件,并触发click事件以响应EnterSpace按键。

保留标记

如果您要保留<a>元素及其[href]属性,那么有许多选项可供选择。

真实链接

例如:

  • <a href="/some/location/for/users/without/js">
  • <a href="#document-fragment">

如果您需要为禁用JS的用户提供支持,您可以将他们重定向到一个页面,在该页面上执行等效功能而不使用JS。

此外,这也包括提供文档片段链接以链接到同一文档中的内容。例如,可切换区域可能会被标记为:

<a href="#more" class="toggleable">Read More</a>
<div id="more">Lorem ipsum dolor sit amet</div>

这样,使用JS可以折叠和展开区域,而没有JS的情况下,链接将带用户到页面上适当的内容。

无用的href

例如:

  • <a href="#">
  • <a href="javascript:void(0)">
  • <a href="about:blank">

如果你在JavaScript中在后台阻止默认行为,并且不支持禁用JS的用户,则可以使用“无用”的href值来保持链接在制表符顺序中,并自动启用 Enter 触发 click 事件。您应该添加[role="button"],因为语义上<a>标签不再用作链接,而是用作按钮。

<a href="#" role="button">Some clickable text</a>

2
我刚刚阅读了这篇小文章(http://css-tricks.com/when-and-when-not-to-use-an-anchor-tag/),评论中的建议似乎是使用 <button> 代替 <a> 标签。它比你建议的简单的 <span> 具有更多的语义价值。 - Dai
@David,span[role="button"]在语义上与<button>完全相同,并且更容易进行样式设计。 - zzzzBov
1
我无法在HTML5或(X)HTML4中找到“role”属性 - 我确实在目前正在审核的XHTML扩展中找到了它的参考。你有这方面的资源吗? - Dai
1
@David,这是Web无障碍倡议的可访问丰富互联网应用程序(WAI-ARIA)规范的一部分。具体来说,是指角色模型(The Roles Model)。链接:http://www.w3.org/TR/wai-aria/roles#button。 - zzzzBov
1
另外,你提醒我关于文档的事情很好。有时候当我写答案时,我会忘记链接一些我所考虑到的资源;这就是其中之一。 - zzzzBov

18

个人而言,我更喜欢使用href="javascript:void(null);",以便为浏览器提供一个不会混淆哈希的 href。

唯一与无 href 链接有所不同的是,浏览器默认不会给它们加下划线,因此只需添加样式即可。


6
在该函数中使用return falsepreventDefault()来防止将哈希值更改为,同时可以从HTML中减少一些字节。 - Gerben
4
如果你不想允许内联脚本(通常来说这是不好的做法),那么这也是与内容安全策略不兼容的做法。 - miguel.camba

1

我正在将一个HTML、CSS、JS模板转换为React,这行代码对我来说完美地起作用:

<a href={() => false}> Link </a>

0

在HTML中使用

<a id="calendar" href="javascript:void(0)">
        <div class="icon-w">
          <div class="fa fa-calendar"></div>
        </div>
     <span>Calendar</span>
</a> 

1
我给你的回答点了踩,因为这个技巧已经在@zzzzBov的回答中提到了。 - Dai

0

我在使用React JS时遇到了同样的问题。

Line 273:  Links must not point to "#". Use a more descriptive href or use a button instead  jsx-a11y/href-no-hash

为了消除错误,我使用了以下的方法:

之前的代码如下:

 <a 
      href="#"
      className="banner-signup signup-btn envy-font-sans-bold"
      onClick={(e) => this.gonext()}
    >
     NEXT
    </a>

在链接中使用 href="#/" 替代 href="#"

 <a 
      href="#/"
      className="banner-signup signup-btn envy-font-sans-bold"
      onClick={(e) => this.gonext()}
    >
     NEXT
    </a>

在我的情况下,是因为我没有用文本填充标签,所以在我纠正之后,它就正常工作了。 - Armando Marques da S Sobrinho

-1

我不知道有任何巫术,但如果页面上有很多链接并且您提取href,则必须添加类名称以在每个链接上给您蓝色和下划线。换句话说,当浏览器已经处理时,为什么要引入更多工作呢?因此,简而言之,请坚持您所知道的,并且我怀疑如果您删除href,则页面将无法验证http://validator.w3.org/


根据HTML4 TR关于锚点元素的规定,href属性并非必需的(http://www.w3.org/TR/REC-html40/struct/links.html#h-12.2)。 - Dai
然后,这真的取决于工作的努力...你知道的,为什么要重复造轮子呢。 - Rob

-2

我遇到了这个问题,需要将手风琴标题设置为<a>,以便可以进行选项卡操作但不能点击。如果没有href,这是行不通的,因此我在href中的“#”后面放置了一个id的文本,看起来似乎可以工作。它使链接可用于选项卡,但无法单击。

<a href="#${accordionGroup.id}"> 标题 </a>

输出结果如下:

<a href="#acc234923"> 标题 </a>


你应该使用 tabindex 而不是设置一个虚假的 href 值。 - Dai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接