为什么在HTML文件中要添加XHTML文档类型声明?这样做有什么作用?

8
我好奇遇到的网页中有很多是HTML文件,但却带有XHTML DOCTYPE声明。为什么人们这样做?他们希望实现什么?为什么不将XHTML doctype声明保留给真正的XHTML文件? 我是否有所遗漏?
编辑: 关于“真正的XHTML文件”存在一些混淆;为了证明差异不是由DOCTYPE声明引起的,请将此文件此文件进行比较。第一个是HTML,第二个是XHTML,尽管内容完全相同;只有文件类型不同。两者在符合标准的浏览器中都可以正常显示,但第一个是使用HTML解析器解析的,第二个是使用XML解析器解析的。

“实际的XHTML文件”是什么意思?是指具有有效XHTML内容的文件吗? - James Allardice
不,不是XHTML文件类型;.xhtml后缀;application./xhtml+xml MIME类型... - Mr Lister
尽管现在他们已经转向HTML5,但W3Schools多年来一直这样做,并提倡这种方法。虽然他们不是唯一的原因,我无法对个别决策进行评论,但直接或间接地影响了许多网站。 - Alohci
@Alohci:你的意思是只需要添加XHTML文档类型声明,然后忘记其他的吗? - BoltClock
3
他们只是将页面标记为XHTML并将其作为"text/html"提供。他们对转换过程的描述以及其网站的XHTML页面中的任何内容都没有讨论MIME类型的重要性或相关性。 - Alohci
4个回答

11
为什么在HTML文件上添加XHTML文档类型声明?那有什么作用吗?
这只是告诉标记验证器他们将要验证一个XHTML文档,而不是一个常规的、基于SGML的HTML文档。它描述了内容,更具体地说是随后的标记,但没有其他作用。
人们为什么要这样做?他们希望实现什么目标?为什么不将XHTML文档类型声明保留给实际的XHTML文件?或者是我漏掉了什么?
有点。实际上发生的事情是,人们并不知道在HTML文档顶部放置XHTML文档类型声明并不会自动将其转换为XHTML文档,尽管可以承认,这正是每个人所希望的。
你看,大多数网络应用程序没有正确配置将XHTML文档序列化为application/xhtml+xml,而是选择将页面作为text/html提供。(这通常是因为文件扩展名.html,一般来说,服务器确实会将application/xhtml+xml应用于扩展名为.xhtml.xht的文档,但只有真正使用文件格式的静态站点才能从中受益。)这导致浏览器决定它们接收到了一个常规的HTML文档,因此我们都知道和喜欢的那些标签乱解析问题不可避免地出现了。
请注意,即使您在XHTML文档上有这样的元标记,也没有关系:
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />

浏览器会忽略这个,只会查看与XHTML文档一起发送的实际HTTP Content-Type标头。更糟糕的是,在XHTML全盛时期过去的几年中使用最广泛的浏览器Internet Explorer在版本9最终发布之前从未正确支持application/xhtml+xml MIME类型:它不会解析标记,构造DOM并呈现页面,而只会要求下载文件,这使得XHTML页面无法使用!所以,你知道我们在HTML5变得流行之前都得忍受什么吗?这个问题加上IE6在doctype声明之前的XML声明上出现quirky等事情也是导致XHTML衰落的最大因素之一(加上XHTML 1.1从未获得广泛使用,XHTML 2.0被取消以支持HTML5)。

实际上,我喜欢XHTML。如果我想确保我的页面正确,我不必上传它们然后在验证器上释放它们,我只需要尝试将它们加载到我的浏览器中即可。当然,我可以使用XHTML doctype提供HTML5文档,但那并不相同。首先,我不知道浏览器是否会使用XML或HTML解析器。 - Mr Lister
@Mr Lister:我也喜欢。不过你只需要提供正确的MIME类型,现代浏览器(包括IE9+)就会将你的文档视为XHTML。(顺便说一句,“带有XHTML doctype的HTML5文档”并不是很合理 :)) - BoltClock
糟糕,太晚编辑了。我是指带有XHTML内容类型的HTML5! - Mr Lister

5

大多数人使用XHTML doctype是因为在某个旧书或论坛上看到过,但他们并不知道任何技术原因而使用它。几乎没有人正确地将其作为application/xml+xhtml服务。将XHTML页面作为text/html提供意味着“标签汤”或“破碎的html”。这样做是不应该的,但浏览器通常会处理得很好。

你对此的思考是正确的。这让我疯了。


3
我假设您想知道为什么人们使用"text/html" MIME类型而不是"application/xhtml+xml"来作为HTML的XHTML文档服务。主要原因是对兼容性的误解:许多浏览器根本不理解XHTML+XML MIME类型,这迫使用户将其作为HTML进行服务以克服此问题。由于浏览器经常不会抱怨它们所获得的内容,人们很少研究,大多数人认为浏览器只是将XHTML文档视为XHTML,即使它是以HTML形式提供的。但实际上,浏览器将其作为HTML服务。由于这两种语言非常相似,人们很少注意到区别。所以,不,您没有错过任何东西;这是非常糟糕的做法。现在,在HTML5之后,幸运的是,这种情况似乎变得越来越少见了。

2
大多数编写XHTML的人将其作为“text/html”提供,这时您会失去大部分优势。例如,所有浏览器都会在这种情况下将其视为HTML。请阅读“将XHTML作为text/html发送被认为是有害的”(http://hixie.ch/advocacy/xhtml)。 - robertc
“为什么人们使用text/html MIME类型而不是application/xhtml+xml将XHTML文档作为HTML提供。”这句话的意思是一样的。所以,好吧。我不确定你为什么会被踩;可能是因为有些人没有完全理解。 - Mr Lister
@Mr Lister:在投票后,答案已被完全编辑成不同的内容。要么投票者没有跟进,要么...他们不理解 :) - BoltClock

2
关于XHTML的有趣之处在于,由于IE在XHTML流行的巅峰期无法理解XML mimetype(application/xhtml+xml),大多数人实际上从未使用过它的XML部分,因为IE8及以下版本拒绝呈现内容。
这意味着数百万网站认为它们正在使用符合标准的XHTML,而实际上它们被解析为畸形/奇怪的HTML4。
幸运的是,HTML5出现了,并且正确定义了文档解析,消除了围绕XHTML的歧义(所有那些过渡和严格的垃圾)。
在doctype之前添加XML prolog的人会给自己带来额外的伤害,因为doctype之前的注释将导致旧版IE使用quirks模式,其中包括在IE6及以下版本中恢复旧版盒子模型。这无疑导致了对IE6的大规模厌恶,因为在quirks模式下,它具有重大缺陷,导致现代布局完全崩溃,而不仅仅是缺乏新功能。
简而言之,在这个行业中,许多人只是复制和粘贴代码而不理解它。

4
IE可以很好地理解XML格式,但它不支持XHTML格式。 - Rob
4
这并不是关于XHTML的“有趣事情”,而是非常悲哀的,它是IE一直阻碍Web发展的完美例证。 - Rob
1
@BoltClock - 你的意思是,他们只为HTML5做了这个?从浏览器的角度来看,HTML5向后兼容早期版本。没有暗示早期的XHTML版本不受支持。事实上,我的网站将XHTML 1.0作为application/xhtml+xml提供给IE9,它也可以很好地支持。 - Alohci
@RichBradshaw:“幸运的是,HTML5出现了,并且正确地定义了文档解析”,这并不是很公平。XHTML也是一个非常好的和明确的标准,至少如果你不算XHTML 1.0的话。 - Mr Lister
3
“幸运的是,HTML5出现了,它正确地定义了文档的解析。” HTML4及更早版本的解析也是被正确定义的。但最初没有任何浏览器厂商关注正确实现解析,后来网络变得混乱不堪,修复HTML解析意味着几乎没有网站能如预期展示。” - user743382
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接