有效使用<a> (anchor tag) without href attribute?</a>

时间:2012-05-09 05:15:40

标签: html anchor semantic-markup htmlbutton

我一直在使用Twitter Bootstrap构建一个网站,它的很多功能都依赖于在<a>中包装内容,即使它们只是要执行Javascript。我遇到了Bootstrap文档推荐的href="#"策略问题,所以我试图找到一个不同的解决方案。

但后来我试图完全删除href属性。我一直在使用<a class='bunch of classes' data-whatever='data'>,并让Javascript处理剩下的事情。它有效。

然而有些东西告诉我,我不应该这样做。对?我的意思是,技术上<a>应该是某个东西的链接,但我不完全确定为什么这是一个问题。或者是吗?

4 个答案:

答案 0 :(得分:190)

<a> nchor元素只是一个内容的锚点。最初HTML规范允许命名锚点(<a name="foo">)和链接锚点(<a href="#foo">)。

命名锚格式不太常用,因为片段标识符现在用于指定[id]属性(尽管为了向后兼容,您仍然可以指定[name]属性)。 An <a> element without an [href] attribute is still valid

就语义和样式而言,<a>元素不是链接(:link),除非它具有[href]属性。这样做的副作用是默认情况下不带<a>的{​​{1}}元素不会处于Tab键顺序。

真正的问题是[href]元素是否仅适用于<a>。在语义层面上,<button>link之间存在明显差异。

单击按钮会导致操作发生。

链接是导致当前文档中导航发生变化的按钮。在片段标识符(button)的情况下,发生的导航可能在文档中移动,或者在URL(#foo)的情况下移动到新文档。

由于链接是一种特殊类型的按钮,因此它们通常会覆盖其操作以执行替代功能。从一致性的角度来看,继续使用锚作为按钮是可以的,尽管它在语义上不太准确。

如果您担心使用/bar元素(或<a><span>)作为按钮的语义和可访问性,则应添加以下属性:

<div>

button role告诉用户将特定元素视为按钮,作为对底层元素可能具有的语义的覆盖。

对于<a role="button" tabindex="0" ...>...</a> <span>元素,您可能希望为 Space Enter 添加JavaScript键侦听器以触发{{1}事件。默认情况下,<div>click元素会执行此操作,但非按钮元素则不会。有时将<a href>触发器绑定到不同的键更有意义。例如,Web应用程序中的“帮助”按钮可能绑定到 F1

答案 1 :(得分:33)

我想你可以在这里找到答案:Is an anchor tag without the href attribute safe?

此外,如果您不想使用href进行链接操作,可以使用它:

<a href="javascript:void(0);">something</a>

答案 2 :(得分:9)

是,有效使用没有href属性的锚标记。

  

如果a元素没有href属性,则元素表示a   占位符,否则链接可能放在哪里   是相关的,只包含元素的内容。

是的,您可以使用class和其他属性,但不能使用targetdownloadrelhreflangtype

  

targetdownloadrelhreflangtype属性必须为   如果href属性不存在,则省略。

至于“我应该吗?”部分,请参阅第一个引文:“如果链接可能相关,则可以放置链接”。所以我会问“如果我没有JavaScript,我会将此标记用作链接吗?”。如果答案是肯定的,那么是的,您应该使用<a>而不是href。如果不是,那么我仍然会使用它,因为生产力对于我来说比边缘案例语义更重要,但这只是我个人的意见。

此外,对于不同的behaviourstyling,您应该注意(例如,没有下划线,没有指针光标,而不是:link)。

来源:W3C HTML5 Recommendation

答案 3 :(得分:6)

有效。例如,您可以使用它来显示模态(或响应data-toggledata-target属性的类似内容)。

类似的东西:

<a role="button" data-toggle="modal" data-target=".bs-example-modal-sm" aria-hidden="true"><i class="fa fa-phone"></i></a>

在这里,我使用font-awesome图标,它更好地作为a标记而不是button来显示模态。此外,设置role="button"会使指针变为动作类型。如果没有hrefrole="button",则光标指针不会改变。