首页 > 开发 > HTML > 正文

DOCTYPE类型详细介绍

2020-09-18 22:21:42
字体:
来源:转载
供稿:网友

我们在html里面声明doctype一般会有以下几种:

<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<!doctype html public "-//w3c//dtd xhtml 1.0 strict//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
<!doctype html public "-//w3c//dtd html 4.01//en" "http://www.w3.org/tr/html4/strict.dtd">
<!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd">

是的,这里有html和xhtml,也有transitional和strict之分。顾名思义,xhtml是指这个文档是按照xml的格式来书写的,而html则表示这个文档是按照html的格式来书写的。transition则表示这个文档达到了transitional.dtd或者loose.dtd的要求,strict则表示这个文档达到了strict.dtd的要求。但事实上我们经常会存在以下的误解:

(1) 我的文档是声明为xhtml的,则我的文档肯定完全按照xml的格式。
(2) 我的文档是声明为strict的,则我的文档肯定是按照strict mode的方式来render的,反之,是以quirks mode的方式来render的。

这两种理解都很直接,然而却是错误的,我们也经常会犯这种的错误。

首先,文档声明为xhtml和html,和文档的parse(即浏览器对文档的分析)是没有直接关联的。事实上,浏览器如何parse文档取决于服务器以什么格式来提供这个文档。通常情况下,有两种方式,"text/html"和"application/xhtml+xml"。只有以"application/html+xml"方式来提供的文档才能够被按照xml的方式来parse。然而,因为浏览器的历史原因,并不是所有的浏览器都支持"application/xhtml+xml"格式的文档,ie7之前的版本(包括ie7)就不能够支持这种格式,如果ie7碰到这种格式的文档,它会提示用户另存为其它文件。考虑到ie使用的广泛性,目前绝大部分的文档都是以"text/html"的方式来提供的。以"text/html"方式来提供的文档是按照html的语义来parse的,大家都知道html的容错性是非常强的,即使你的文档里面的tag没有正确地关闭,这个html也能够被正确地显示出来。因此如果你的xhtml是以"text/html"的方式来提供的(绝大多数情况下都是),那么你即使在doctype里面声明了xhtml,你的文档也不是以xml的格式来parse的,因此也不能保证你的文档是严格按照xml的规范的。事实上,很多专家都建议如果你的文档不是以"application/xhtml+xml"的方式来提供的,那么你就应该声明为html。

其次,浏览器以什么样的方式来render你的文档,并不以你声明的dtd来决定的。事实上,如果你声明了doctype和dtd,你的文档就是以strict mode(或者称为standard mode,很多浏览器还包括almost standard mode的方式,这里不进行区分)方式来render的。对于没有doctype的文档,才是以quirks mode方式来render的。因此浏览器的render模式和你声明的dtd并没有直接的关系。

最后,你声明为strict.dtd还是transitional.dtd,在目前的浏览器看来是没有什么区别的。strict.dtd比transitional.dtd或者loose.dtd要严格多了,很多元素在strict.dtd里面都不能使用。然而因为浏览器的兼容性,即使你在doctype里面声明了strict.dtd,浏览器遇到strict.dtd里面不允许的元素,也还能够正确地显示你的文档。我猜测浏览器并没有将dtd考虑进去。例如iframe这个tag在strict.dtd里面并不存在,但即使你的doctype里面声明了strict.dtd,然后使用了iframe这个tag,浏览器(包括ie7,ie8,ff3.0,safari 3.0)都能够正确地显示你的文档。浏览器并没有按照你声明的dtd来parse你的文档。目前能够保证你的文档是符合strict.dtd还是transitional.dtd的,只能通过一些网上的validator,如w3c validator来分析,浏览器并不能够给你很好的支持。当然,实际上如果你能够严格按照你声明的dtd来书写你的文档,那是最好的,这样保证了以后浏览器对dtd严格遵守的时候,你的文档不会产生错误。

因此,

(1) 如果你的文档是以"text/html"的方式来提供的,那么你就应该声明为html。假如你想要让ie7能够正确地显示,那么你就更应该这么做了。
(2) 如果你的文档声明为xhtml,那么你应该以"application/html+xml"的方式来提供。
(3) 尽量在你的文档前面声明doctype和dtd,这样能够保证你不是以quirks mode的方式来render文档的。
(4) 如果你声明了dtd,那么就要严格按照dtd的要求来书写你的文档。特别是如果你声明了strict.dtd,那么你应该注意哪些元素是不能够使用的。

注意:随着时间的发展,浏览器对html和xhtml,strict.dtd和transitional.dtd的支持会更好。如果你的浏览器比ie7, ie8, ff 3.0和safari 3.0要高很多很多的版本,那么你要注意本文的适用性。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表