7

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

例子:

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

</html>
4

3 回答 3

7

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

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

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

<!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 模式)。

于 2012-10-30T07:11:38.813 回答
0

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

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

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

这是 W3School 的参考页面DOCTYPE

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

于 2012-10-30T04:20:30.133 回答
0

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

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

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

于 2012-10-30T05:03:46.953 回答