JS魔法堂:精确判断IE的文档模式by特征嗅探

简介:

一、前言                              

  苦逼的前端攻城狮都深受浏览器兼容之苦,再完成每一项功能前都要左顾右盼,生怕浏览器不支持某个API,生怕原生API内含臭虫因此判断浏览器类型和版本号成了不可绕过的一道关卡,而特征嗅探是继浏览器探测后另一利器处理上述问题。

 

二、何为特征嗅探                                

 从前我们都是通过对navigator.userAgent或navigator.appVersion两个属性值进行特定字符串匹配和萃取来区分浏览器类型和获取版本号的。但随着IE8提供可选的文档兼容性模式设置和各种加壳浏览器的出现,导致无法通过navigator.userAgent和navigator.appVersion的属性值准确判断浏览器实际提供的API特性和文档模式,于是就出现特征嗅探的做法。其实特征嗅探就是解决两种问题,第一、是否支持某特性;第二、当前的文档模式是什么(注意是文档模式,不是浏览器版本号)。

   而著名的 var isLteIE8 = !+[1,];就是判断是否处于IE5678的文档模式下的特征嗅探。

 

三、判断IE当前的文档模式                            

复制代码
// 判断是否为IE
var isIE = navtigator.userAgent.toLocaleLowerCase().indexOf('msie') !== -1;
// 判断是否为IE5678
var isLteIE8 = isIE && !+[1,];
 
  
// 用于防止因通过IE8+的文档兼容性模式设置文档模式,导致版本判断失效
var dm = document.documentMode,
isIE5, isIE6, isIE7, isIE8, isIE9, isIE10, isIE11;
if (dm){
isIE5 = dm === 5;
isIE6 = dm === 6;
isIE7 = dm === 7;
isIE8 = dm === 8;
isIE9 = dm === 9;
isIE10 = dm === 10;
isIE11 = dm === 11;
}
else{
// 判断是否为IE5,IE5的文本模式为怪异模式(quirks),真实的IE5.5浏览器中没有document.compatMode属性 isIE5 = (isLteIE8 && (!document.compatMode || document.compatMode === 'BackCompat'));   // 判断是否为IE6,IE7开始有XMLHttpRequest对象   isIE6 = isLteIE8 && !isIE5 && !XMLHttpRequest;   // 判断是否为IE7,IE8开始有document.documentMode属性   isIE7 = isLteIE8 && !isIE6 && !document.documentMode;   // 判断是否IE8   isIE8 = isLteIE8 && document.documentMode;   // 判断IE9,IE10开始支持严格模式,严格模式中函数内部this为undefined   isIE9 = !isLteIE8 && (function(){   "use strict";    return !!this;   }());   // 判断IE10,IE11开始移除了attachEvent属性   isIE10 = isIE && !!document.attachEvent && (function(){    "use strict";    return !this;   }());   // 判断IE11   isIE11 = isIE && !document.attachEvent;
}
复制代码

  注意:若通过IE8+通过指定文档兼容性模式的方式,设置为IE6的文档模式,那么上述的 var isIE6 = isLteIE8 && !isIE5 && !XMLHttpRequest 将判断错误,因为这时XMLHttpRequest是存在的,这是由于文档兼容性模式仅仅是尽量模拟旧版本浏览器而已,不完全等同于旧版本浏览器。所以可直接通过document.documentMode来判断当前文档模式。

 

四、总结                                    

  由于本篇重在代码实现上,结合《JS魔法堂:浏览器模式和文本模式怎么玩?》也许会更易理解本篇内容。

  尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/3818947.html,^_^肥仔John

 

如果您觉得本文的内容有趣就扫一下吧!捐赠互勉!

本文转自^_^肥仔John博客园博客,原文链接:http://www.cnblogs.com/fsjohnhuang/p/3818947.html,如需转载请自行联系原作者


相关文章
|
3月前
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
|
3月前
|
JavaScript 前端开发 UED
让 HTML 向 Vue.js 华丽转身:如何把 `wangEditor` 仿腾讯文档项目整合进 Vue.js
让 HTML 向 Vue.js 华丽转身:如何把 `wangEditor` 仿腾讯文档项目整合进 Vue.js
|
4月前
|
JavaScript 前端开发
js之DOM 文档对象模型
js之DOM 文档对象模型
29 1
js之DOM 文档对象模型
|
4月前
|
JavaScript 前端开发
js之DOM 文档对象模型
js之DOM 文档对象模型
|
5月前
|
安全 Java API
Nest.js 实战 (三):使用 Swagger 优雅地生成 API 文档
这篇文章介绍了Swagger,它是一组开源工具,围绕OpenAPI规范帮助设计、构建、记录和使用RESTAPI。文章主要讨论了Swagger的主要工具,包括SwaggerEditor、SwaggerUI、SwaggerCodegen等。然后介绍了如何在Nest框架中集成Swagger,展示了安装依赖、定义DTO和控制器等步骤,以及如何使用Swagger装饰器。文章最后总结说,集成Swagger文档可以自动生成和维护API文档,规范API标准化和一致性,但会增加开发者工作量,需要保持注释和装饰器的准确性。
147 0
Nest.js 实战 (三):使用 Swagger 优雅地生成 API 文档
|
5月前
|
JavaScript
js【图解】滚动条的位置(文档与屏幕间的距离),鼠标事件距离(位置),元素距离(位置)
js【图解】滚动条的位置(文档与屏幕间的距离),鼠标事件距离(位置),元素距离(位置)
118 7
|
6月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的高校学生课堂考勤系统附带文章和源代码设计说明文档ppt
基于ssm+vue.js+uniapp小程序的高校学生课堂考勤系统附带文章和源代码设计说明文档ppt
35 1
|
6月前
|
JavaScript 前端开发 Shell
深入Node.js的进程与子进程:从文档到实践
深入Node.js的进程与子进程:从文档到实践
|
6月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的课堂管理系统附带文章和源代码设计说明文档ppt
基于ssm+vue.js+uniapp小程序的课堂管理系统附带文章和源代码设计说明文档ppt
37 0
|
6月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的众惠商城附带文章和源代码设计说明文档ppt
基于ssm+vue.js+uniapp小程序的众惠商城附带文章和源代码设计说明文档ppt
33 0
下一篇
DataWorks