【问题标题】:Sole hash in anchor href?锚href中的唯一哈希?
【发布时间】:2011-09-28 04:31:10
【问题描述】:

在我从事的项目中,我最近从开发后端(即非 Web)服务器转向了与 Web 相关的东西。在 HTML 代码中,我到处都发现了以下内容:

<a href='#'>some link</a>

然后在&lt;a&gt;元素的click事件上附加一些JS。

这个唯一的哈希有什么特殊含义吗?我了解href='#some_id' 如何告诉浏览器滚动到 ID = some_id 的元素。但是href='#' 不是这样工作的,对吧? 如果只是为了创建一段可点击的文本,为什么不简单地使用&lt;span&gt;

【问题讨论】:

  • 如果将href留空,它将重新加载当前页面,这就是为什么有#...
  • @webardo - 是的,但它比这更复杂。使用哈希,它会跳转到页面顶部,这也不太可能是想要的。这些事情通常与 javascript 返回 false 一起完成,这会阻止执行 href 操作。哈希仍然比空字符串好,因为如果用户禁用 Javascript 然后点击链接,它会产生更少的意外后果。

标签: javascript html


【解决方案1】:

在其自身链接到页面顶部的哈希。

这有时正是用于此目的——即“返回顶部”链接,但更典型的是,这种链接与 Javascript click 一起使用,即使它返回 false,从而否定 href 的操作.

在这种情况下,以这种方式使用它的原因如下:

  • &lt;a&gt; 标签在语义上可能是正确的——即要单击的项目充当链接;即加载更多内容,或打开弹出窗口等,即使它使用 Javascript 来实现其功能。

  • 使用&lt;a&gt; 标记还意味着该元素的样式将与站点上的其他&lt;a&gt; 标记相同。这包括:hover 效果样式等。请注意,IE6 仅支持&lt;a&gt; 元素上的:hover,不支持其他任何内容,这意味着如果该站点设计为在 IE6 中运行或仍需要支持它,那么您可以' t 使用其他标签复制此功能。这是过去为该功能使用&lt;a&gt; 标签的一个很好的理由,即使它在语义上不合适。这些天来,它不再是一个问题。即使在现代浏览器中,如果您希望它们看起来与其他链接相同,对这些项目使用&lt;a&gt; 仍然有助于减少复制的样式表。链接还具有其他一些可能难以与其他元素复制的特殊功能,例如位于选项卡索引序列​​中等。

  • HTML 要求 &lt;a&gt; 标记具有 href 属性才能将元素呈现为链接,因此哈希用作此的最小值。此外,href 属性中包含哈希意味着如果用户关闭 Javascript 或开发人员忘记return false;,链接不会导致任何令人讨厌的意外后果。相比之下,空字符串会导致它重新加载页面,如果您只是运行一些 javascript,这不太可能是您想要的。然而,链接指向一个有效的 URL 也是很常见的,如果关闭 Javascript 就会运行该 URL;这是为您的站点设置后备机制的好方法。但这并不总是合适的,显然不是这里的意图。

鉴于该项目只是在 Javascript 中触发点击事件,因此您没有理由不能为此使用任何其他元素。你可以很容易地改用&lt;span&gt;(或者更好的是&lt;button&gt;),但以上几点应该表明使用&lt;a&gt;标签没有任何问题。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    没错。你在这里看到的设计有点糟糕(尽管使用href="#" 很常见)。

    如果不阻止默认操作,它实际上会跳转到页面顶部。

    最好是

    • 使用 &lt;button&gt; 并设置相应的样式(甚至可能只通过 JavaScript 插入)
    • 或者让链接指向一些真实的资源(在服务器端触发一些动作)并附加 JavaScript 事件处理程序在客户端上执行这个(或类似的)动作并防止跟随链接(关键字:unobtrusive JavaScript )。

    这还取决于该网站是否打算在禁用 JavaScript 的情况下运行。如果是,那么这样的链接(但也是一个按钮)将不起作用。

    但无论如何,从语义的角度来看,仅仅使用链接来获得“可点击”的东西是错误的。

    【讨论】:

    • 我希望href 激活一些服务器端操作,onclick 最后有一个return false,这样启用 js 的浏览器就不会额外执行服务器端操作行动。
    • @Emyr:这就是我的意思 :)
    【解决方案3】:

    这个唯一的哈希有什么特殊含义吗?

    它链接到页面顶部

    为什么不直接使用&lt;span&gt;

    • 它将不在焦点顺序中
    • 它不会采用应点击内容的默认样式

    &lt;button&gt; 会比跨度更好。最好是built on top of a server side alternative

    【讨论】:

    • 纳入焦点顺序似乎是一个很好的理由。还有其他方法可以在焦点顺序中包含某些元素吗?
    • tabindex 在某些浏览器中,但对于具有合理后备的链接或提交按钮来说,这是一个糟糕的替代品。
    【解决方案4】:

    因为:

    • 样式已为您完成;
    • 该链接在语义上仍然是一个链接,即使它以无操作 href 开头。

    反问:
    您能解释一下为什么您认为spana 更适合作为链接吗?

    附录:
    类似button 或其他动态元素的东西可能更适合这里,但采用非链接span 的文本和假装 这是一个链接更糟糕

    【讨论】:

      【解决方案5】:

      因为您希望浏览器将此链接的样式设置为与所有其他链接相同,并且不必指定(例如使用class)“你知道,我希望它看起来像一个链接,即使它在技术上不是”。这确实不利于可维护性。

      【讨论】:

        猜你喜欢
        • 2011-02-15
        • 2012-02-17
        • 1970-01-01
        • 1970-01-01
        • 2013-09-12
        • 1970-01-01
        • 2014-06-14
        • 2019-05-17
        • 2015-02-19
        相关资源
        最近更新 更多