设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

通过Doctype启用浏览器模式

2014-8-7 11:17| 发布者: joejoe0332| 查看: 4440| 评论: 0|原作者: hizzgdev|来自: 开源中国社区

摘要:   为了即能解析那些满足Web标准的网页,又能解析那些过去20年来遗留下来的传统的网页,现代浏览器一般都实现了多种网页解析的模型。本文将介绍这些解析模型都是什么,以及它们是如何触发的。 内容概述   本 ...


补遗:对XML的实现者和规范作者的恳求

请不要把doctype嗅探带到XML。

doctype嗅探是用标签杂烩汤似的方法解决一个标签杂烩汤问题。doctype嗅探是在HTML4和CSS2规范发布后设计的一种试探方法,它从文档中区分出过时文档以符合其作者可能期望的行为。

偶尔有人建议在XML上使用doctype嗅探来调度不同的处理、识别正在使用的词汇表或激活特性。这是个坏主意。调度和词汇表识别应该是基于名字空间的,而特性激活应该是基于明确的处理指令或元素。

良构(well-formedness)的整个思想是介绍允许XML的无DTD解析,且推广无doctype文档。在正式情况下,两个XML文档有相同的 规范形式且应用不同地处理它们(且不同之处并非因为没有选择处理外部实体),这个应用或许被破坏了。在实践情况下,如果两个XML文档导致同样的内容被报 告(qnames忽略)给SAX2内容处理器且 应用不同地处理文档,这个应用或者被破坏了。考虑到作为 Web作者无法相信每个人都会使用解决额外实体的XMLprocessor来解析其页面(即使一些浏览器看起来这样做,因为它们会映射一定公共的标识符到 一个有删节的定义实体的DTD),插入doctype到XML中用于Web是毫无意义的且通常会导致货运崇拜(cargo cultish)习惯。(您仍然使用W3C验证器的DTD覆盖功能来对一个DTD进行验证,虽然W3C验证器会说结果仅仅是暂时有效。或更好的是,你可以用放宽NG验证,它不会污染模式引用的文档。)为了嗅探而要求doctype是非常愚蠢的,即使那是在HTML实践中的解决方法。

此外,当低级别的规范定义两个相等的东西时,高级别的规范不应该尝试给它们不同的含义。请考虑<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">。如果删除公共标识符,依旧指定了同 样的DTD,因此doctype<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">表示和前面的doctype一样。应 该不同地嗅探它们么?可以进一步理论。假设复制给example.com一个叫foobar.dtd的DTD:<!DOCTYPE html SYSTEM "http://example.com/foobar.dtd">。这该如何嗅探?应该是同一个意思。甚至整个DTD可以贴在一起。

换句话说,如果有#include “foo.h”,你不应该给名字foo.h绑定任何black magic,因为它应该允许复制foo.h的内容到文档中或复制foo.h到bar.h中且表示#include “bar.h”。

我不担心HTML和SGML构造相同的参数的原因是Web浏览器不会使用真正的SGML解析器去解析HTML,所以我认为伪装成SGML进行处理是没有用的。如果你还不相信,请看W. Eliot Kimber’s  comp.text.sgml post about the matter


附录:text/html中一些doctype的处理方式

下表中,怪癖模式、标准模式和近乎标准分别表示为Q、S和A。当浏览器仅有两种模式时,如果表格单元格的行高和Mozilla的标准模式表现一致时,标准模式标记为“S”,如果表格单元格的行高和Mozilla的几乎标准模式表现一致时,则标记为“A”。

请注意使用XML内容模型的XHTML将会以XML模式进行渲染。

本表中所有的doctype并不都是新建页面的合理选择。本表只是列出了我推荐所依据的数据。

以下是表头的说明:

  • NS6Mozilla 0.6…0.9.4 and Netscape 6.0…6.2.3

  • Old MozMozilla 0.9.5 through 1.1 alpha and Mozilla 1.0

  • Moz & Safari & Opera 10 & IE10 & HTML5Mozilla 1.0.1, Mozilla 1.1 beta and later, Firefox, Netscape 7 and later, Safari 0.9  and later, Opera 10 and later, Chrome, Konqueror 3.5, IE10, the HTML5  specified behavior

  • Opera 9.0Opera 9.0…9.20

  • IE 8, IE 9 & Opera 9.5IE 8 or IE 9 by default when there is noX-UA-Compatible override nor a Compatibility View override (“A” means the IE8 Almost  Standards mode for IE8 and IE9 Almost Standards mode for IE9), Opera  7.5…8.54 and 9.5…9.6

  • IE 7 & Opera 7.10Windows IE 7, IE 8 with Compatibility View enabled but withoutX-UA-Compatibleoverride (in this case “A” means the IE7 mode) and Opera 7.10…7.23

  • IE 6 & Opera 7.0Windows IE 6 and Opera 7.0…7.03

  • Mac IE 5Mac IE 5.0…5.2.3

  • Konq 3.2Konqueror 3.2.2…3.3 (possibly also 3.1…3.2.1; I have not been able to confirm)

下面是一个表格,如果不能正常显示,请参见原文:https://hsivonen.fi/doctype/

Doctype NS6 Old Moz Moz &
Safari &
Opera 10
&
IE10
& HTML5
Opera 9.0 IE 8, IE 9 & Opera 9.5 IE 7 & Opera 7.10 IE 6 & Opera 7.0 Mac IE 5 Konq 3.2
None       Q Q Q Q Q Q Q Q Q
<!DOCTYPE html> Q S S S S A A A
<!DOCTYPE html SYSTEM "about:legacy-compat"> ? ? ? ? ? ? ? ?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> Q Q Q Q Q Q Q Q Q
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> S S S S S A A A A
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> S S S S S A A Q A
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/html4/strict.dtd"> S S S S S A A A A
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> S S S S S A A A A
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> Q Q Q Q Q Q Q Q Q
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> Q Q Q Q Q Q Q Q Q
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> S S A A A A A A Q
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">      Q S A A A A A A Q
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> Q Q Q Q A A A A Q
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> S S S S S A A A A
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd"> S S S S S A A A A
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> S S S S S A A A A
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">      S S A A A A A A Q
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
S S S S S A Q A Q
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">
S S S S S A Q A Q
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
S S S S S A Q A Q
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     
S S A A A A Q A Q
<!DOCTYPE HTML PUBLIC "ISO/IEC 15445:2000//DTD HTML//EN"> Q S S Q Q Q Q Q Q
<!DOCTYPE HTML PUBLIC "ISO/IEC 15445:2000//DTD HyperText Markup Language//EN"> Q S S S S A A A Q
<!DOCTYPE HTML PUBLIC "ISO/IEC 15445:1999//DTD HTML//EN"> S S S Q Q Q Q Q Q
<!DOCTYPE HTML PUBLIC "ISO/IEC 15445:1999//DTD HyperText Markup Language//EN"> S S S S S A A A Q


历史记录

Moziila的doctype嗅探代码在2000年10月、2001年9月和2002年6月有大幅度的修改。本文档描述的Mozilla(和 Netscape 6.x)建立的状态可以自2000.10.19起在ftp.mozilla.org上看到。本文档未涉及Mozilla M18(和Netscape 6.0 PR3)中的doctype嗅探的工作方式。Safari的doctype嗅探代码自第一个公开的测试版起也有大幅度的修改。本文档不包括比版本V73也 叫0.9更早的行为。

Konqueror3.5之前的doctype嗅探代码似乎来自于Safari的很早的一个版本。Konqueror现在和Safari匹配,其doctype嗅探代码来自Mozilla。

从表中可见,Opera的doctype嗅探正由规律的从类似IE向类似Mozilla转变,虽然Opera9.5和9.6在倒退的路上。同时,Opera怪癖模式的布局行为已从仿效IE6的怪癖模式转换到Mozilla的怪癖模式。


附录:IE8的模式选择

开始选择

  • X-UA-Compatible meta元素

    • IE=7: 使用 IE7 标准模式

    • IE=EmulateIE7: 参见 “怪癖模式或无模式 (兼容模式)”.

    • IE=IE8 or IE=IE7 or IE=a or IE=EmulateIE8 or absent or has script first: 参见 “X-UA-Compatible HTTP 头”.

    • IE=8 or IE=Edge or IE=99 or IE=9.9: 参见 “近乎标准模式Doctype?”.

    • IE=5: 使用怪癖模式 (IE 5.5).

  • X-UA-Compatible HTTP 头?

    • IE=7: 使用 IE7 标准模式

    • IE=EmulateIE7: 参见 “怪癖模式或无模式 (兼容模式)”.

    • IE=IE8 or IE=IE7 or IE=a or IE=EmulateIE8 or absent: 参见 “显示所有互联网站点...预设”.

    • IE=8 or IE=Edge or IE=99 or IE=9.9: 参见 “近乎标准模式Doctype?”.

    • IE=5: 使用怪癖模式 (IE 5.5).

  • 怪癖模式或无模式 (兼容模式)

    • Yes: 使用怪癖模式 (IE 5.5).

    • No: 使用 IE7 标准模式

  • 显示所有互联网站点...预设

    • Yes: 参见 “怪癖模式或无模式 (兼容模式)”.

    • No: 参见 “显示所有内联网站点...预设”.

  • 显示所有内联网站点...预设

    • Yes: 参见“是否在内联网区域”.

    • No: 参见“域名是否在微软管理的列表中”.

  • 是否在内联网区域

    • Yes: 参见 “怪癖模式或无模式 (兼容模式)”.

    • No: 参见 “域名是否在微软管理的列表中”.

  • 域名是否在微软管理的列表中

    • Yes: 参见 “怪癖模式或无模式 (兼容模式)”.

    • No: 参见 “是否被兼容模式的页面嵌入”.

  • 是否被兼容模式的页面嵌入

    • Yes: 参见 “怪癖模式或无模式 (兼容模式)”.

    • No: 参见 “是否按下了兼容模式按钮”.

  • 是否按下了兼容模式按钮

    • Yes: 参见 “怪癖模式或无模式 (兼容模式)”.

    • No: 参见 “怪癖模式或无模式 (IE8)”.

  • 怪癖模式或无模式 (IE8)

    • Yes: 使用怪癖模式 (IE 5.5).

    • No: 参见 “近乎标准模式Doctype?”.

  • 近乎标准模式Doctype?

    • Yes: 使用IE8近乎标准模式

    • No: 使用IE8标准模式

这些步骤的流程图还有 PDF 和 PNG 两种模式。

致谢

感谢Simon Pieters、Lachlan Hunt和Anne van Kesteren帮助我改正了各种Opera版本的模式表和他们的评论。感谢Simon Pieters制作了另一份IE8的流程图。


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部