39

大多数浏览器似乎允许您创建任何您喜欢的元素标签,并为元素添加您喜欢的任何属性名称。例如:

<!DOCTYPE html>
<html>
<body>
<div my-attribute="has no data- prefix, but seems to behave like an attribute should">
    <br/>
    <hello-world style="display:block;background:#eee">Hello Everybody</hello-world>
    <goodby-world style="background:#faa">Default display is inline</goodbye-world>
</div>
</body>
</html>

以上显示正常。看起来未定义的元素的行为很像跨度。看起来 AngularJS 也充分利用了自定义标签和属性——这在很大程度上取决于它。

但是,据我了解,做这种事情是不行的,除非是带有“data-”前缀的自定义 html5 属性。

所以,我的问题是:组成自己的自定义元素标签和/或属性名称不再是禁忌吗?或者换一种说法,AngularJS 是否依赖非标准的怪癖,这些怪癖并不是 HTML5 规范的一部分,但只是碰巧起作用?谷歌的某个人是否发现了 html5 规范中失传已久的秘密章节?还是我完全误解了什么?

4

4 回答 4

17

它不会验证,但会渲染。

HTML5 被设计为非常宽容(与 XHTML 相反)。部分原因是“旧”HTML5 浏览器可以在不破坏页面的情况下允许该版本尚不支持的新元素(以及格式错误的 HTML)。

这当然可以被“利用”来引入自定义标签。

话虽如此 - 您也可以使用 HTML4 执行此操作。

正如评论中提到的:您还可以在普通标签中为任何属性添加前缀,data-并且它将验证。

于 2013-09-06T19:42:15.650 回答
11

来自 W3C 规范:

作者不得使用本规范或 [其他适用规范][1] 不允许的元素、属性或属性值,因为这样做会使该语言在未来的扩展变得更加困难。

但是,虽然页面正文的初始源(在 Angular 处理 ng-app 元素之前)可能不符合 W3C 标准,但如果您使用replace: truein 指令,自定义元素将替换为模板 HTML,这可能是有效的。因此,在这种情况下,您可以将 angular 元素视为一个占位符,它被终端 HTML 输出替换。

于 2013-12-08T13:35:48.587 回答
4

这有点自以为是,但主题也是如此。网络现在就是我们所做的,我们有能力创建/样式/修改非规范元素。Angular 团队可能并不真正关心规格,它是最前沿的,它们允许你做你想做的事。话虽如此,您可以在 Angular 中使用标记来做任何事情,这些标记将验证并符合 HTML5 规范(因为它们都支持它)。

于 2013-09-06T19:56:54.380 回答
4

AngularJS 并不在乎,这完全取决于你。如果您希望您的指令与 olds IE 兼容,您需要使用<div data-hello-world>代替<hello-world>并将 data- 放在所有自定义属性的前面。

HTML5 仍然不是 100% 的规范,但它正在慢慢成为规范。

于 2013-09-06T20:03:35.990 回答