HTML 规范不允许在非 void 元素上使用自闭合标签。
HTML 语法规则[ W3C ]
元素有一个开始标签来指示它们从哪里开始。非空元素有一个结束标签来指示它们的结束位置。
开始标签由以下部分组成,完全按照以下顺序:
- 一个“<”字符。
- 元素的标签名称。
- 可选地,一个或多个属性,每个属性前面必须有一个或多个空格字符。
- 可选地,一个或多个空格字符。
- 可选地,“/”字符,仅当元素是空元素时才会出现。
- 一个“>”字符。
HTML5 规范中的void 元素数量有限。以下是完整列表:
area
, base
, br
, col
, command
, embed
, hr
, img
, input
, keygen
, link
, meta
, param
, source
, track
, wbr
.
到底发生了什么
浏览器的解析器必须听规范。由于在非 void 元素标记中使用斜线是无效的,因此解析器会忽略结尾/>
,而<back />
意味着<back>
。因此,您永远不会关闭第一个阻止其他元素工作的元素。
在Plunker 上,您有:
<body>
<back></back>
Self closing <back />
Self closing <back />
</body>
解析为
<body>
<back></back>
Self closing <back>
Self closing <back>
</back>
</back>
</body>
然后template: '<button>back</button>'
,您在指令中指定用指定的 HTML 替换back
(及其子项),从而导致:
<body>
<back>
<button>back</button>
</back>
Self closing <back>
<button>back</button>
</back>
</body>
那我该怎么办?
为所有人使用<back></back>
,它会正常工作。或者,您可以使用元素属性:<div back="attr"></div>
.
有关更多详细信息,请参阅以下讨论: