js中有关IE版本检测


Posted in Javascript onJanuary 04, 2012

见得最多的就是检测navigator.userAgent(这个可以面向所有浏览器,略过)。

另外一种就是IE的条件注释,这篇有个比较详细的说明 https://3water.com/article/29336.htm

<!--[if !IE]><!--> 
<script type="text/javascript"> 
alert('非IE') 
</ script> 
<!--<![endif]-->

我测试的结果是这种形式是可用的。唯一需要注意的是<!-- [if IE 8]> 中'IE'和'8'中间的这个空白符是必须的,掉了就悲剧了。

基于IE的条件注释,变种版本就有几种,
第一、类似下面的形式:

<!--[if IE 6]> 
<input type="hidden" id="ieVersion" value="6" /> 
<![endif]--> 
<!--[if IE 7]> 
<input type="hidden" id="ieVersion" value="7" /> 
<![endif]-->

var ieVersion = (function(){ return document.getElementById('ieVersion')})();

以此类推,可以获得各个版本的信息,甚至可以添加gt,gte等,从而一次判定一类版本。
关于这种写法,有个例子就是:
<!--[if IE 6]> 
<html class="ie6"> 
<![endif]--> 
<!--[if IE 7]> 
<html class="ie7"> 
<![endif]--> 
<!--[if !IE]><!--> 
<html><!--<![endif]-->

于是在CSS里面就可以不用别的hack了,从而避免在IE里面多加载一次CSS,
直接
.ie6 xx{} 
.ie7 xx{} 
.ie8 xx{} 
xx{}

第二、既然可以写在页面内,当然也可以JS来动态生成。我google了一把,发现还真有人这么做的。
文章地址如下:https://3water.com/article/29337.htm,写得还比较详细,原理也很简单。
不过这样的缺憾就是把条件注释限定到JS上了,于CSS就是鸡肋了。
继续,既然可以动态生成条件注释来辨明IE版本,基于IE的CSS hack,应该也可以动态生成一段html片段,用样式值来判定版本。
下面是最容易想到的形式,我测试发现这么确实可以,不过也发现了一个问题,看下面的一段代码:
<div id="test_1"><span style="color: red; color: #ff6600\0; color: yellow\9\0; *color:green; _color:blue;">测试</span></div> 
<script type="text/javascript"> 
var test_1 = document.getElementById('test_1'); 
var test_2 = document.createElement('div'); 
test_2.innerHTML = '<span style="color: red; color: #ff6600\\0; color: yellow\\9\\0; *color:green; _color:blue;">测试</span>'; 
console.log('test_1:' + test_1.firstChild.style.color + '----' + 'test_2:' + test_2.firstChild.style.color); 
</script>

在IE9下结果:LOG: test_1:yellow----test_2:yellow
在IE8下结果:LOG: test_1:#ff6600----test_2:#ff6600
在IE7下结果:LOG: test_1:green----test_2:blue
在IE6下结果:test_1:blue ----test_2:blue (IE6没有console.log,所以上面的console.log需要换成alert)

上面的问题大家应该看出来了,IE7下两种情况不一致,不知道是我的IE7兼容模式的问题还是别的什么原因,知道的请指教。
确认代码:

<div><span style="*color:red; _color:blue;">原始</span></div> 
<script> 
var test = document.createElement('div'); 
test.innerHTML = '<span style="*color:red; _color:blue;">动态生成</span>'; 
document.body.appendChild(test); 
</script>

IE7结果:

js中有关IE版本检测

IE6结果:

js中有关IE版本检测

基本原理和IE的条件注释差不多,我们一次检测color值就可以了,所以改变一下上面的例子就是:
<div id="test_1"><span style="color: red; color: #ff6600\0; color: yellow\9\0; *color:green; _color:blue;">测试</span></div> 
<script type="text/javascript"> 
var test_1 = document.getElementById('test_1'); 
//var test_2 = document.createElement('div'); 
//test_2.innerHTML = '<span style="color: red; color: #ff6600\\0; color: yellow\\9\\0; *color:green; _color:blue;">测试</span>'; 
var c = test_1.firstChild.style.color; 
alert(c=='red'?'other':c=='yellow'?'IE9':c=='#ff6600'?'IE8':c=='green'?'IE7':'IE6'); 
</script>

在IE9下结果:IE9
在IE8下结果:IE8
在IE7下结果:IE7
在IE6下结果:IE6

按理来说,对于FF,Chrome/Safari、opera都可以利用-moz、-webkit、-o等私有前缀来辨别,不过对于属性的选取要斟酌,类似color是不行的。
这个检测方法旁门左道而已,未来版本或者其他浏览器是不是有这个bug也不确定,而且IE7的那个bug我还没有弄清楚,所以也就暂时知道可以这么做就可以了。

Javascript 相关文章推荐
jQuery 使用手册(六)
Sep 23 Javascript
浅析LigerUi开发中谨慎载入common.css文件
Jul 09 Javascript
node.js中的querystring.unescape方法使用说明
Dec 10 Javascript
基于PHP和Mysql相结合使用jqGrid读取数据并显示
Dec 02 Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
Dec 03 Javascript
原生JS实现圆环拖拽效果
Apr 07 Javascript
BootStrap daterangepicker 双日历控件
Jun 02 Javascript
windows下更新npm和node的方法
Nov 30 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
Sep 13 Javascript
Jquery属性的获取/设置及样式添加/删除操作技巧分析
Dec 23 jQuery
jQuery 选择器用法基础入门示例
Jan 04 jQuery
微信小程序开发搜索功能实现(前端+后端+数据库)
Mar 04 Javascript
国外大牛IE版本检测!现在IE都到9了,IE检测代码
Jan 04 #Javascript
IE的有条件注释判定IE版本详解(附实例代码)
Jan 04 #Javascript
js变量以及其作用域详解
Jul 18 #Javascript
分享一个asp.net pager分页控件
Jan 04 #Javascript
调试Node.JS的辅助工具(NodeWatcher)
Jan 04 #Javascript
DOM和XMLHttpRequest对象的属性和方法整理
Jan 04 #Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
Jan 03 #Javascript
You might like
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
js中设置元素class的三种方法小结
2011/08/28 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
jquery $.each()使用探讨
2013/09/23 Javascript
jQuery实现tab选项卡效果的方法
2015/07/08 Javascript
基于jQuery的Web上传插件Uploadify使用示例
2016/05/19 Javascript
AngularJS使用ng-repeat指令实现下拉框
2016/08/23 Javascript
[js高手之路]寄生组合式继承的优势详解
2017/08/28 Javascript
Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数
2017/09/11 Javascript
javascript Function函数理解与实战
2017/12/01 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
2018/05/29 Javascript
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
基于jquery ajax的多文件上传进度条过程解析
2019/09/11 jQuery
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
微信小程序实现底部弹出框
2020/11/18 Javascript
python定时采集摄像头图像上传ftp服务器功能实现
2013/12/23 Python
python实现人人网登录示例分享
2014/01/19 Python
Python制作CSDN免积分下载器
2015/03/10 Python
python概率计算器实例分析
2015/03/25 Python
python 实现倒排索引的方法
2018/12/25 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
2019/05/15 Python
python多进程重复加载的解决方式
2019/12/13 Python
python爬虫爬取监控教务系统的思路详解
2020/01/08 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
详解查看Python解释器路径的两种方式
2020/10/15 Python
goodhealth官方海外旗舰店:新西兰国民营养师
2017/12/15 全球购物
什么是表空间(tablespace)和系统表空间(System tablespace)
2013/02/25 面试题
应用英语专业自荐信
2014/01/26 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
施工安全责任协议书
2016/03/23 职场文书
2019新员工心得体会
2019/06/25 职场文书
php 解析非标准json、非规范json
2021/04/01 PHP