自定义元素是否有效HTML5?

d13*_*d13 171 html custom-element

我一直无法找到自定义标签在HTML5中是否有效的明确答案,如下所示:

<greeting>Hello!</greeting>
Run Code Online (Sandbox Code Playgroud)

我没有在规范中找到任何方式:

http://dev.w3.org/html5/spec/single-page.html

并且自定义标签似乎不会使用W3C验证器进行验证.

jes*_*vin 163

自定义元素规范是在Chrome和Opera可用,并成为提供其他浏览器.它提供了一种以正式方式注册自定义元素的方法.

自定义元素是可由作者定义的新元素DOM元素.与装饰器(无状态和短暂的)不同,自定义元素可以封装状态并提供脚本接口.

自定义元素是名为Web Components的更大W3规范的一部分,以及模板,HTML Imports和Shadow DOM.

Web组件使Web应用程序作者能够定义具有一定程度的视觉丰富性和交互性的小部件,而单独使用CSS是不可能的,并且当今的脚本库无法实现组合和重用的简便性.

但是,从Google开发者关于自定义元素v1的这篇精彩的文章中可以看出:

自定义元素的名称必须包含短划线(-).所以<x-tags>,<my-element><my-awesome-app>都是合法的名称,而<tabs><foo_bar>则不是.这个要求是HTML解析器可以将自定义元素与常规元素区分开来的.它还确保将新标记添加到HTML时的向前兼容性.

一些资源

  • @Alohci你应该在你的引语中加上接下来的3个字:"按照这个规范". (7认同)
  • 这是一个很好的答案(+1),但规则有些循环."用户不得做不允许的事情......" (3认同)
  • 到customelements.io的链接不再有用.你介意更新/删除吗? (2认同)

svi*_*gen 21

这是可能的并允许:

用户代理必须将他们不理解的元素和属性视为语义中立; 将它们留在DOM中(对于DOM处理器),并根据CSS(对于CSS处理器)对它们进行样式化,但不要从它们中推断出任何含义.

http://www.w3.org/TR/html5/infrastructure.html#extensibility-0

但是,如果您打算添加交互性,则需要使文档无效(但仍然完全正常)以容纳IE 7和8.

http://blog.svidgen.com/2012/10/building-custom-xhtml5-tags.html(我的博客)

  • 上文引用的声明似乎已在最新版本的http://www.w3.org/TR/html5/introduction.html#extensibility中删除.到目前为止,我仍然找不到任何关于非连字自定义HTML元素的使用是否有效的文档,或者是否需要JS语句来验证带连字符的自定义HTML元素(http://www.html5rocks.com/ EN /教程/ webcomponents/customelements /). (3认同)
  • 要点很简单:规范明确允许这些事情。在大多数“令人沮丧”行为的情况下,该规范非常清楚地针对用户代理供应商,而不是 HTML 作者。 (2认同)

Alo*_*hci 15

这实际上是元素内容模型积累的结果.

例如,根元素必须是html元素.

html元件可仅包含一个头元件,随后的主体元件.

body元件可仅包含流内容,其中流内容被定义为元素: 一,缩写,地址,区域(如果它是一个图元素的后代),物品之外,音频,B,BD​​I,BDO,BLOCKQUOTE,BR ,按钮,画布,引用,代码,命令,datalist,德尔,详细信息,dfn,div dl,em,嵌入,字段集,图,页脚,窗体,h1,H2,H3,h5,h6,标题,hgroup, hr,i,iframe,img,input,ins,kbd,keygen,label,map,mark,math,menu,meter,nav,noscript,object,ol,output,p,pre,progress,q,ruby,s, samp,script,section,select,small,span,strong,style(如果存在scoped属性),sub,sup,svg,table,textarea,time,u,ul,var,video,wbr和Text

等等.

内容模型在任何时候都没有说"你可以在这个中添加任何你喜欢的元素",这对于自定义元素/标签来说是必要的.

  • 这个答案现在无效,新兴的W3 Web组件自定义元素标准现在开始出现在浏览器中:https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html (3认同)
  • @Alochi - 显然任何其他旧语言规范都需要更新以反映这一新现实,但HTML是一种生活标准,并且不会阻止其他规范 - 一旦我们进入标准的下一阶段,将会进行更新跟踪.您可以在Chrome Canary中使用Web组件的本机实现,很快就可以在Firefox Aurora中使用.此外,4种Web组件规范中有3种可以使用polyfill,这些规范在当今所有现代浏览器中都能很好地工作 - 这包括自定义元素规范/功能. (3认同)

Bee*_*jor 11

基本自定义元素和属性

自定义元素和属性在HTML中有效,前提是:

  • 元素名称是小写的并且以 x-
  • 属性名称是小写的,以...开头 data-

例如,<x-foo data-bar="gaz"/><br data-bar="gaz"/>.

元素的共同惯例是x-foo; x-vendor-feature被推荐.

这可以处理大多数情况,因为很可能很少有开发人员需要注册其元素所需的所有功能.语法也足够有效和稳定.更详细的解释如下.

高级自定义元素和属性

截至2014年,有一种新的,大大改进的方式来注册自定义元素和属性.它不适用于IE 9或Chrome/Firefox 20等旧版浏览器.但它允许您使用标准HTMLElement接口,防止冲突,使用x-*data-*名称和非名称,并定义浏览器的自定义行为和语法以尊重.它需要一些花哨的JavaScript,详见下面的链接.

HTML5 Rocks - 在HTML中定义新元素
WebComponents.org - 自定义元素简介
W3C - Web组件:自定义元素

关于基本句法的有效性

使用data-*自定义属性名称已经完全有效的一段时间,甚至与旧版本的HTML作品.

W3C - HTML5:可扩展性

至于自定义(未注册)元素名称,W3C强烈建议不要使用它们,并认为它们不符合要求.但是浏览器需要支持它们,并且x-*标识符不会与未来的HTML规范冲突,并且x-vendor-feature标识符不会与其他开发人员冲突.自定义DTD可用于解决任何挑剔的浏览器.

以下是官方文档的一些相关摘录:

"适用的规范可以定义新的文档内容(例如foobar元素)[...].如果通过使用适用的规范来改变给定的符合HTML5文档的语法和语义,那么该文档仍然是符合HTML5的标准文献."

"用户代理必须将他们不理解的元素和属性视为语义中立;将它们留在DOM中(对于DOM处理器),并根据CSS(对于CSS处理器)设置样式,但不要从中推断出任何含义."

"用户代理不能随意处理不符合要求的文档;本规范中描述的处理模型适用于实现,无论输入文档是否符合要求."

"HTMLUnknownElement接口必须用于未由此规范定义的HTML元素."

W3C - HTML5:符合文档
WhatWG - HTML标准:DOM元素


Jos*_*osh 10

我想指出,"有效"一词在这种情况下可以有两种不同的含义,其中任何一种都是潜在的,有效的.

  1. 带有自定义标签的HTML文档是否应被视为有效的HTML5? 对此的答案显然是"不".该规范准确列出了哪些标签在什么情况下有效.这就是为什么一个HTML验证不予受理,并自定义标签,或在错误的地方标准标签(比如在标题中的"IMG"标签)的文件.

  2. 是否可以跨浏览器以标准,明确定义的方式解析和呈现带有自定义标记的HTML文档? 在这里,也许令人惊讶的是,答案是肯定的.即使该文档在技术上不被认为是有效的HTML5,但HTML5规范确实指明了浏览器在看到自定义标记时应该做什么:简而言之,自定义标记的行为类似于<span>- 它没有任何意义,也没有做任何事情.默认,但它可以通过HTML设置样式并通过javascript访问.


Hen*_*lbo 7

给出反映现代页面的更新答案。

自定义标签在以下任一情况下均有效:

1)它们包含破折号

<my-element>
Run Code Online (Sandbox Code Playgroud)

2)它们是嵌入的XML

<greeting xmlns="http://example.com/customNamespace">Hello!</greeting>
Run Code Online (Sandbox Code Playgroud)

这假设您正在使用 HTML5 文档类型<!doctype html>

考虑到这些简单的限制,现在尽最大努力保持 HTML 标记有效是有意义的(请停止关闭诸如<img>和 之类的标签<hr>,这是愚蠢且不正确的,除非您使用 XHTML 文档类型,而您可能不需要)。

鉴于 HTML5 明确定义了解析规则,兼容的浏览器将能够处理您向其抛出的任何标签,即使它不是严格有效的。


csu*_*cat 5

自定义HTML元素是我一直在贡献的新兴W3标准,它使您能够使用解析器声明和注册自定义元素,您可以在此处阅读规范:W3 Web组件自定义元素规范.此外,Microsoft支持一个名为X-Tag的库(由前Mozilla开发人员编写),这使得使用Web组件变得更加容易.