【问题标题】:Why did they deprecate the 'name' attribute for HTML <a> elements?为什么他们不赞成 HTML <a> 元素的 'name' 属性?
【发布时间】:2014-10-27 08:02:11
【问题描述】:

From what I understand,在 HTML5 中,我们应该开始使用id 属性来引用a 元素,而不是name 属性。这样做的问题是还有一个约束,即id 每个文档应该是唯一的。

现在,我看到很多情况下您希望引用一组相关的a 元素(通常在 JS 中)。但是,通过摆脱name 属性,我们不得不重用相同的id,或者使用class 名称。课程应该是关于演示的,因此如果您出于与演示无关的原因引用您的a,这也是一个不完美的解决方案。

我想另一种 HTML5 替代方案是使用 data-name 之类的东西,但这似乎也很老套。有什么我想念的吗?是否有一个秘密的 W3 阴谋完全淘汰name

编辑:对于那些说“课程不一定需要关于演示”的人,我很难找到具体的来源,但我知道我至少阅读了几篇强调这一点的博客/文章.我有一种感觉,那些人不是 JS 程序员......

另外:感谢所有解释清楚、深思熟虑的答案!

【问题讨论】:

  • 这只是一个属性,所以任何其他可以代替它并且不需要独特的东西对我来说似乎是公平的游戏。在我看来,类或数据属性似乎完全可以接受。
  • “课程应该是关于演示的”引用?

标签: javascript html anchor web-standards name-attribute


【解决方案1】:

我认为没有理由不使用类或数据属性。

关于name 属性的观点 - 无论如何这些都应该是独一无二的!多个具有相同名称的 a 元素并不是非常有用,因为在 URL 中链接到它们会变得不明确:www.example.com#my-named-element

在我们公司,我们已经探索过使用 data-behaviors 属性,如下所示:

<a href='#' data-behaviors='something-cool something-else'>Click Me</a>

在 JS 中,我们使用以下方式将事件绑定到它:

$(".container").on("click", "data-behaviors=~'something-cool'", function(e){
  e.preventDefault();
})

我们还探索了使用具有命名约定 .js-something-cool 的类,这样我们就不会混淆哪些类是用于 CSS 的,哪些是特定于 javascript 功能的。

最后,我们更喜欢js- 类名方案,因为它比data-behavior 版本使用起来更简洁。但有时我们会根据需要混合搭配。

例如,您可以像这样制作切换功能:

<a href='#' data-toggle='#opened-div'>Click Me</a>

<div id='opened-div'>Some stuff</div>

这样你的数据属性就可以用来绑定事件,决定什么元素被切换。

【讨论】:

  • 有趣,我没有意识到name 属性与页内锚定行为有关。
  • 对,这就是它的最初目的(我相信其他答案与文档中的引用相关联) - 在 HTML5 中,页内锚定行为已更改为使用任何元素的 id 属性相反 - 这更有用!
【解决方案2】:

在 HTML5 中,我们应该开始使用 id 属性来引用元素,而不是 name 属性。

在 HTML 4 中引入了使用 ids 链接到。XHTML 1 弃用了 name 属性。这是在 HTML 5 中维护的。

这样做的问题是还有一个约束,即每个文档的 id 应该是唯一的。

不明确的链接目标没有用!

definition of the name attribute for the a element in HTML 3.2

这应该是一个字符串,定义了当前 HTML 文档范围的唯一名称

弃用它以支持id 不会添加任何新的唯一性约束。

现在,我看到很多情况下您希望引用一组相关的 a 元素(通常在 JS 中)。

在很多情况下,您都希望引用各种不同类型的相关元素。 HTML为此提供了类。您甚至可以让一个元素成为其中多个的成员。

课程应该是关于演示的

不,他们不是。类是识别一组元素属于一个组的通用方法。

查看dictionary中类的定义:

一组或类别的事物具有某些共同的属性或属性,并通过种类、类型或质量与其他事物区分开来

另请参阅the HTML 5 definition of the class attribute,它没有提到严格用于演示,其中一个使用示例是 JavaScript。

它们主要与 CSS 一起使用只是因为人们经常希望将样式应用于元素组。

【讨论】:

    【解决方案3】:

    啊,HTML。你是多么的矛盾。

    问题似乎在于锚点的name 属性和输入的name 属性混淆。在 HTML5 之前的日子里,您需要一种方法来区分传出链接(通过 href)和内部文档链接(# 书签)。

    那么,他们将如何做到这一点?此处指定:http://www.w3.org/TR/html401/struct/links.html

    通过激活这些链接(通过鼠标点击、键盘输入、语音命令等),用户可以访问这些资源。请注意,每个源锚点中的 href 属性使用 URI 指定目标锚点的地址。

    链接的目标锚点可以是 HTML 文档中的一个元素。必须为目标锚点指定一个锚点名称,并且任何寻址该锚点的 URI 都必须包含该名称作为其片段标识符。

    HTML 文档中的目标锚点可以由 A 元素(使用 name 属性命名)或任何其他元素(使用 id 属性命名)指定。

    是的,给一个锚点一个name 属性(作为片段标识符),另一个锚点可以link 到。

    只有在 HTML5 中,他们决定任何元素(a 除外)都可以作为片段标识符(这是有道理的 - 应该只有一个片段可以链接到...) - 这就是他们弃用的原因name 属性。

    至于如何选择它们? class 属性非常好(当然,它用于样式,但它是否使它纯粹是展示性的?)

    另一个引用(来自 w3c:http://www.w3.org/TR/html401/struct/global.html#adef-class

    另一方面,class 属性将一个或多个类名分配给一个元素;该元素可以说属于这些类。一个类名可以由多个元素实例共享。 class 属性在 HTML 中有几个作用:

    *作为样式表选择器(当作者希望将样式信息分配给一组元素时)。

    *用于用户代理的通用处理。

    【讨论】:

    • 感谢您让我阅读class 的规范。我猜“用于用户代理的通用处理”部分被很多设计师/开发人员掩盖了。
    猜你喜欢
    • 2017-10-12
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2019-04-04
    • 2010-10-04
    • 2012-12-11
    • 2012-11-19
    • 1970-01-01
    相关资源
    最近更新 更多