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 相关文章推荐
Ext javascript建立超链接,进行事件处理的实现方法
Mar 22 Javascript
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
Jun 11 Javascript
js下判断 iframe 是否加载完成的完美方法
Oct 26 Javascript
基于jquery的点击链接插入链接内容的代码
Jul 31 Javascript
javascript实现复选框选中属性
Mar 25 Javascript
javascript实现树形菜单的方法
Jul 17 Javascript
JavaScript中的cacheStorage使用详解
Jul 29 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
Dec 08 Javascript
Vue v2.5 调整和更新不完全问题
Oct 24 Javascript
如何解决React官方脚手架不支持Less的问题(小结)
Sep 12 Javascript
详解Vue3 Composition API中的提取和重用逻辑
Apr 29 Javascript
js节流防抖应用场景,以及在vue中节流防抖的具体实现操作
Sep 21 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
精致的人儿就要挑杯子喝咖啡
2021/03/03 冲泡冲煮
php empty函数 使用说明
2009/08/10 PHP
PHP+memcache实现消息队列案例分享
2014/05/21 PHP
PHP中数据类型转换的三种方式
2015/04/02 PHP
浅谈PHP的反射API
2017/02/26 PHP
js直接编辑当前cookie的脚本
2008/09/14 Javascript
犀利的js 函数集合
2009/06/11 Javascript
JS 树形递归实例代码
2010/05/18 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
2015/03/18 Javascript
angularjs中的$eval方法详解
2017/04/24 Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
2017/06/04 Javascript
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
2017/07/05 NodeJs
Nodejs之TCP服务端与客户端聊天程序详解
2017/07/07 NodeJs
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
Node.js web 应用如何封装到Docker容器中
2020/09/01 Javascript
jquery插件懒加载的示例
2020/10/24 jQuery
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
Python内置模块turtle绘图详解
2017/12/09 Python
Python3中的列表生成式、生成器与迭代器实例详解
2018/06/11 Python
python自动化之Ansible的安装教程
2019/06/13 Python
Jupyter notebook 远程配置及SSL加密教程
2020/04/14 Python
Python如何安装第三方模块
2020/05/28 Python
python des,aes,rsa加解密的实现
2021/01/16 Python
基于IE10/HTML5 开发
2013/04/22 HTML / CSS
阿里巴巴美国:Alibaba美国
2019/11/24 全球购物
党校培训思想汇报
2013/12/30 职场文书
2014乡镇“三八”国际劳动妇女节活动总结
2014/03/01 职场文书
党课心得体会范文
2014/09/09 职场文书
教师工作失职检讨书
2014/09/18 职场文书
2014年妇联工作总结
2014/11/21 职场文书
民事和解协议书格式
2014/11/29 职场文书
情侣餐厅的创业计划书范本!
2019/07/26 职场文书
2019年亲子运动会口号
2019/10/11 职场文书