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 相关文章推荐
Js 本页面传值实现代码
May 17 Javascript
setTimeout()与setInterval()方法区别介绍
Dec 24 Javascript
浅析JS中document对象的一些重要属性
Mar 06 Javascript
js实现图片旋转的三种方法
Apr 10 Javascript
jQuery中click事件的定义和用法
Dec 20 Javascript
详解Javascript中prototype属性(推荐)
Sep 03 Javascript
Javascript 判断两个IP是否在同一网段实例代码
Nov 28 Javascript
详解JS中的快速排序与冒泡
Jan 10 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
Jan 24 Javascript
微信小程序图片自适应支持多图实例详解
Jun 21 Javascript
解决Vue+Electron下Vuex的Dispatch没有效果问题
May 20 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
Jan 11 jQuery
国外大牛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的垃圾回收机制详解
2013/10/28 PHP
Laravel 5 框架入门(四)完结篇
2015/04/09 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
jQuery获取节点和子节点文本的方法
2014/07/22 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
JS工厂模式开发实践案例分析
2019/10/17 Javascript
vue 实现特定条件下绑定事件
2019/11/09 Javascript
vue3.0中setup使用(两种用法)
2020/12/02 Vue.js
Python写的创建文件夹自定义函数mkdir()
2014/08/25 Python
Python实现快速多线程ping的方法
2015/07/15 Python
Python中的getopt函数使用详解
2015/07/28 Python
Python 反转字符串(reverse)的方法小结
2018/02/20 Python
对Python中的@classmethod用法详解
2018/04/21 Python
利用python循环创建多个文件的方法
2018/10/25 Python
Python设计模式之策略模式实例详解
2019/01/21 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
django2笔记之路由path语法的实现
2019/07/17 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
python和js交互调用的方法
2020/06/23 Python
详解python方法之绑定方法与非绑定方法
2020/08/17 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
Vichy薇姿加拿大官网:法国药妆,全球专业敏感肌护肤领先品牌
2018/07/11 全球购物
美国在线家居装饰店:Belle&June
2018/10/24 全球购物
乌克兰排名第一的在线旅游超市:Farvater.Travel
2020/01/02 全球购物
大学生暑期实践感言
2014/02/26 职场文书
升学宴主持词
2014/04/02 职场文书
2015会计试用期工作总结
2014/12/12 职场文书
导游词之河姆渡遗址博物馆
2019/10/10 职场文书
pytorch中Schedule与warmup_steps的用法说明
2021/05/24 Python
python3读取文件指定行的三种方法
2021/05/24 Python
vue中div禁止点击事件的实现
2022/04/02 Vue.js