【问题标题】:Multiple Doctypes in a single HTML Document单个 HTML 文档中的多个 Doctype
【发布时间】:2026-02-03 09:55:01
【问题描述】:

如果一个 HTML 文档有两种 doctype,那么这些 doctype 将如何影响页面的呈现以及浏览器会选择哪种 doctype?在一个文档中包含两个(或更多)文档类型是否有效或令人困惑?

例子:

<!DOCTYPE html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>

</html>

【问题讨论】:

  • 您为什么要尝试使用 2 种文档类型?最有可能的是,第一个将设置页面,第二个将使其无效
  • 在我的问题中我是否提到过我使用了两种文档类型?我在互联网上看到了这样的实现,并出于好奇而询问。我永远不会在我这边使用双重文档类型。

标签: html browser doctype


【解决方案1】:

只允许一个 doctype 声明。这直接来自 HTML 规范以及 HTML5 草案,也可以使用validator 进行检查。

因此,没有规范应该发生什么。自然的期望是,由于浏览器在决定浏览器模式(Quirks Mode 与标准模式)时仅在“doctype sniffing”中处理 doctype 声明,因此只有第一个 doctype 声明生效,而另一个被忽略。

这可以进行测试,例如如下(使用 HTML 3.2 doctype,在所有 doctype-sniffer 浏览器上触发 Quirks Mode):

<!DOCTYPE HTML>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<title>Testing duplicate doctype effect</title>
<script>
document.write(document.compatMode);
</script>
</html>

这会显示“CSS1Compat”(= 标准模式),而交换 doctype 声明会导致“BackCompat”(= Quirks 模式)。

【讨论】:

  • “只允许一个 doctype 声明......因此,没有说明应该发生什么” - 我不相信坏人总是遵守规则;)
【解决方案2】:

我相信第一个DOCTYPE 被浏览器使用,并且文档中包含多个DOCTYPE 是违反规范的。

我认为(不确定)多个DOCTYPE-s 可能有效的唯一情况是使用 IE 条件 cmets。当然,除了 IE 之外的浏览器不会看到这些。

我记得读过一篇博客文章(现在找不到,所以我可能错了)但是一些(大多数?)浏览器甚至会忽略 DOCTYPE,如果它不是他们遇到的第一件事。 (这可能是一个已修复的错误。)

这是 W3School 关于DOCTYPE 的参考页面:

http://www.w3schools.com/tags/tag_doctype.asp

【讨论】:

  • 我看到的是没有条件 cmets 的例子。如果不是第一件事,我确实记得关于忽略 doctype 的部分 - 甚至是空格
  • @mauris 我认为那些是无效的 HTML 文档 - 大多数浏览器会忽略 DOCTYPE-s 并尝试在解析文档时寻找提示以查看如何解析它。
【解决方案3】:

如果您的 HTML 页面中有多个 DOCTYPE-s,那么浏览器将考虑第一个,浏览器逐行解析 DOM。一旦浏览器获得 DOCTYPE,它将停止寻找其他 doctype,并跳转到 HTML 标签的搜索。

在上面的问题中,首先提到了 HTML-5 DOCTYPE HTML-4,根据这个浏览器会将内容呈现为 HTML-5 doctype

最好在http://www.w3schools.com/ 中尝试一次...尝试使用“code”或“kbd”或“dfn”或“samp”或“strong”标签,优先提及这两种文档类型。

【讨论】:

    最近更新 更多