user1309389提供了一个非常好的答案,我同意他们对规范的呼吁。但是我不同意他们的结论,并且我认为他们关于虚构元素导致“未定义行为”的说法是错误的。我想提出一种替代思考方式,根植于规范和浏览器实际处理虚构元素的方式。
现在是2015年,我们正处于广泛采用CustomElement规范的边缘,并且polyfills已经可以轻松获得。现在是一个很好的时机去思考“创造自己的元素”。在不久的将来,您将能够以完全标准和支持的方式创建具有自己选择的标签和行为的新元素,每个人都可以喜欢。但在此之前,直到所有浏览器都实现该功能,并且大多数人都使用支持的浏览器之前,您可以利用Polymer或X-Tags项目的辛勤工作,以一种几乎标准和大部分支持的方式来查看自定义元素的未来,这是做正确事情的可能性非常高的。但这并没有回答您的问题,坦白地说,“只需使用X”或“不要使用X”比“规范如何覆盖此内容以及浏览器如何处理此内容”更少有帮助。因此,以下是我所喜欢的。
在很多Web开发社区的真诚建议(有时是尖叫声)反对下,过去一年我一直在所有的生产项目中使用“虚构”的元素,没有使用polyfill,并且我还没有遇到无法解决的问题(至少目前为止),也没有收到任何投诉。如何做到的?通过依赖HTMLUnknownElement的标准行为,该W3C规范部分涵盖了“虚构”元素的情况。如果浏览器遇到无法识别的HTML元素,则应该以一种明确定义和明确的方式处理它,并且HTMLUnknownElement定义了该行为,您可以在此基础上构建。 HTMLUnknownElement还必须足够强大和正确,以在遇到现在已过时的所有标签(如<blink>
标签)时,“不破坏Web”。虽然不建议使用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>
。
您必须在CSS中为元素定义一个display
属性,否则渲染行为是未定义的。
这就是全部内容了。如果您遵循这些步骤,您应该能够在IE9及以上版本中使用虚构元素,并依靠HTMLUnknownElement的安全保障。对我来说,好处远远超过成本,所以我一直在大量使用这种模式。我运营一个面向主要工业企业的SaaS网站,到目前为止,我没有遇到任何问题或投诉。如果您必须支持旧版IE,则明智的做法是远离任何“2015”技术或它们的粗略近似,并安全地留在规范的常用部分。
因此,总之,对于你的问题的答案是“是的,如果你知道你在做什么”。
quite-right
)的错误。如果需要更多详细信息,请参阅https://dev59.com/p4fca4cB1Zd3GeqPodpu#28711028。 - sideshowbarker