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 相关文章推荐
javascript 面向对象思想 附源码
Jul 07 Javascript
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
Nov 22 Javascript
js实现数组转换成json
Jun 26 Javascript
jquery+css实现绚丽的横向二级下拉菜单-附源码下载
Aug 23 Javascript
AngularJS入门教程引导程序
Aug 18 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
May 12 Javascript
基于node.js制作简单爬虫教程
Jun 29 Javascript
seaJs使用心得之exports与module.exports的区别实例分析
Oct 13 Javascript
使vue实现jQuery调用的两种方法
May 12 jQuery
layui table 获取分页 limit的方法
Sep 20 Javascript
js实现烟花特效
Mar 02 Javascript
JS跨浏览器解析XML应用过程详解
Oct 16 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
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
PHP实现微信退款功能
2018/10/02 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
js escape,unescape解决中文乱码问题的方法
2010/05/26 Javascript
JavaScript高级程序设计 DOM学习笔记
2011/09/10 Javascript
JavaScript中Math对象方法使用概述
2014/01/02 Javascript
JQuery动画与特效实例分析
2015/02/02 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
2016/05/17 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
2017/04/25 Javascript
JavaScript实现简单的四则运算计算器完整实例
2017/04/28 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
JavaScript之Blob对象类型的具体使用方法
2019/11/29 Javascript
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
Python向日志输出中添加上下文信息
2017/05/24 Python
python爬虫使用cookie登录详解
2017/12/27 Python
Python即时网络爬虫项目启动说明详解
2018/02/23 Python
Python小程序 控制鼠标循环点击代码实例
2019/10/08 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
2019/10/28 Python
python编写微信公众号首图思路详解
2019/12/13 Python
python同义词替换的实现(jieba分词)
2020/01/21 Python
PyQt5通过信号实现MVC的示例
2021/02/06 Python
iframe与window.onload如何使用详解
2020/05/07 HTML / CSS
使用SVG实现提示框功能的示例代码
2020/06/05 HTML / CSS
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
青年教师培训方案
2014/02/06 职场文书
致跳高运动员加油稿
2014/02/12 职场文书
公司节能减排倡议书
2014/05/14 职场文书
课内比教学心得体会
2014/09/09 职场文书
作风整顿剖析材料
2014/09/30 职场文书
内勤岗位职责范本
2015/04/13 职场文书
大学毕业谢师宴致辞
2015/07/27 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL
MySql如何将查询的出来的字段进行转换
2022/06/14 MySQL