HTML5标签遗漏:关于语言的规范澄清

时间:2013-02-20 21:08:27

标签: html5

标签遗漏的HTML5规范(http://www.w3.org/TR/html51/syntax.html#syntax-tag-omission)从以下两个语句开始(强调我的):

  • 如果内部的第一件事,则可以省略html元素的开始标记 html元素不是评论。
  • 如果html元素不是,则可以省略html元素的结束标记 紧接着发表评论。

那些陈述的内容类似,但不一样,我想知道某人是否可以澄清他们的意思。

以下情况似乎毫不含糊 - 您无法移除开始或关闭代码:

<html><!-- start --> ... </html><!-- end -->

但是当空白被引入混合时呢?在下列情况下,html的开始标记是否可以消除?

<html>
   <!-- comment after whitespace -->
   ...

在类似情况下是否可以删除结束标记?

   ...
</html>
<!-- comment after whitespace -->

其他一些规则特别提到空白字符,这使我认为应该考虑到这些字符。大多数规则都说&#34; ......紧随其后......&#34;这与列出的第一个要点不同。

3 个答案:

答案 0 :(得分:2)

在HTML中,标签之间的空格无关紧要。 <html> <head><html><head>与浏览器相同。在内容中(例如在span / p标签内的单词之间),它由浏览器呈现,但是当您想在元素之间使用空格(作为设计资源)时,您应该使用&amp; nbsp。

所以,正如我所见,紧接着并不意味着“下一个字符”,而是“结束标记所在地之后的第一件事,无论之间有多少空格它们。

然后,在两种情况下删除html标签会使html无效,因为无论地方</html>应该是多少空格和评论。

编辑:我认为他们试图通过使用另一个词来表达同样的事情,避免重复,但最终却被混淆了;

答案 1 :(得分:2)

这里的重要因素是内部的第一件事后面的正在谈论节点即DOM,而不是标签或其他标记,因此它所做的区别在于节点是否是子节点(内部的第一个内容)或后面的兄弟节点(紧随其后)。

就空间而言:

  

如果内部的第一件事,可以省略html元素的开始标记   html元素不是评论。

html元素中的第一件事不能是空格字符,因为在解析器算法的那一点上,空格字符标记被丢弃而不会添加到DOM中。

  

如果html元素不是,则可以省略html元素的结束标记   紧接着发表评论。

空格字符,无论它们是出现在</html>标记之前还是之后,最终都在html元素内部(事实上,也在body元素内),因此注释将紧跟在html之后元素,无论标记之间是否有空格。

答案 2 :(得分:1)

关于标记遗漏的规则有些误导,因为大多数情况下,当标记可以省略时,它们实际上并没有说,而是在省略它们时应该如何解释它们。例如,以下文件:

<!DOCTYPE html><!-- A comment --><title>A title</title>

这是一个有效的HTML5:您可以自己通过the W3C validator运行它。但是the tag omission rules清楚地说明了

  如果html元素中的第一个内容不是注释,则可以省略

[a] n html元素的开始标记。

我们如何协调这一点?答案是这些是消除歧义的规则。因为html元素的开始标记可能不会被省略,如果其中的第一个内容是注释,我们可以自由地假设在解析注释是而不是 {{ 1}}元素。同样,标签遗漏规则表明

  如果元素为空,或者html元素中的第一个元素不是空格字符或注释[...] <,则可以省略

[a] body元素的开始标记/ p>

因此我们可以自由地假设评论也是而不是 body元素中的第一件事。所以实际上这个文档可以明确地解析为等同于

body

HTML5的解析器算法指定如果我们处于before html插入模式,这是解析器在看到<!DOCTYPE html><!-- A comment --><html><head><title>A title</title></head><body></body></html> 后转换到的状态,我们看到

  

字符标记,是U + 0009字符制表,“LF”(U + 000A),“FF”(U + 000C),“CR”(U + 000D)或U + 0020 SPACE之一

然后我们要“忽略令牌”。另一方面,如果我们看到评论标记,那么我们将

  

插入注释作为Document对象的最后一个子项。

直到我们看到其他类型的标记才会发出<!DOCTYPE html>元素。所以我们应该期望这种行为不会受到空白的影响,事实上Firefox 54和Chrome 60都会解释这个文档

html

相同
<!DOCTYPE html>
         <!-- A comment -->
    <title>A title</title>

也就是说,它们都被视为

<!DOCTYPE html><!-- A comment --><title>A title</title>