打印

HG8001: DTD 之前的非空白字符在某些情况下会使该 DTD 失效

作者:丁宗秋

标准参考

HTML 4.01 规范中提到,DTD 的前面或后面允许出现空白符,这里提到的“空白符”包括空格符换行符制表符注释

关于 HTML 文档结构的详细信息,请参考 HTML 4.01 规范 7.1 Introduction to the structure of an HTML document 中的内容。

问题描述

如果在 DTD 之前加入注释或其他内容,在某些浏览器中该 DTD 将无法被识别。

造成的影响

这个问题将导致同一个页面在有些浏览器中工作在标准模式 (S) 下,在其他浏览器中工作在混杂模式 (Q) 下,从而导致该页面的表现在各浏览器中产生较大差异,如布局混乱、内容重叠、功能无法使用等。

受影响的浏览器

IE6 DTD 前的任何非空白符都将使浏览器忽略 DTD,包括注释和 XML 声明。
IE7 IE8 DTD 前的任何非空白符都将使浏览器忽略 DTD,包括注释,但不包括 XML 声明。
Firefox DTD 前的任何包含“<”的字符都将使浏览器忽略 DTD,但不包括 XML 声明。
Chrome Safari Opera DTD 前的任何非空白符都将使浏览器忽略 DTD,但不包括 XML 声明。

问题分析

一个 HTML 文档的 DTD 前边如果出现其他字符,在各浏览器中的处理情况是不一致的。

具体差异请参考下表:

如果 DTD 之前出现 浏览器是否能识别该 DTD
IE6 IE7 IE8 Firefox Chrome Safari Opera
空格符 换行符 制表符 可以识别 可以识别 可以识别 可以识别 可以识别 可以识别 可以识别
注释1 不能识别 不能识别 不能识别 可以识别 可以识别 可以识别 可以识别
XML 声明2 不能识别 可以识别 可以识别 可以识别 可以识别 可以识别 可以识别
其他不包含“<”的字符3 不能识别 不能识别 不能识别 可以识别 不能识别 不能识别 不能识别
其他包含“<”的字符4 不能识别 不能识别 不能识别 不能识别 不能识别 不能识别 不能识别

【注】
1. 即HTML注释,如 <!-- comment -->。
2. 类似 <?xml version="1.0" encoding="utf-8"?> 的 XML 声明。
3. 即不是空格符、换行符、制表符,也不是注释、XML 声明的任何其他字符串,但不能包含“<”字符。
4. 即不是空格符、换行符、制表符,也不是注释、XML 声明的任何其他字符串,其中包含“<”字符。

通过以上对比可以看出,要保证 DTD 在所有浏览器中都能正常识别,DTD 之前只能出现空格符换行符制表符

解决方案

声明 DTD 时,确保 DTD 之前没有其他字符,即便有,也只能是空格符换行符制表符

如将 DTD 放在 HTML 文档的第一行。

参见

知识库

相关问题

测试环境

操作系统版本: Windows 7 Ultimate build 7600
浏览器版本: IE6
IE7
IE8
Firefox 3.6
Chrome 4.0.302.3 dev
Safari 4.0.4
测试页面: comment.html
xml_statement.html
with_lt_char.html
without_lt_char.html
本文更新时间: 2010-05-28

关键字

DTD 空白字符 注释 渲染模式