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学习笔记(二十) 获得和设置元素的特性(属性)
Jun 20 Javascript
Extjs实现进度条的两种便捷方式
Sep 26 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
Jan 03 Javascript
Jquery 获取对象的几种方式介绍
Jan 17 Javascript
node.js中的buffer.toString方法使用说明
Dec 14 Javascript
分享10个原生JavaScript技巧
Apr 20 Javascript
BootStrap glyphicons 字体图标实现方法
May 01 Javascript
浅谈js和css内联外联注意事项
Jun 30 Javascript
Bootstrap风格的WPF样式
Dec 07 Javascript
JavaScript无缝滚动效果的实例代码
Mar 27 Javascript
浅谈Node.js 沙箱环境
May 15 Javascript
JavaScript计算正方形面积
Nov 26 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
php设计模式 Mediator (中介者模式)
2011/06/26 PHP
php上传图片之时间戳命名(保存路径)
2014/08/15 PHP
PHP命名空间namespace及use的简单用法分析
2018/08/03 PHP
javascript 系统文件夹文件操作及参数介绍
2013/01/08 Javascript
JS中数组Array的用法示例介绍
2014/02/20 Javascript
jquery插件开发之实现md5插件
2014/03/17 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
2014/03/18 Javascript
常用DOM整理
2015/06/16 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
js遍历map javaScript遍历map的简单实现
2016/08/26 Javascript
AngularJs Scope详解及示例代码
2016/09/01 Javascript
KnockoutJS 3.X API 第四章之数据控制流foreach绑定
2016/10/10 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
2016/12/01 Javascript
JQuery异步提交表单与文件上传功能示例
2017/01/12 Javascript
JS简单实现获取元素的封装操作示例
2017/04/07 Javascript
Vue-resource拦截器判断token失效跳转的实例
2017/10/27 Javascript
JavaScript实现音乐自动切换和轮播
2017/11/05 Javascript
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
javascript Canvas动态粒子连线
2020/01/01 Javascript
vue iview 隐藏Table组件里的某一列操作
2020/11/13 Javascript
基于Python的XSS测试工具XSStrike使用方法
2017/07/29 Python
python字典操作实例详解
2017/11/16 Python
Django 2.0版本的新特性抢先看!
2018/01/05 Python
Python 判断文件或目录是否存在的实例代码
2018/07/19 Python
使用虚拟环境打包python为exe 文件的方法
2019/08/29 Python
Python抖音快手代码舞(字符舞)的实现方法
2021/02/07 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
《小松树和大松树》教学反思
2014/02/20 职场文书
2014个人四风对照检查材料思想汇报
2014/09/18 职场文书
交通事故委托书范本(2篇)
2014/09/21 职场文书
起诉离婚协议书样本
2014/11/25 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
ORM模型框架操作mysql数据库的方法
2021/07/25 MySQL
什么是SOLID
2022/03/24 Javascript
vue实现列表垂直无缝滚动
2022/04/08 Vue.js
win10系统xps文件怎么打开?win10打开xps文件的两种操作方法
2022/07/23 数码科技