我一直无法找到关于自定义标记在HTML5中是否有效的明确答案,如下所示:
<greeting>Hello!</greeting>
我在规范中一无所获:
http://dev.w3.org/html5/spec/single-page.html
而且自定义标签似乎无法通过W3C验证器进行验证。
我一直无法找到关于自定义标记在HTML5中是否有效的明确答案,如下所示:
<greeting>Hello!</greeting>
我在规范中一无所获:
http://dev.w3.org/html5/spec/single-page.html
而且自定义标签似乎无法通过W3C验证器进行验证。
Answers:
“ 自定义元素”规范在Chrome和Opera中可用,并且在其他浏览器中也可用。它提供了一种以正式方式注册自定义元素的方法。
自定义元素是作者可以定义的新型DOM元素。与无状态且短暂的装饰器不同,自定义元素可以封装状态并提供脚本接口。
自定义元素是更大的W3规范(称为Web Components)的一部分,以及模板,HTML导入和Shadow DOM。
Web组件使Web应用程序作者能够定义具有仅靠CSS所无法实现的视觉丰富度和交互性的小部件,并且易于编写和重用当今脚本库所无法实现的小部件。
但是,从Google Developers上有关自定义元素v1的精彩文章中,您可以了解到:
自定义元素的名称必须包含破折号(
-
)。所以<x-tags>
,<my-element>
和<my-awesome-app>
都是有效名称,而<tabs>
和<foo_bar>
不是。这项要求是为了使HTML解析器可以区分自定义元素和常规元素。当将新标签添加到HTML时,它还可以确保向前兼容性。
一些资源
这是可能且允许的:
用户代理必须将他们不理解的元素和属性视为语义中立的;将它们留在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(我的博客)
注意:以下答案在2012年撰写时是正确的。此后,情况有所发展。HTML规范现在定义了两种类型的定制元素-“自治定制元素”和“定制内置元素”。前者可以到任何期望措辞内容的地方。多数位于体内,但不包括ul或ol元素的子元素,或td,th或caption元素以外的表格元素中的位置。后者可以到达它们扩展的元素可以到达的任何位置。
这实际上是元素内容模型积累的结果。
该html
元素只能包含一个head元素,后跟一个body元素。
该body
元件可仅包含流内容,其中内容流被定义为元素: a,abbr,地址,区域(如果它是地图元素的后代),文章,一旁,音频,b,bdi,bdo,blockquote,br,按钮,canvas,cite,代码,命令,数据列表,del,详细信息,dfn,div dl,em,embed,fieldset,fig,footer,form,h1,h2,h3,h4,h5,h6,标头,hgroup,hr,i,iframe,img,input,ins,kbd,keygen,标签,地图,标记,数学,菜单,仪表,导航,noscript,对象,ol,输出,p,pre,进度,q,ruby,s,samp,sample,script,section,select,small,span,strong,style( (如果存在scoped属性),sub,sup,svg,表格,textarea,时间,u,ul,var,video,wbr和Text
等等。
内容模型绝不会说“您可以在其中放入任何您喜欢的元素”,这对于自定义元素/标签是必需的。
自定义元素和属性在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强烈建议不要使用它们,并认为它们不符合要求。但是需要浏览器来支持它们,并且x-*
标识符不会与将来的HTML规范和x-vendor-feature
冲突,标识符也不会与其他开发人员冲突。自定义DTD可用于处理任何挑剔的浏览器。
以下是官方文档中的一些相关摘录:
“适用的规范可以定义新的文档内容(例如,foobar元素)[...]。如果通过使用适用的规范,给定的符合HTML5的文档的语法和语义未发生变化,则该文档仍然是符合HTML5的文档文件。”
“用户代理必须将它们不理解的元素和属性视为在语义上是中立的;将它们留在DOM中(对于DOM处理器),并根据CSS样式化(对于CSS处理器),但不能从中推断出任何含义。”
“用户代理不能随意随意处理不符合要求的文档;本规范中描述的处理模型适用于实现方式,而与输入文档的符合性无关。”
“ HTMLUnknownElement接口必须用于本规范未定义的HTML元素。”
我想指出的是,“ valid”一词在这种情况下可以有两种不同的含义,其中的任何一种都可能是有效的。
具有自定义标签的HTML文档是否应被视为有效的HTML5? 答案显然是“不”。该规范准确列出了哪些标签在什么情况下有效。这就是HTML验证程序将不接受带有自定义标签或标准标签位于错误位置(例如标头中的“ img”标签)的文档的原因。
带有自定义标签的HTML文档是否将在浏览器中以标准,清晰定义的方式进行解析和呈现?
在这里,也许令人惊讶,答案是“是”。即使从技术上讲该文档不会被视为有效的HTML5,HTML5规范也确实指定了浏览器在看到自定义标记时应该执行的操作:简而言之,自定义标记的作用类似于<span>
-表示没有任何意义,并且无所作为默认设置,但可以通过HTML设置样式并通过javascript访问。
自定义HTML元素是W3新兴的标准,我一直在为之贡献,它使您能够在解析器中声明和注册自定义元素,您可以在此处阅读规范:W3 Web组件自定义元素规范。此外,Microsoft支持一个库(由以前的Mozilla开发人员编写),称为X-Tag-它使使用Web Components更加容易。
dom.webcomponents.enabled
来true
。
提供反映现代页面的更新答案。
自定义标签在任何情况下均有效,
1)它们包含破折号
<my-element>
2)它们是嵌入式XML
<greeting xmlns="http://example.com/customNamespace">Hello!</greeting>
假设您使用的是HTML5文档类型 <!doctype html>
考虑到这些简单的限制,现在应该尽最大努力使HTML标记保持有效(请停止关闭诸如<img>
和的标记<hr>
,除非您使用XHTML doctype(除非您可能不需要),否则这是愚蠢且不正确的)。
鉴于HTML5清楚地定义了解析规则,兼容的浏览器将能够处理您向其抛出的任何标签,即使该标签严格无效也是如此。
对于只能限于XML序列化且HTML序列化中不需要支持的标记级功能,供应商应使用命名空间机制来定义支持非标准元素和属性的自定义命名空间。
因此,如果您使用的是HTML5的XML序列化,则执行以下操作是合法的:
<greeting xmlns="http://example.com/customNamespace">Hello!</greeting>
但是,如果您使用的是HTML语法,那么您将只能做些限制。
对于打算与HTML语法一起使用的标记级功能,应将扩展限制为“ x-vendor-feature”形式的新属性,而不应创建新的元素名称。
但是这些说明主要针对浏览器供应商,假定他们将为他们选择创建的任何自定义元素提供视觉样式和功能。
对于作者来说,尽管在页面中嵌入自定义元素(至少在XML序列化中)可能是合法的,但除了DOM中的节点之外,您将获得更多。如果您希望自定义元素实际执行某项操作或以某种特殊方式呈现,则应查看“ 自定义元素”规范。
有关该主题的更入门的知识,请阅读Web Components简介,其中还包括有关Shadow DOM和其他相关规范的信息。这些规范目前仍在起草中-您可以在此处查看当前状态-但它们正在积极开发中。
例如,一个greeting
元素的简单定义可能看起来像这样:
<element name="greeting">
<template>
<style scoped>
span { color:gray; }
</style>
<span>Simon says:</span>
<q><content/></q>
</template>
</element>
这告诉浏览器将元素内容括在引号中,并以带有灰色样式的文本“ Simon said:”作为前缀。通常,这样的自定义元素定义将存储在单独的html文件中,您将通过链接导入该文件。
<link rel="import" href="greeting-definition.html" />
虽然您也可以根据需要内联它。
我已经使用Polymer polyfill库创建了以上定义的工作演示,您可以在此处看到。请注意,这使用的是旧版本的Polymer库-最新版本的工作方式大不相同。但是,由于该规范仍在开发中,因此无论如何我都不建议在生产代码中使用此功能。
只需使用任何您想要的内容,而无需任何dom声明
<container>content here</container>
添加您自己的样式(display:block),它将与任何现代浏览器一起使用
data-*
属性在HTML5甚至HTML4中都是有效的,所有用于尊重它们的Web浏览器都有效。从技术上来说,添加新标签是可以的,但不建议仅因为以下原因:
我只在Google不在意的地方使用自定义标签,例如在游戏引擎iframe中,我制作了一个<log>
包含<msg>
,<error>
并且<warning>
-且仅通过JavaScript的标签。根据验证者,这是完全有效的。它的样式甚至可以在Internet Explorer中使用!;]
<inventory>
,<item type="potion" sprite="2">
-因此,最好将SGML + CSS而不是HTML命名,尽管HTML元素具有定义因为工作是-按钮,列表,...
自定义标记在HTML5中无效。但是当前浏览器支持解析它们,您也可以使用CSS来使用它们。因此,如果您想对当前的浏览器使用自定义标签,则可以。但是,一旦浏览器严格执行W3C标准以解析HTML内容,该支持就可能被取消。
<center>
和<marquee>
?
我知道这个问题很老,但是我一直在研究这个主题,尽管上面的某些陈述是正确的,但它们并不是创建自定义元素的唯一方法。例如:
<button id="find">click me</button>
<Query? ?attach="find" ?content="alert( find() );" ?prov="Hello there :D" >
I won't be displayed :D
</Query?>
<style type="text/css">
[\?content] {
display: none;
}
</style>
<script type="text/javascript">
S = document.getElementsByTagName("Query?")[0];
Q = S.getAttribute("?content");
A = document.getElementById( S.getAttribute("?attach") );
function find() {
return S.getAttribute("?prov");
}
(function() {
A.setAttribute("onclick", Q);
})();
</script>
可以正常工作(到目前为止,在新版的Google Chrome,IE,FireFox和移动Safari中)。您只需要一个字母字符(az,AZ)来启动标签,然后您就可以使用任何非字母字符了。如果在CSS中,则必须使用“ \”(反斜杠)以查找元素,例如需要Query \ ^ {...}。但是在JS中,您只是以自己的方式调用它。我希望这会有所帮助。看例子在这里
-Mink CBOS