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 空白字符 注释 渲染模式