user1309389 有一个很好的答案,我同意对规范的呼吁。但我不同意他们的结论,我认为他们对导致“未定义行为”的虚构元素是错误的。我想提出另一种思考方式,根植于规范和浏览器实际处理组成元素的方式。
现在是 2015 年,我们正处于被广泛采用的CustomElement规范的边缘,并且 polyfill 很容易获得。现在是思考“制作自己的元素”的好时机。在不久的将来,您将能够以所有人都喜欢的完全标准和受支持的方式创建具有自己选择的标签和行为的新元素。但是,直到所有浏览器都使用它,并且直到大多数人都使用支持的浏览器,您才能利用Polymer或X-Tags的辛勤工作项目以几乎标准且大多数人喜欢的方式检查自定义元素的未来。这可能是“正确的事情”。但这并没有回答你的问题,坦率地说,我发现“只使用 X”或“不要做 X”比“这是规范如何涵盖这一点,这是浏览器所做的”。所以,这就是我喜欢的。
反对大部分网络开发社区的衷心推荐(有时甚至是尖叫),在过去的一年里,我一直在使用“虚构”元素,在我所有的生产项目中,没有使用 polyfill,而且我已经(还)没有无法解决的问题,也没有投诉。如何?通过依赖HTMLUnknownElement的标准行为,W3C 规范的一部分涵盖了“组成”元素的情况。如果浏览器遇到无法识别的 HTML 元素,则应该有一种定义明确且明确的方式来处理它,而 HTMLUnknownElement 定义了该行为,您可以在此基础上进行构建。HTMLUnknownElement 还必须足够强大和正确以“不破坏网络”<blink>
标签。不建议您使用 HTMLUnknownElement,但在理论上和实践中,如果您知道自己在做什么,那么这样做绝对没有坏处。
那么 HTMLUnknownElement 是如何工作的呢?它只是 HTMLElement 接口的扩展,它是所有 HTML 元素底层的标准接口。然而,与大多数其他元素不同的是,HTMLUnknownElement 没有添加任何特殊行为——你得到一个原始元素,没有任何特殊行为,也没有关于使用的限制规则。HTMLDivElement接口的工作方式几乎完全相同,扩展了 HTMLElement 并且几乎不添加任何其他行为。简而言之,组成自己的元素几乎与使用 div 或 span 相同。
我喜欢“化妆”元素的地方在于思维方式的转变。您应该根据几个因素来使用或发明HTML 元素,范围从它使标记阅读的清晰程度、浏览器和屏幕阅读器以及搜索引擎如何解析您的代码,到您的代码被某些人“正确”的可能性有多大客观的衡量。我很少使用虚构的元素,但我完全按照 Richard 所描述的方式使用,以使内容对 HTML 的作者更有意义,而不仅仅是对提取元数据的计算机服务有意义。当在整个团队中以一致的方式使用时,可能会有很大的好处,因为组成的元素可以简洁地表达它们的用途。
我特别喜欢使用虚构的元素来指示我何时将使用 JS 来定义元素的额外行为。例如,如果我有一个元素将通过 JS 添加/删除子元素,我将使用一个虚构的元素作为该元素受特殊行为影响的线索。出于同样的原因,当标准元素就足够时,我不会使用虚构元素。你会在我的代码中看到<dynamic-list>
快乐地生活在旁边。<div>
现在,关于那些讨厌的验证器。是的,使用虚构元素不是“有效的”,因为它不会通过“验证器”。但是现代 HTML 和 JS 开发的许多常用特性、模式和系统都无法通过所有 W3C 验证器。验证者不是法律——规范才是。并且法律没有约束力——所有浏览器中的实现都是。多年来,随着 HTML 的灵活性不断提高,以及浏览器与规范的关系发生了变化,验证器的效用一直在减少。验证器非常适合不熟悉 HTML 并需要指导的人。但是,如果您愿意从规范和浏览器实现中获得指导,则没有理由担心被验证器不及格。当然,如果您遵循 Google、Apple、Microsoft 等提供的许多指南来实施任何实验性功能,那么您将在验证器的范围之外工作。这绝对是一件好事,只要你是故意这样做的,并且你对自己在做什么有足够的了解。
因此,如果您要构建自己的元素并依赖 HTMLUnknownElement,请不要将其视为狂野的西部。您需要遵循一些简单的规则。
您必须在标签名称中使用连字符。如果您这样做,则保证您永远不会与 HTML 规范的未来版本发生冲突。所以永远不要说<wrong>
,永远说<quite-right>
。
组成的元素不能自动关闭——你必须用结束标签来关闭它们。你不能只说<wrong>
或<still-wrong />
,你必须说<totally-good></totally-good>
。
您必须display
在 CSS 中为您的元素定义一个属性,否则呈现行为是未定义的。
就是这样。如果你做这些事情,你应该很好地在 IE9 及更高版本中使用虚构的元素,依靠 HTMLUnknownElement 的安全网。对我来说,好处远远超过成本,所以我一直在大量使用这种模式。我经营着一个面向主要工业公司的 SaaS 网站,到目前为止,我没有遇到任何问题或投诉。如果您必须支持旧版本的 IE,明智的做法是远离任何“2015”技术或其粗略的近似值,并安全地留在规范中被广泛使用的部分。
因此,总而言之,您的问题的答案是“是的,如果您知道自己在做什么”。