关于标记省略的规则有些误导,因为在大多数情况下,它们实际上并没有说明何时可以省略标记,而是在省略标记时应该如何解释它们。以以下文档为例:
<!DOCTYPE html><!-- A comment --><title>A title</title>
这是一个有效的 HTML5:您可以自己通过W3C 验证器运行它。但是标签省略规则明确指出
如果元素内的第一件事不是注释html
,则可以省略[a]n元素的开始标记。html
我们如何调和这一点?答案是这些是消歧规则。因为如果html
元素内的第一件事是注释,则元素的开始标签可能不会被省略,所以我们在解析时可以自由地假设注释不是html
元素内的第一件事。同样,标签省略规则规定
body
如果元素为空,或者元素内的第一件事body
不是空格字符或注释 [... ]
所以我们可以自由地假设注释也不body
是元素内部的第一件事。所以实际上这个文档可以明确地解析为等价于
<!DOCTYPE html><!-- A comment --><html><head><title>A title</title></head><body></body></html>
HTML5 的解析器算法指定如果我们处于before html插入模式,这是解析器在看到之后转换到的状态<!DOCTYPE html>
,我们看到
一个字符标记,它是 U+0009 CHARACTER TABULATION、"LF" (U+000A)、"FF" (U+000C)、"CR" (U+000D) 或 U+0020 SPACE 之一
那么我们要“忽略令牌”。另一方面,如果我们看到一个评论标记,那么我们将
插入注释作为 Document 对象的最后一个子对象。
直到我们看到其他类型的标签,我们才会发出一个html
元素。所以我们应该期望这种行为不会受到空格的影响,实际上 Firefox 54 和 Chrome 60 都会解释文档
<!DOCTYPE html>
<!-- A comment -->
<title>A title</title>
等同于
<!DOCTYPE html><!-- A comment --><title>A title</title>
也就是说,他们都被视为
<!DOCTYPE html><!-- A comment --><html><head><title>A title</title></head><body></body></html>