HTML:包含或排除可选的结束标记?

时间:2010-06-09 18:12:33

标签: html html5 html4

某些HTML 1 结束标记可选,即:

</HTML>
</HEAD>
</BODY>
</P>
</DT>
</DD>
</LI>
</OPTION>
</THEAD>
</TH>
</TBODY>
</TR>
</TD>
</TFOOT>
</COLGROUP>

注意:不要与包含禁止的结束标记相混淆,即:

</IMG>
</INPUT>
</BR>
</HR>
</FRAME>
</AREA>
</BASE>
</BASEFONT>
</COL>
</ISINDEX>
</LINK>
</META>
</PARAM>

注意: xhtml与HTML不同。 xhtml是xml的一种形式,它要求每个元素都有一个结束标记。结束标记可以在html中禁止,但在xhtml中可以强制

是可选的结束标记

  • 理想情况下包含,但如果您忘记了,我们会接受它们,或者
  • 理想情况下,但如果你把它们放进去,我们会接受它们

换句话说, 我应该包含它们,还是包含它们?

HTML 4.01 spec talks about closing element tags being optional,但没有说是否最好包含它们,或者最好不包含它们。

另一方面,a random article on DevGuru says

  

结束标记是可选的。但是,建议将其包括在内。

我问的原因是因为出于兼容性原因你只是知道它是可选的;如果他们可以的话,他们就会成功(强制 | 禁止)。

换句话说:HTML 1,2,3对这些,现在是可选的结束标记做了什么。 HTML 5有什么作用?应该做什么?

注意

HTML中的某些元素禁止具有结束标记。你可能不同意这一点,但那是规范,而且还没有争论。我问的是可选的结束标签,以及意图是什么。

脚注

1 HTML 4.01

14 个答案:

答案 0 :(得分:57)

有些情况下明确的标签有帮助,但有时它是不必要的迂腐。

请注意,HTML规范明确指出何时省略标记是有效的,因此并不总是错误。

例如,您永远不需要</body></html>。没有人记得明确地放置<tbody>(以至于XHTML为它做了例外)。

您不需要</head><body>,除非您拥有实际搜索<head>的DOM操作脚本(然后最好明确关闭它,因为隐含<head>结尾的规则可能会令人惊讶你)。

嵌套列表实际上更好,没有</li>,因为那时创建错误的ul > ul树更难。

有效:

<ul>
  <li>item
  <ul>
    <li>item
  </ul>
</ul>

无效:

<ul>
  <li>item</li>
  <ul>
    <li>item</li>
  </ul>
</ul>

请记住,无论您是否尝试关闭所有元素,都会暗示结束标记。放置结束标记不会自动使解析更加健壮:

<p>foo <p>bar</p> baz</p>

将解析为:

<p>foo</p><p>bar</p> baz

只有在验证文档时它才有用。

答案 1 :(得分:48)

可选的是在结束时应该在语义上清晰的那些,而不需要结束标记。 例如。如果前面没有一个<li>,则</li>意味着<img src="blah" alt="blah"></img>

禁止结束标记的所有内容都会紧跟其结束标记,因此每次都必须输入{{1}}是多余的。

我几乎总是使用可选标签(除非我有充分的理由不这样做),因为它可以提供更易读和可更新的代码。

答案 2 :(得分:18)

我在这里添加一些链接来帮助您了解HTML的历史,以便您了解各种矛盾。这不是你的问题的答案,但在阅读这些各种摘要后你会知道更多。

Dive Into HTML5的一些摘录:

  

[T]事实上,“破坏的”HTML标记仍然在Web浏览器中起作用,导致作者创建了破碎的HTML页面。很多破页。据估计,目前网络上超过99%的HTML网页至少有一个错误。但是因为这些错误不会导致浏览器显示可见的错误消息,所以没有人修复它们。

     

W3C认为这是网络的一个基本问题,他们开始纠正它。 1997年发布的XML打破了宽容客户的传统,并要求所有使用XML的程序必须将所谓的“格式良好”错误视为致命错误。在希腊领导人Draco因为相对轻微违反其法律而设立死刑之后,第一次失误失败的概念被称为“严苛的错误处理”。当W3C将HTML重新配置为XML词汇表时,他们强制要求使用新的application/xhtml+xml MIME类型提供的所有文档都会受到严格的错误处理。如果您的XHTML页面中只有一个格式错误,那么Web浏览器别无选择,只能停止处理并向最终用户显示错误消息。

     

这个想法并不普遍。由于现有页面的估计错误率为99%,向最终用户显示错误的可能性以及XHTML 1.0和1.1中缺少新功能以证明成本合理,因此网络作者基本上忽略了application/xhtml+xml 。但这并不意味着他们完全忽略了XHTML。哦,绝对不是。 XHTML 1.0规范的附录C为这个世界的网络作者提供了一个漏洞:“使用类似于XHTML语法的东西,但继续使用text/html MIME类型提供服务。”这正是成千上万的网络开发人员做到了:他们“升级”为XHTML语法,但仍然使用text / html MIME类型提供服务。

     

即使在今天,数以百万计的网页声称是XHTML。它们从第一行的XHTML doctype开始,使用小写标记名称,在属性值周围使用引号,并在<br /><hr />之类的空元素后添加尾部斜杠。但是这些页面中只有一小部分是使用application/xhtml+xml MIME类型提供的,这会触发XML的严格错误处理。 MIME类型为text/html的任何页面 - 无论文档类型,语法或编码样式如何 - 都将使用“宽容”HTML解析器进行解析,默默地忽略任何标记错误,并且永远不会警告最终用户(或任何其他人) )即使页面在技术上被破坏了。

     

XHTML 1.0包含了这个漏洞,但XHTML 1.1关闭了它,未完成的XHTML 2.0延续了要求严格错误处理的传统。这就是为什么有数十亿的页面声称是XHTML 1.0,而且只有少数页面声称是XHTML 1.1(或XHTML 2.0)。所以你真的使用XHTML吗?检查您的MIME类型。 (实际上,如果你不知道你正在使用什么MIME类型,我几乎可以保证你仍在使用text/html。)除非你为你的页面提供MIME类型{{1你所谓的“XHTML”只是名义上的XML。

  提议改进HTML和HTML表单的人们面临两种选择:放弃或继续他们在W3C之外的工作。他们选择了后者,注册了whatwg.org域名,并于2004年6月注册了the WHAT Working Group was born

  

[T]他工作组正在悄悄地做其他一些事情。其中一个是规范,最初被称为Web Forms 2.0,它为HTML表单添加了新类型的控件。 (您将在A Form of Madness中了解有关Web表单的更多信息。)另一个是名为“Web Applications 1.0”的草案规范,其中包括a direct-mode drawing canvas等主要新功能以及audio and video without plugins的本机支持。

  

2009年10月,W3C shut down the XHTML 2 Working Groupissued this statement to explain their decision

     
    

当W3C在2007年3月宣布HTML和XHTML 2工作组时,我们表示我们将继续监控XHTML 2的市场.W3C认识到向社区发出关于HTML未来的明确信号的重要性。

         

虽然我们认识到XHTML 2工作组多年来的贡献的价值,但在与参与者讨论后,W3C管理层决定允许工作组的章程在2009年底到期,而不是续订。

  
     

获胜的是那些发货的。

答案 3 :(得分:12)

  

我问的原因是因为你只是因为兼容性原因而知道它是可选的;他们本可以制作它们(强制性|禁止的),如果可以的话。

这是一个有趣的推论。我对它的解读是,几乎在任何时候都可以可靠地推断标签,标签是可选的。该设计表明其目的是使其快速简便地编写。

  

HTML 1,2,3对这些,现在是可选的结束标记做了什么。

HTML 2的DTD嵌入在RFC中,与原HTML DTD一起,在整个地方都有可选的开始和结束标记。

HTML 3被放弃(感谢浏览器大战)并被HTML 3.2取代(用于描述当时的网络状态)。

  

HTML 5有什么作用?

HTML 5从一开始就面向“铺设牛路”。

  

我该怎么办?

啊,现在这是主观的和议论性的:)

有些人认为明确的标签因其在读者眼前而更易于提高可读性和可维护性。

有些人认为,由于不会使编辑器混乱,推断标签更易于提高可读性和可维护性。

答案 4 :(得分:8)

  

HTML 5有什么作用?

这个问题的答案在W3C工作草案中: http://www.w3.org/TR/html5/syntax.html#syntax-tag-omission

  

我该怎么办?

这是一种风格问题。我尝试永远不会省略结束标记,因为它有助于我严格,省略必要的标记。

答案 5 :(得分:6)

如果它是多余的,请将其删除。

如果它有用(即使是一个看似微不足道的目的,例如安抚你的IDE或安抚你的眼睛),请将其保留。

在明确定义的规范中很少见到不影响行为的可选项。当然,除了“评论”之外。但HTML规范不是设计规范,而是更多关于当前主要实现状态的文档。因此,当一个项目在HTML中是可选的并且似乎没有用处时,我们可能会猜测,可选性质仅仅是特定浏览器中的怪癖记录。

查看上面链接的HTML-5规范RFC部分,您会看到可选标记与评论的存在奇怪地相关联!这应该告诉你,作者没有戴帽子。相反,他们在主要实现中玩“记录怪癖”的游戏。因此,我们不能在这方面过于认真地对待规范。

所以,解决方案是:不要出汗。继续前进到真正重要的事情。 :)

答案 6 :(得分:5)

我认为最好的答案是包括关闭标签以便于阅读或错误检测。但是,如果您有大量生成的HTML(例如,数据表),则可以通过省略可选标记来节省大量带宽。

答案 7 :(得分:4)

我的建议是省略大多数可选的关闭标记,以及您可以使用的所有可选属性。许多IDE都会抱怨,所以你可能无法省略其中的一些,但通常情况下,文件较小,杂乱程度较低。如果你有代码生成器肯定省略了那里的结束标记,因为你可以从中获得一些好的大小减少。通常情况下,这种方式并不重要。

但是当它确实重要的话就行动吧。在我最近的一些工作中,通过消除open标签的大部分生成的end和冗余值属性,我能够将渲染的HTML的大小从1.5 MB减小到800 KB,其中元素的文本与值。我有大约200个标签。我可以完全以其他方式实现这一点,但这将是更多的工作($$$),所以这使我可以轻松地使页面更具响应性。

出于好奇,我发现如果我删除不需要它们的属性的引号,我可以节省20 KB,但我的IDE(Visual Studio)不喜欢它。我也很惊讶地发现ASP.NET生成的真正长ID占我文件的20%。

我们可以将任何相关的HTML部分严格有效的想法首先被误导,所以做任何最适合您和您的客户的事情。我见过或使用过的大多数工具都会说它们生成xhtml,但它们并不是100%真正起作用,而且无论如何严格遵守都没有任何好处。

答案 8 :(得分:2)

就个人而言,我是XHTML的粉丝,就像ghoppe一样,“我试着永远不要省略结束标签,因为它有助于我严谨而不会省略必要的标签。”

如果你故意使用HTML 4.n,就不能说包含它们会让文档更容易消费,因为良好形式的概念与有效性相反是一个XML概念,你就失去了当您禁止某些关闭代码时,您会受益。因此,唯一的问题就是有效性......如果它没有它们仍然有效......你可以节省带宽,不是吗?

答案 9 :(得分:2)

使用结束标记可以更轻松地处理片段,因为它们的行为不依赖于兄弟元素。这个理由应该足够引人注目。是否还有人处理单片html文档?

答案 10 :(得分:1)

在一些像C#这样的大括号语言中,如果只有两行长,你可以省略if语句周围的花括号。例如......

if([condition])
[代码]

但你不能这样做......

if([condition])
[代码]
[代码]

第三行不会是if语句的一部分。它会伤害可读性,并且很容易引入错误,并且很难找到。

出于同样的原因,我关闭所有标签。像img标签这样的标签仍然需要关闭,而不是单独的结束标签。

答案 11 :(得分:0)

如果您正在编写HTML解析器,那么解析包含可选结束标记的HTML会不会更容易?我认为存在可选的结束标记会使其更容易,因为我不必推断结束标记的位置。

出于这个原因,我总是包含可选的结束标记 - 理论上我的页面可能渲染得更快,因为我为浏览器的HTML解析器创建了更少的工作。

答案 12 :(得分:-1)

做任何你认为使代码更具可读性和可维护性的内容。

就个人而言,我总是倾向于关闭<td><tr>,但我永远不会打扰<li>

答案 13 :(得分:-2)

对于禁止关闭类型,请使用以下语法:<img />使用/>关闭xml中接受的标记