HTML元素可以两次具有相同的属性吗?

时间:2014-10-13 13:44:43

标签: html html5

我正在考虑编写生成HTML标记的代码,该标记可能具有重复的属性,如下所示:

<div data-foo="bar" class="some-class" data-foo="baz">

这是合法的HTML吗?其中一个data-foo - 值是否优先于另一个?我可以依靠半现代浏览器(IE&gt; = 9)来解析它而不会窒息吗?

或者我在这里做一些非常愚蠢的事情?

2 个答案:

答案 0 :(得分:24)

在元素中两次使用相同的属性名称无效。对此的权威引用有点复杂,因为旧的HTML版本名义上基于SGML,并且对SGML标准的规范性引用暗示了限制。在HTML5 PR中,第8.1.2.3节Attributes明确指出:“在同一个开始标记上绝不能有两个或更多属性,其名称是彼此不区分大小写的ASCII匹配。”

实践中发生的是后一属性被忽略。好吧,未来的浏览器可能会这样做。在DOM中,属性显示为元素节点的属性以及attributes对象的属性,因此没有自然的方法来存储两个值。

答案 1 :(得分:5)

它在技术上没有效果,但每个浏览器都会忽略HTML文档中的重复属性并使用第一个值(在您的情况下为data-foo="bar")。

在标记中两次使用相同的属性名称被视为内部解析错误。这会导致您的文档验证失败,如果这是您担心的事情。但是,了解HTML 5定义预期结果非常重要,即使对于解析错误&#34;也是如此。解析器允许在遇到错误时停止,但如果它选择不停止必须生成规范中描述的特定结果。实际上,当遇到HTML文档中的错误时,没有浏览器会选择停止(XML / XHTML是另一回事),因此所有现代浏览器都会成功且一致地处理这种情况。

WHATWG HTML规范在section 12.2.4.33 "Attribute name state"中描述了这种情况:

  

当用户代理离开属性名称状态时(如果合适,在发出标记令牌之前),必须将完整属性的名称与同一令牌上的其他属性进行比较; 如果令牌上已经存在具有完全相同名称的属性,那么这是一个解析错误,必须删除新属性,以及与之关联的值(如果有)。

另见its description of "parse error" from the opening of section 12.2 "Parsing HTML documents"

  

解析算法中的某些点被称为解析错误。解析错误的错误处理是明确定义的(这是本规范中描述的处理规则),但用户代理在解析HTML文档时,可能会在遇到的第一个解析错误时中止解析器他们不希望应用本规范中描述的规则