转自:http://yiminghe.iteye.com/blog/802021

IE 版本实在太多了,而且每个版本又变化很大,出到 IE9 连微软都开始担心开发者能否搞定,于是就有了这篇官方博文,详细介绍了自 IE8 起引入的兼容性解决方案:

Testing sites with Browser Mode vs. Doc Mode

浏览器模式

不受程序员控制,用户可以自由选择合适的ie版本,影响了以下三个方面:

1.发送给服务器合适的UA

2.控制页面中的条件注释 。(条件注释依赖于 UA 串)

3.对应了默认的文本模式(渲染模式,IE8 引入document.Mode)。

关于默认对应关系可见:



updated 2010-10-24

ie UA 判断需要考虑渲染引擎版本 trident

兼容模式和其他模式的区别在于,兼容模式会在UA中表示自己是 MSie7 但是同时也会表示自己的渲染引擎是trident 5.0,如下:

Js代码
  1. Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)

但是选择ie7模式时,则会完全丢弃掉trident版本:

Js代码
  1. Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)

一般来说,终端用户可选择兼容模式(地址栏兼容按钮),但是开发者通过 trident 仍然可以知道真正的浏览器版本,其他模式主要用于程序员调试(程序完全不知),终端用户如果选择后果自负!

比如一个 ie9 问题,当程序设置 document mode 处于 ie9 时,透明度 filter 设置会失效即透明失效,即使设置了opacity,这是就可以根据trident来判断,无论是 MSIE7.0 (兼容模式)还是 MSIE9.0(ie9模式) [具体哪种模式受微软白名单控制以及用户选择],都把filter去掉,具体方法则是初始化时在页面body上加入class:tridentxx,在样式中写明:

Html代码
  1. <body class='trident5'>
  2. .trident5 xx{
  3. filter:none;
  4. }

文本模式

直接和界面显示相关,用来指示选择具体的渲染引擎,例如 ie8 标准模式下不支持 css表达式。脚本可以通过 document.documentMode  探测。


updated 2010-11-10 

当切换 document.documentMode ,不仅会切换渲染引擎,而且会切换 js 引擎,可在切换前后分别执行以下程序测试:

Js代码
  1. typeof Object.create

可以通过以下方面由程序员控制

1. 页面中的 DOCTYPE 属性。

需要注意的是:实际上从 ie8 起存在 3 种渲染机制,目前推荐 <!DOCTYPE html>触发完全标准模式。

其他详见:Quirks mode、Almost standards mode、Standards mode

2. X-UA-Compatible Meta tag

可以在 head 开头 插入 meta 标签:

Html代码
  1. <meta http-equiv="X-UA-Compatible" content="IE=mode" >

mode 取值结合 1 DOCTYPE 会直接影响到使用哪个渲染引擎:

更详细的见这里:how-ie8-determines-document-mode

3. HTTP Header

同2,不过直接操作 http 协议头,需要注意的是 2 的优先级比 3 高。

最后 如果还不能够确定,那么 ie 的兼容性列表 也会影响到具体表现,可在

res://iecompat.dll/iecompatdata.xml

查看,用户也可在 工具-兼容性视图设置 下手动设置,将特定网站加入兼容性列表。


update 2010-11-17 :

attribute 与 property , content value 与 dom value

attribute 的判断读取 在 ie <9 之前是非常混乱的事情,节点的 .attributes 在标准浏览器下只会返回用户设置的属性节点集合,而在 ie<8 下则会把所有可以设置的属性都返回过来,特别在需要知道某个元素是否被用户设置了属性时就会十分麻烦,需要遍历.attributes 一一判断 specified 是否为 true ,而 documentMode 也会切换 js 引擎,在 ie8 的文本模式选择了 ie7 标准时,其属性方面和真实的 ie7 表现一致,那么这时为了鲁棒性需要这样判断:

Js代码
  1. //直接判断引擎,防止兼容性模式影响
  2. var ieEngine=(function() {
  3. if (!UA.ie) return;
  4. return document.documentMode || UA.ie;
  5. })();
  6. var hasAttributes = ieEngine < 8 ?
  7. function (el) {
  8. var attributes = el.attributes;
  9. for (var i = 0; i < attributes.length; i++) {
  10. var attribute = attributes[i];
  11. if (attribute.specified) {
  12. return true;
  13. }
  14. }
  15. return false;
  16. } : function (el) {
  17. //删除firefox自己添加的标志
  18. UA.gecko && el.removeAttribute("_moz_dirty");
  19. return el.hasAttributes();
  20. }

关于 attribute 与 property 的关系就更复杂了,在 ie6,7 下表示 content value 的attribute 与表示 dom value 的 property 混淆了,并且在 ie8 documentMode 为混杂以及 ie7 模式下和 ie6,7 保持一致,如下:

Html代码
  1. <a href='../x.html' id='t'>test</a>
  2. <script>
  3. var a=document.getElementById("t");
  4. alert(a.getAttribute("href"));
  5. alert(a.getAttribute("href",2));
  6. </script>

另一点需要注意的是,设置 innerHTML 在 ie6,7 下会触发设置的 content value 转换成为dom value,当然这只对 html 相关属性起作用,只有 html 属性才可能有不同于 content value 的 dom value。如下:

Java代码
  1. <div id='tt'>
  2. <a href='../x.html' id='t' _saved_href='../x.html'>test</a>
  3. </div>
  4. <script>
  5. var tt=document.getElementById("tt");
  6. alert(tt.innerHTML);
  7. tt.innerHTML=tt.innerHTML;
  8. alert(tt.innerHTML);
  9. </script>

单个属性节点存在判断:

在 ie 下可用:

Js代码
  1. elem.attributes[name] && elem.attributes[name].specified

但是对于多个单词组成的属性,例如 tabindex 会出问题,最好用

Js代码
  1. var name='tabindex';
  2. elem.tabIndex=1;
  3. var attr = elem.getAttributeNode(name);
  4. return attr ? attr.specified : false;

来判断。

而对于 attribute 和 property 还没有完全分开,如果设置自定义属性/expando,那么会发现无论读 expando 还是 attribute 都可以读出来 :(

Js代码
  1. var o=document.body;
  2. o.xx="oo";
  3. o.setAttribute("xx2","oo2");
  4. alert(o.xx);
  5. alert(o.getAttribute("xx"));
  6. alert(o.xx2);
  7. alert(o.getAttribute("xx2"));

ie9 则是完全解决了

具体可见:

http://msdn.microsoft.com/zh-cn/library/dd347148(en-us,VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms536429(VS.85).aspx
http://jsfox.cn/blog/javascript/get-right-href-attribute.html
http://w3help.org/zh-cn/causes/SD9006
http://www.w3.org/TR/DOM-Level-2-HTML 

PS: 这个工 具也不错

Introducing the IE8 Developer Tools JScript Profiler

其他文章:

IE’s Compatibility Features for Site Developers

Beyond DOCTYPE: Web Standards, Forward Compatibility, and IE8

Internet Explorer 8 document and browser modes

浏览器模式与文本模式相关推荐

  1. 关于浏览器模式和文本模式的困惑

    什么是浏览器模式和文本模式? 经常使用IE开发者工具的同学,肯定见过浏览器模式和文本模式,对于这两个名词,综合相关文档解释如下: 浏览器模式(Browser Mode),用于切换IE针对该网页的默认文 ...

  2. IE6,7,8开发人员工具使用详解下(浏览器模式、文本模式、JavaScript调试、探查器)

    在上一篇文章IE8"开发人员工具"使用详解上(各级菜单详解) 中,我们详细地讲解了IE8开发人员工具中各个菜单中命令的使用方法,相信很多朋友应该已经使用上了.而IE8开发人员工具更 ...

  3. linux图形模式切换用户,Linux的图形模式和文本模式以及单用户模式切换

    打开一个终端 输入init 3 (注意init后面有一个空格)  等一会就进入了图形界面 以上方法切换后,窗口模式完全关闭.如果窗口中有文件未保存,将丢失. (用init 5可以回到图形界面,但原来的 ...

  4. 文件读写的“二进制模式”和“文本模式”

    二进制模式:将内存中的数据(01序列)直接传送到文件中,没有任何转换.如:char ch = 0x7d; fwrite(&ch, sizeof(char), 1, pfile);直接把0x7d ...

  5. Latex 数学符号显示为文本模式 数学模式转为文本模式

    用LaTeX写论文的时候遇到要将数学符号显示成文本格式,如'\left('编译后是'('但是我想让它编译后还是显示'\left(',只要在改为\verb| \left( |即可.\verb 命令被设计 ...

  6. J2EE系列:再谈IE的浏览器模式和文档模式

    以前在 "IE8兼容视图(IE7 mode)与独立IE7的区别"一文中曾经涉及过浏览器模式和文档模式,但二者的区别却不甚了了,现在有了新的认识,再补充一下. 1.浏览器模式与文档模 ...

  7. 超详细Centos6.5文本模式安装步骤

    对于刚接触Linux的用户来说,安装系统和配置网卡的过程也可能要用很长的时间,Centos6.5的安装方式有二种,图形模式和文本模式.文本模式从6开始就不支持自定义分区了(新手练习时默认分区足够用), ...

  8. 文件操作:读写模式、操作模式、操作方法

    文件操作 补充储备 1.with语法支持一次性打开多个文件,需要用逗号隔开eg:with open(r'a.txt','r',encoding='utf8') as f1 , open(r'b.txt ...

  9. 设置IE浏览器文本模式为IE8或IE7

    在HTML 页面 head 标签中添加meta标签: <meta http-equiv="X-UA-Compatible" content="IE=8"/ ...

最新文章

  1. mpVue配置sass全局变量
  2. 网络:HTTP报文格式
  3. php 表单错误弹窗,PHP表单错误
  4. 微信支付开放平台_有了开放数据,您终于可以得到这些年来所支付的费用
  5. php apd,PHP debug 工具 之 APD
  6. python如何计算个人gpa_【Python】计算GPA | 学步园
  7. 学习SQLAlchemy Core
  8. MySQL 5.6版本二进制包多实例安装
  9. 3des base64 java_java和c++中的DES\3DES\Base64
  10. 大学计算机应用基础教程读后感,计算机应用基础的课程学习体会
  11. 未识别的网络解决办法
  12. shning friends---歌词
  13. Nginx安装及简介
  14. Trie(前缀树,prefix tree)
  15. 减肥怎么减?最全减肥食谱(超厉害的)
  16. EFR32--如何在EFR32BG22透传中添加AT指令控制
  17. flowable6.4 并行网关 驳回 跳转 回退 多实例加签减签
  18. F2FS源码分析-2.3 [F2FS 读写部分] F2FS的一般文件读流程分析
  19. windows2003中未分页内存泄漏导致服务器不稳定的解决方法
  20. python实现文本查重系统_NLP之gensim库python实现文本相似度/匹配/查重

热门文章

  1. 使用NVIDIA Jetson Orin模块详解
  2. Excel单元格下拉框引用其它Sheet中的值的方法
  3. z790主板参数 z790主板区别哪个好
  4. 手机爱奇艺/腾讯视频桌面像推送到电视一样推送到电脑
  5. 算法分析与设计实践-作业2-Dijkstra算法求最短距离
  6. SPSS数据分析网络游戏行业应用范例
  7. Python游戏开发常用库
  8. 2018年中国楼市50强城市报告:深沪京新房最贵
  9. shell basename 可以去除文件名后缀
  10. Canal实时监控案例