前端翻译:Activating Browser Modes with Doctype

一、前言                        

  原本备份: http://www.cnblogs.com/fsjohnhuang/p/3830623.html

  由于本人英语能力有限,译本内容难免有误,望各位指正!

  本译文不含附录部分,请知悉。

 

二、译文内容                      

为了让用户正常访问遵循Web标准的网站和90年代后期的非标准网站,当前的浏览器都内置了多种引擎模式。本文将解释这些模式和它们触发的原理。
本文概要(没耐性的同学看完这个就可以闪了!)
本文结论:以<!DOCTYPE html>作为你们的HTML文档(http头的mime为text/http的文档)的首行。
如果你们希望禁止用户在使用IE8、9、10浏览你的网站时,不会因点击地址栏旁的兼容性按钮而导致网站以IE7的文档模式被解析、渲染,那么就在HTTP头那加上X-UA-Compatible: IE=Edage,或在<head></head>间加句<meta http-equiv="X-UA-Compatible" content="IE=Edge">吧。其实IE一般都会选择合理的文档模式,所以没什么必要加上述IE独有的魔咒。
本文的上下文
    本篇覆盖Firefox、其他基于Gecko内核的浏览器、Safari、Chrome、其他基于Webkit内核的浏览器、Opera、Konqueror、IE 4 Mac,IE 4 Windows(包含4 WP)和其他IE内核的浏览器的模式转换。并使用知名浏览器来代表各款内核描述模式转换。
    本文重点讲解模式选择的机制而不是各种模式对应的
行为特征。目的是让大家理解如何避免陈旧的模式,当然也不是旨在促进大家采用更良好的模式了。
各种模式

text/html 内容的模式
一般来讲doctype嗅探将影响text/html内容的模式。IE8+影响模式的要求就更加复杂,其中包含网站是否为内网网站,该网站有没有添加到兼容性视图列表当中。倘若IE6、7中安装了Google Chrome Frame插件,那么就不仅doctype嗅探会影响text/html内容的模式了。(Google Chrome Frame其实就在IE6、7、8、9下使用Webkit作内核的插件)
    怪异模式
        怪异模式是浏览器为了正确呈现90年代后期制作的网页,从而违反当前Web规范的模式。以前,各浏览器的怪异模式各不相同。IE6789的怪异模式其实就是IE5.5的文档模式,而其他浏览器的怪异模式就稍微与近标准模式有偏差而已。但IE10开始,其怪异模式不再仿照IE5.5的文档模式了,而是和其他浏览器的怪异模式相近了。
    如果你正在开发一个新网站,千万不要用怪异模式,用标准模式吧朋友。
 
    标准模式
        标准模式下,浏览器尝试对网站提供HTML规范处理外,还提供浏览器独有的各种特性。
        由于各浏览器对HTML规范实现的不同,所以各浏览器的标准模式不尽相同。
        在HTML specification中标准模式被称作“非怪异模式”。
 
    准标准模式
Firefox、Safari、Chrome、Opera(从7.5开始)、IE8910,有有“准标准模式”,其不按CSS2标准而实现了vertical sizing of table cells(求高手解答,这是啥啊?)。Mac IE5,Windows IE67,Opera7.5前的版本和Konquer均没有准标准模式,因为它们在各自的标准模式中实现了vertical sizing of table cells。实际上,它们的标准模式更接近于近标准模式而不是现在浏览器的标准模式。
        回顾历史我们会发现,在不区分“标准模式”和“近标准模式”,默认使用“准标准模式”的行为特征,并使用“标准模式”的CSS特征会让Web更美好。不过我们依然应优先使用“标准模式”。
        在HTML specification中准标准模式被称为“受限的怪异模式”。
application/xhtml+xml内容的模式(XML模式)
        Firefox,Safari,Chrome,Opera 和 IE9,HTTP头的Content-Type为application/xhtml+xml会触发XML模式。当处理XML模式时,上述浏览器会结合自身浏览器所提供的特征行为并符合标准规范来解析、处理XML文档。
·       除了IE5外,IE678是不支持application/xhtml+xml的。
在基于Webkit内核的Nokia S60浏览器下,由于考虑到兼容性问题,即使HTTP头的Content-Type为application/xhtml+xml是不会触发XML模式的,而是采用移动终端范围内的非规范内容处理XML(由于历史遗留的移动浏览器没有真实的XML解析器,因此XML会被标识为非规范话内容)。
        我没有在塞班自带的浏览器上测试过,也没有在Konqueror上作充分地测试,所以不敢保证其准确的行为模式。
IE特有的模式

以下的模式是IE独有的,并不符合HTML5规范且其他浏览器均没有实现的。通过在HTTP头或meta元素设置X-UA-Compatible来触发。
        IE5怪异模式
            除了和其他浏览器相近的怪异模式外,IE10还提供了一个“IE5怪异模式”,其实就是IE6789的怪异模式而已(IE5.5的文档模式)。
        IE7标准模式
            IE8910提供该模式用于模拟IE7的标准模式。
        IE8标准模式
            IE910提供该模式用于模拟IE8的标准模式。
        IE8准标准模式
            IE910提供该模式用于模拟IE8的准标准模式,但在开发者工具中,该模式和IE8标准模式是合并在一起的(译者语:那怎么启用准标准模式呢??)
        IE9标准模式
            IE10提供该模式用于模拟IE9的标准模式。
        IE9准标准模式
            IE10提供该模式用于模拟IE9的准标准模式,但在开发者工具中,该模式和IE9标准模式是合并在一起的(译者语:那怎么启用准标准模式呢??)
        IE9 XML模式
            IE10提供该模式用于模拟IE9的XML模式,但在开发者工具中,该模式和IE9标准模式是合并在一起的。
        其实并没有任何价值去模拟这些臭名昭著的IE版本。例如,在IE10下使用IE9模式处理@font-face类 EOT 字体时和真实的IE9是不同的,前者由于IE10开始支持CSS 2D转换,因此CSS属性就不用带-ms-前缀,而后者就需要-ms-前缀了。倘若你遵守本文提供的建议,那么你就不用理会这些模式了,因为这些不完美的模拟器并不会影响到你和你的产品。然而,更快捷的方式是在虚拟机上使用各款真实的旧版IE测试你的网站,而不是使用模拟器。
        WP8的IE10同样拥有上述的所有模式,当然也是不完美的模拟器而已。
Google Chrome Frame下的IE特有的模式

        在IE6789下安装了Google Chrome Framke插件,那么就会有一下的IE特有的模式(IE10开始没有这些模式了)
        Chrome 怪异模式
            就是Chrome下的怪异模式(不是IE5.5的文档模式)
        Chrome 标准模式
            就是Chrome下的标准模式
        Chrome 准标准模式
            就是Chrome下的准标准模式
    非Web的模式

        某些引擎拥有一些与Web无关的模式。列举这些模式仅为本文内容的完整性而已,将不作深入。Opera有WML 2.0模式,在Mac OS X 10.5下的Webkit有个专为历史遗留的Dashboard组件而设的模式。
    模式的作用

        布局
            除了IE,text/html的模式主要影响CSS布局和样式系统。例如,table中没有样式继承是怪异模式的特性。在IE6789和Opera下,怪异模式就是IE5.5的文档模式。本文无法一一列举怪异模式下的所有布局特征。大家可以参考Mozllia's documentation和Quirks Mode specification。
            在准标准模式下,单元格内仅含图片时,单元格的高度与标准模式的计算是不同的。
            在XML模式下,选择器有不同的大小写行为。例如,有些对于HTML的body元素的规则在那些没有实现CSS新规范的旧浏览器中将失效。
        解析
            在怪异模式下,会导致符合W3C标准的页面的HTML和CSS解析出错。这些错误伴随着怪异模式的布局出现。注意,我们提及的怪异模式和标准模式的对决,主要针对CSS布局和CSS解析,而不是HTML解析。浏览器中有一个遵循HTML5规范的HTML解析器,更多请浏览 exactly one HTML parsing quirk。
            有些朋友误认为标准模式就是doctype上的“strict parsing mode”,其实两者没啥关系。(2000年夏季时,网景6推出与"strict parsing mode"关联的模式,就是"Strict DTD",但因与现有网站均不兼容导致最终被废除了)
            另一个常见的误解是关于XHTML的解析的。常常认为使用XHTML的doctype时,会触发浏览器使用不同的DOM解析器。但由于HTTP头的Content-Type依然是text/html,所以还是使用相同的HTML解析器。浏览器厂商意识到XHTML只是带额外限制的HTML而已,所以仅仅当HTTP头的Content-Type为application/xhtml+xml或application/xml时才触发XML模式,并采用XML解析器替代HTML解析器。
        脚本
            虽然怪异模式主要影响CSS,但也会影响到脚本。在Firefox14前的标准和准表尊模式下,HTML的id属性都不会自动在全局范围内创建dom对象的引用;仅当处于怪异模式下,document.all才部分生效。(译者语:现在很多浏览器都实现了document.all了,因为好用嘛!)当你通过模拟器在个版本的IE上测试时,模式对脚本的影响会明显。
            在XML模式下,部分DOM APIs的行为会与其他三种模式的很不同,这是由于XML和HTML定义的DOM API本来就不兼容而导致。悲催了吧!
    Doctype嗅探(就是Doctype切换)

        浏览器通过doctype嗅探来决定text/html内容的使用哪种引擎模式。也就是说模式是取决于<!DOCTYPE html>这句的。
        doctype是SGML的语法(HTML5前的标记框架,仅用于声明HTML的版本信息,而不能用于区分是SGML还是XML文档)。
        但无论是HTML4.01还是ISO 8879(SGML)都没有标明可以通过doctype来切换浏览器的引擎模式。而设计通过doctype来切换浏览器的引擎模式,是由于大部分使用怪异模式的网站均没有写<!DOCTYPE html>或指向旧的DTD,所以就采用doctype来做切换开关了。而在HTML5规范设计的时候发现doctype的最实际用途就是用来切换模式而已,所以最后得到最简的doctype "<!DOCTYPE html>"
        过去的doctype格式:<!DOCTYPE 根节点标签名 PUBLIC "公共标识符" "系统标识符">
        教你选择doctype
            下面是简单的教程,让你为你的新网站(text/html)选择合适的doctype。
            1. 标准模式,可验证最新特性
                <!DOCTYPE html>
                建议使用该doctype,它会验证最新的特性(如,<video>、<canvas>等)
            2. 标准模式,不验证最新特性,是历史遗留的严格模式
                <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/html4/strict.dtd">
            3. 准标准模式,不验证最新特性,是历史遗留的松散模式
                <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/html4/loose.dtd">
            4. 怪异模式,没有doctype
                最好不要这样做,否则你会后悔的。
                加入因客户需求导致你不得不考虑怪异模式,那请你使用IE的条件注释而不是省去doctype吧。
                我不建议使用XHTML的doctype,以为将XHTML作为text/html处理是有害的。如果你使用XHTML作为doctype,在IE6下会切换为怪异模式。
        对application/xhtml+xml
            没有必要使用doctype。没有doctype时,网页就不一定需要严格遵循XHTML1.0规范,但也没必要遵守。
            
    IE8、9、10的复杂问题

        从IE8开始可通过meta元素来切换模式。
        IE8有4种模式:IE5.5怪异模式,IE7标准模式,IE8准标准模式和IE8标准模式;IE9有7种模式:IE5.5怪异模式,IE7标准模式,IE8准标准模式,IE8标准模式,IE9准标准模式,IE9标准模式和IE9XML模式;IE10有11中模式,IE5.5怪异模式,IE7标准模式,IE8准标准模式,IE8标准模式,IE9准标准模式,IE9标准模式,IE9XML模式,IE5.5怪异模式,IE7标准模式,IE8准标准模式,IE8标准模式,IE10准标准模式,IE10标准模式和IE10XML模式。
        而使用哪种模式依赖于以下设置项:
            1. doctype
            2. meta元素
            3. HTTP头设置
            4. 周期性从微软下载的数据
            5. 用户或内网管理员的内网区域设置
            6. 父框架的模式(应用内嵌浏览器的模式取决于应用本身)
        幸运的是,IE8、9在符合下列条件时会行为模式和其他浏览器大概相似,而IE10就精准相似了。
            1. 没有将X-UA-Compatible加入到HTTP头中;
            2. 没有将X-UA-Compatible加入到meta中;
            3. 微软没有将该域名加入到它的黑名单中;
            4. 内网管理员没有将该网站(域名或IP)加入到黑名单中;
            5. 用户没有点击兼容性视图按钮(仅HTTP或HTTPS协议时才会自动出现),且没有将该网站(域名或IP)加入到本地的和黑名单中;
            6. 网站不是内网区域网站;
            7. 用户没有选择使用IE7模式来显示所有网站;
            8. 网页的父框架没有使用兼容性模式。
        在IE8、9中使用兼容性视图,实际上就是使用模拟IE7模式。
        不幸的是,如果在IE8、9中没有X-UA-Compatible的HTTP头或meta元素时,即使你添加了合适的doctype,浏览器依然允许用户自行回退到模拟IE7模式中。更糟的是,内网管理员也可以这样做。
        鉴于上述情况,doctype已经不足以确保你的文档模式了,于是你需求求助于X-UA-Compatible,无论是在HTTP头还是meta元素。
        下面是简单的教程,告诉在已经通过doctype触发标准模式的情况下,如何选择X-UA-Compatible的HTTP头或meta元素了。
        1. 关注点:你的网站不在微软的黑名单中,而且你更关心避免依赖浏览器各版本特有的特征,而不是用户使用模拟IE7模式解析网站。
            建议:无需添加X-UA-Compatible了。
        2. 关注点:你的网站在微软的黑名单中,而且你不希望用户使用模拟IE7模式解析网站。
            建议:添加<meta http-equiv="X-UA-Compatible" content="IE=Edge">或HTTP头上添加X-UA-Compatible: IE=Edge
        3. 关注点:在IE8、9下使用模拟IE7标准模式
            建议:添加<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7">或HTTP头上添加X-UA-Compatible: IE=EmulateIE7。然后不要依赖非IE7的行为特征
        4. 关注点:在IE9下使用模拟IE8标准模式
            建议:添加<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8">或HTTP头上添加X-UA-Compatible: IE=EmulateIE8。然后不要依赖非IE8的行为特征
5. 关注点:在IE10下使用模拟IE9标准模式
            建议:添加<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9">或HTTP头上添加X-UA-Compatible: IE=EmulateIE9。然后不要依赖非IE9的行为特征
        
    Google Chrome Frame的复杂问题

        Google Chrome Frame是IE6789下让IE使用Webkit内核的浏览器插件。安装后,IE默认还是用回Trident内核,但可以通过X-UA-Compatible切换为Webkit内核。
        X-UA-Compatible: chrome=1,会触发切换到Webkit内核;X-UA-Compatible: chrome=IE6,表示IE6时触发切换到Webkit内核;X-UA-Compatible: chrome=IE7,表示IE6和IE7时触发切换到Webkit内核。
        Chrome Frame的X-UA-Compatible指令可以和IE本身的指令一起使用,如<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=IE8">
        一旦切换成Webkit内核,那么就使用Google Chrome Frame下的IE特有的模式。
      建议不要使用Chrome Frame:
        1. 由于该插件没有得到IE在可访问性上的支持,所以通过屏幕阅读器和Windows语言识别器是无法访问该插件的内容的;
        2. 需要客户端安装该插件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java公钥加密私钥解密过程_GPG加密解密过程

GPG加密解密过程一、Linux系统下1.安装yum安装[rootPOC-ORACLE ~]# yum install gnupg下载安装包安装https://www.gnupg.org/download/index.en.html查看gpg帮助[rootPOC-ORACLE ~]# gpg --helpgpg (GnuPG) 2.0.14libgcrypt 1.4.5Copyright (C) 2009 Free Software Foundation,…

魔兽世界客户端数据研究(三)

终于决定&#xff0c;还是通过wow model viewer起手&#xff0c;研究一下WOW的数据类型&#xff0c;从另一个角度&#xff0c;体验一把这个唯一让我充过值的游戏。 这将是一系列随笔&#xff0c;即在读代码的时候&#xff0c;顺便记录&#xff0c;以理清思路和加深映象。 其中…

input子系统详解5——参考驱动模板编写按键驱动

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、input类设备驱动的开发 &#xff08;1&#xff09;输入事件驱动层和框架核心层不需要动&#xff0c;只需要编写具体硬件驱动层代码。 &#xff08;2&#xff09;具体硬件驱动层的编程接口与调用…

java很多魔法数判断_可别在代码中写那么多魔法值了,脑壳疼!

1. 前言重构老代码中遇到了不少类似下面这种写法&#xff1a;public void attend(String value) {if ("0".equals(value)) {//todo} else if ("1".equals(value)) {//todo} else {//todo}}脑壳疼&#xff01;从 Java 语法上无懈可击&#xff0c;但是从业务…

十分钟让你明白Objective-C的语法(和Java、C++的对比)

2019独角兽企业重金招聘Python工程师标准>>> 很多想开发iOS&#xff0c;或者正在开发iOS的程序员以前都做过Java或者C&#xff0c;当第一次看到Objective-C的代码时都会头疼&#xff0c;Objective-C的代码在语法上和Java, C有着很大的区别&#xff0c;有的同学会感觉…

稀疏多项式的运算

问题描述&#xff1a; 已知稀疏多项式Pn(X)c1x^e1c2x^e2....cmx^em,其中nem>em-1>....>e1>0; ci!0,m>1.试采用存储量同多项式项数m成正比的顺序存储结构&#xff0c;编写求Pn(x0)的算法&#xff08;x0为给定值&#xff09;&#xff0c;并分析你的算法的时间复杂…

I2C子系统详解1——I2C总线设备的驱动框架

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考博客 I2C总线驱动框架详解 linux内核I2C子系统详解 一、I2C总线的物理特征 这部分内容的简介可见博客&#xff1a;SPI、I2C、UART&#xff08;即串口&#xff09;三种串行总线详解。 &#x…

sqlite4java下载_使用sqlite4java的UnsatisfiedLinkError,没有sqlite4java-osx-amd64

我对这个问题有类似的问题&#xff1a;我正在运行一个使用sqlite的脚本,虽然我能够通过命令行成功运行sqlite3,但是当我尝试运行脚本时,我总是遇到这个错误&#xff1a;SEVERE: [sqlite] sqliteQueue[master.catalog]: error running job queuecom.almworks.sqlite4java.sqlite…

神经网络编程入门

本文主要内容包括&#xff1a; (1) 介绍神经网络基本原理&#xff0c; (2) AForge.NET实现前向神经网络的方法&#xff0c; (3) Matlab实现前向神经网络的方法 。 第0节、引例 本文以Fisher的Iris数据集作为神经网络程序的测试数据集。Iris数据集可以在http://en.wikipedia.or…

I2C子系统详解2——I2C核心层源码分析

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、前言 由I2C总线设备的驱动框架可知&#xff0c;I2C总线设备驱动框架涉及的文件如下&#xff1a; &#xff08;1&#xff09;I2C设备驱动层相关的文件 x210开发板的电容触摸屏gslX680采用I2C接口…

软考复习之路—组成原理

计算机系统的基础知识应该是作为一个编程人员必备的一门课程&#xff0c;仅仅有了解了计算机的组成&#xff0c;程序在计算 机中的存储状态&#xff0c;运算等基本内容&#xff0c;我们才干继续对计算机有更深层次的认识&#xff0c;更easy学习与上手。比方说要 想学习操作系统…

python内存管理机制错误_Python内存管理机制和垃圾回收机制的简单理解

一、内存管理机制1.由c开发出来的cpython2.include / objests3.需要下载python源码包4.Pyobject&#xff1a;floatPyVarObject&#xff1a;5.在python中所有东西创建对象的时候&#xff0c;内部都会存储一个数据// 维护双向链表struct _object *_ob_next;struct _object *_ob_p…

C#中几种数据库的大数据批量插入

C#语言中对SqlServer、Oracle、SQLite和MySql中的数据批量插入是支持的&#xff0c;不过Oracle需要使用Orace.DataAccess驱动。 IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider。批量插入的实现可以通过实现该接口来实现。 /// <summary>/// 提供数据…

求背包问题所有解(C++实现)

这是我学习数据结构时的一道上机作业&#xff0c;那时还没养成写注释的习惯&#xff0c;所以各位得受点苦了。 只是简易背包问题。 代码&#xff1a; 展开 1 // 背包问题所有解2 // 作者:王锦 3 // 邮箱:jinkswvip.qq.com4 5 #include "stdafx.h"6 #include <iost…

I2C子系统详解3——I2C总线驱动层代码分析

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、前言 由I2C总线设备的驱动框架可知&#xff0c;I2C总线设备的驱动框架涉及的文件如下&#xff1a; &#xff08;1&#xff09;I2C设备驱动层相关的文件 x210开发板的电容触摸屏gslX680采用I2C接…

java join 异常_Java:守护进程:thread.join()没有完成,当在一个线程中抛出异常时...

我写了一个Java守护进程(一个实现守护进程和Runnable的类)&#xff0c;现在我遇到了以下问题&#xff1a;在init()中&#xff0c;我创建了一个新线程 . Thread thread new Thread(this); 在start()中我启动新线程 . thread.start() . 在运行中我做了很多不同的事情......然后发…

硬链接与符号链接的比较?

今天就说说硬链接&#xff08;实体链接&#xff09;与符号链接&#xff08;类似Windows的快捷方式&#xff09;的不同?首先我们应知道&#xff1a;每个档案都会占用一个inode ,档案内容由 inode记录来指向;想要读取该档案&#xff0c;必须要经过目录记录的文件名来指向正确的i…

JAVA--自制斐波那契数列输出

累了&#xff0c;写点简单的。 1 public class hello {2 3 /**4 * param args5 */6 public static void main(String[] args) {7 int Fabnum 10;8 int sum 0;9 System.out.print("Serial:\t"); 10 for(int i 1…

I2C子系统详解4——I2C设备驱动层代码分析

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、前言 由I2C总线设备的驱动框架可知&#xff0c;I2C总线设备的驱动框架涉及的文件如下&#xff1a; &#xff08;1&#xff09;I2C设备驱动层相关的文件 x210开发板的电容触摸屏gslX680采用I2C接…

golang java rpc_golang两种调用rpc的方法

本文实例讲述了golang两种调用rpc的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;golang的rpc有两种方法进行调用&#xff0c;一种是rpc例子中给的&#xff1a;package mainimport ("net/rpc""net/http""log""net"&quo…