错误HTML5代码解析疑问:video标签结束标签应插入何处?
问题解答
首先明确:Chrome和Safari的处理是符合HTML5规范的,JSoup的处理不符合。
核心原因拆解
自闭合标签的规则
HTML5里只有void元素(比如<img>、<br>、<input>这类本身不需要闭合的元素)才能用<tag/>的自闭合语法。<video>属于非void元素,标签末尾的/会被解析器直接忽略,等同于只写了<video autoplay="" id="remote" width="240">,没有闭合标签。未闭合video的解析逻辑
HTML5解析器在遇到未闭合的<video>后,会进入“处理video内部内容”的状态,直到遇到能触发video闭合的条件:要么是明确的</video>标签,要么是整个<body>结束(此时会自动闭合所有未闭合的流元素)。
而<script>元素属于流内容的一种,根据HTML5规范,<video>的内容模型允许包含流内容,所以解析器不会在遇到<script>时自动闭合<video>,自然会把<script>及其内容包裹在<video>内部。
HTML5规范的相关位置
- 关于void元素和自闭合语法:规范中明确列出了所有void元素,同时指出非void元素的自闭合斜杠属于“解析错误”,会被忽略,不会触发元素闭合。
- 关于video元素的解析规则:在HTML5解析器的“in body”状态章节下,针对video元素的处理逻辑说明:解析器会持续处理子内容,直到遇到闭合标签或触发元素闭合的其他条件(如body结束)。
- 关于元素内容模型:video元素的内容模型允许包含零个或多个流内容,而script属于流内容范畴,因此script可以作为video的子元素存在(尽管实际场景中没有实用价值)。
内容的提问来源于stack exchange,提问作者Michael Kay
相关产品推荐
相关产品推荐

