HTML/XHTML常见问题解答

Flask文档和示例应用程序正在使用HTML5。您可能会注意到,在许多情况下,当结束标记是可选的时,它们不会被使用,这样HTML就更简洁、加载更快了。有许多关于 HTML 和 XHTML 的混淆,本文档尝试回答一些主要的疑问。

XHTML的历史

有一段时间,HTML似乎即将被XHTML取代。然而时至今日,鲜有真正使 用 XHTML (根据 XML 规则处理的 HTML )的网站。出现这种情况的原因很多。其一是 Internet Explorer 对 XHTML 支持不完善。 根据规范要求 XHTML 必须使用 application/xhtml+xml MIME 类型,但是 Internet Explorer 却拒绝读取这个 MIME 类型的文件。虽然通过配置 Web 服务器来为 XHTML 提供正确的服务相对简单,但是却很少有人这么做。这可能是因为正确地使用 XHTML 是一件很痛苦的事情。

造成这种痛苦的最重要原因之一是XML的严格的(严格而无情)错误处理。当遇到XML解析错误时,浏览器应该向用户显示一条丑陋的错误消息,而不是试图从错误中恢复并显示它所能显示的内容。Web上的大多数(x)HTML生成都基于非XML模板引擎(如在flask中使用的jinja),这些引擎不会阻止你意外创建无效的XHTML。有一些基于XML的模板引擎,比如kid和流行的genshi,但是它们通常会带来更大的运行时开销,而且使用起来也不是那么简单,因为它们必须遵守XML规则。

然而,大多数用户都认为他们正确地使用了XHTML。他们在文档顶部编写了一个XHTML doctype,并自动关闭了所有必要的标签。( <br> 变成 <br/><br></br> 在XHTML中。即使文档可以正确地通过 XHTML 验证,然而真正决定浏览器中 XHTML/HTML 处理的是前面提到的,经常不被正确设置的 MIME 类型。一旦类型错误,有效的 XHTML 会被视作无效的 HTML 处理。

XHTML还改变了JavaScript的使用方式。为了正确地使用XHTML,程序员必须使用带有XHTML名称空间的命名DOM接口来查询HTML元素。

HTML5的历史

HTML5 规范是由网络超文本应用技术工作组( WHATWG )于 2004 年开始制定的,最 初的名称是“ Web 应用1.0 ”。 WHATWG 由主要的浏览器供应商苹果、 Mozilla 和 Opera 组成。 HTML5 规范的目标是编写一个新的更好的 HTML 规范,该规范是基于 现有浏览器的行为的,而不是不切实际的,不向后兼容的。

例如,在 HTML4 中 <title/Hello/ 与 <title>Hello</title> 理论上完全相同。然而,由于人们沿用了 <link /> 之类的 XHTML-like 标签, 浏览器就 会识别为 XHTML 而不是 HTML 。

2007 年, W3C 以这个规范为基础,制定了一个新的 HTML 规范,也就是 HTML5 。 现在,随着 XHTML 2 工作组的解散,而且 HTML5 正在被所有主流浏览器供应商实现, XHTML 逐渐失去了吸引力。

HTML与XHTML

下表简要介绍了HTML 4.01、XHTML 1.1和HTML5中可用的功能。(不包括XHTML 1.0,因为它已被XHTML 1.1和几乎不使用的XHTML L5取代。)

  HTML4.01 XHTML1.1 HTML5
<tag/value/ == <tag>value</tag> Yes [1] No No
支持``<br/>`` No Yes Yes [2]
支持``<script/>`` No Yes No
应该解析为'text/html` Yes No [3] Yes
应该解析为'application/xhtml+xml` No Yes No
严格的错误处理 No Yes No
内联SVG No Yes Yes
内联MaTML No Yes Yes
``<video>``标记 No No Yes
``<audio>``标记 No No Yes
新的语义标记,比如 <article> No No Yes
[1]这是从SGML继承的一个模糊特性。浏览器通常不支持它,原因如上所述。
[2]这用于兼容根据 XHTML 规范为 <br> 之类的标记生成的服务代码。它不应该在新代码中出现。
[3]XHTML 1.0 是考虑向后兼容,允许呈现为 text/html 的最后一个 XHTML 标准。

“严格”是什么意思?

HTML5已经严格定义了解析规则,但它也精确地指定了浏览器应该如何对解析错误做出反应-与XHTML不同,XHTML只声明解析应该中止。有的人对有显而易见的语法错误的标记任然能够得到预想的结果感到疑惑不解(例如,缺少结束标记或未加引号的属性值)。

之所以能够得到预想的结果,有的是因为大多数浏览器会宽容处理错误标记,有的是因为错误已经被指定了解决方式。以下结构在 HTML5 标准中是可选的,但一定被浏览器支持:

  • 用 <html> 标签包裹文档
  • 把页首元素包裹在 <head> 里或把主体元素包裹在 <body> 里
  • 关闭 <p><li><dt><dd><tr><td><th><tbody><thead><tfoot> 标签。
  • 引用属性,只要它们不包含空格或特殊字符(如 <>'"
  • 布尔属性必须赋值。

这意味着HTML5中的以下页面完全有效:

<!doctype html>
<title>Hello HTML5</title>
<div class=header>
  <h1>Hello HTML5</h1>
  <p class=tagline>HTML5 is awesome
</div>
<ul class=nav>
  <li><a href=/index>Index</a>
  <li><a href=/downloads>Downloads</a>
  <li><a href=/about>About</a>
</ul>
<div class=body>
  <h2>HTML5 is probably the future</h2>
  <p>
    There might be some other things around but in terms of
    browser vendor support, HTML5 is hard to beat.
  <dl>
    <dt>Key 1
    <dd>Value 1
    <dt>Key 2
    <dd>Value 2
  </dl>
</div>

HTML5的新技术

HTML5增加了许多新功能,使Web应用程序更易于编写和使用。

  • <audio><video> 标签提供了一种嵌入音频和视频的方法,而不需要像QuickTime或Flash这样复杂的附加组件。
  • 像``<article>`` , <header><nav><time> 语义元素使得内容更容易理解。
  • <canvas> 标记支持强大的绘图 API ,减少了图形化展示数据时在服务器端 生成图像的需求。
  • 新的表单控件类型,比如 <input type="data"> 方便用户代理输入和验证数据。
  • 高级JavaScript API,如Web存储、Web工作者、Web套接字、地理位置和脱机应用程序。

除了上述功能之外, HTML5 还添加了许多其它的特性。 Mark Pilgrim 即将出版的 Dive Into HTML5 一书是 HTML5 新特性的优秀指导书。目前,并不是所有的新特 性都已被浏览器支持,无论如何,请谨慎使用。

应该使用什么?

当前情况下,答案是 HTML5 。考虑到 web 浏览器最新的开发,几乎没有理由再使用 XHTML 。综上所述:

  • Internet Explorer(遗憾的是,目前在市场份额中处于领先地位)对XHTML的支持很差。
  • 许多JavaScript库也不支持XHTML,因为它需要更复杂的名称空间API。
  • HTML5增加了一些新功能,包括语义标签和期待已久的 <audio><video> 标签。
  • 它拥有大多数浏览器供应商的支持。
  • 它易于编写,而且更简洁。

对于大多数应用程序,使用HTML5无疑比使用XHTML要好。