简洁短小的 JavaScript IE 浏览器判定代码


Posted in Javascript onMarch 21, 2010

这个目前世界上最短的 Javascript 判定 IE 浏览器的方法来自俄罗斯!它已经在各版本的 IE 以及目前其他流行的浏览器上经过测试,基于 IE 的 Bug,微软虽然已经意识到,但是从来没有纠正过。

<script type='text/javascript'> 
var ie = !-[1,]; 
alert(ie); 
</script>

以上代码运行结果:IE 下返回true,其他标准浏览器返回false。!-[1,],仅仅只有 6 bytes!
不过如果反过来判断,标准浏览器返回 true 而 IE 返回 false的话,则可以再缩短一个byte。
<script type='text/javascript'> 
notIe = -[1,]; 
if(-[1,]){ 
// 标准浏览器代码 
}else{ 
// IE Only的代码 
} 
</script>

看完了这些,你们是不是很好奇这些是怎么运行的?请继续看下文。
这个 Bug 产生的原因是 IE 会添加一个空数组元素到数组元素的总数里。
[1,]. Length标准浏览器会返回 1 (基于标准的 ECMAscript ,在数组最后的逗号”,”会被忽略,这是为了方便在一列里显示以及自动生成等),但是 IE 会返回 2。当你打印这个数组的时候 IE 将会返回 “1, “,也就是两个元素,而其他标准浏览器将会返回 “1″。
这很容易验证,比如在 IE 和 FF中运行以下代码:
<script type='text/javascript'> 
alert([,]==','); 
//这是8个字符判定IE 
</script>

[1,]实际上浏览器的操作是toString()转换成字符串的操作,-[1,]是将字符串强制转换为数字。而 IE 将会返回 NaN,但是遗憾的是 NaN 并不是一个数字,因为[1,]转换成字符串后的”1,”里面带有逗号。而其他标准浏览器会返回 -1,这是一个非 0 的数字。
你知道,NaN 转换成 Boolean 型将返回 false,所以-[1,]在 IE 下将返回 false。而任何非 0 的数字转换成 Boolean 型(例如-1),在 标准浏览器下都将返回 true。所以我们得到了一个判定结果,!-[1,]在 IE 下返回true,而在其他标准浏览器下返回 false。也就达到了区分判定 IE 浏览器的目的。
当然,如前文所说,这个 Bug 其实微软很早就已经知道,但是却一直没有去修复它,所以在未来的 > IE8 的 IE 浏览器也就不确定是否依旧可以,不过基本上这么多代的 IE 都没有修复,未来的 IE 也不太会去修复的样子。
以下是其他的一些区分判定 IE 浏览器的代码,也可以参考下:
<script type='text/javascript'> 
// Option from Dean Edwards: 
var ie = /*@cc_on!@*/false; 
// Use the commented line: 
var ie//@cc_on=1; 
// Variation (shorter variable): 
var ie = '\v'=='v'; 
/ / Option to Gareth Hayes (former record-holder): 
var ie = !+"\v1"; 
</ script>
Javascript 相关文章推荐
简短几句 通俗解释javascript的闭包
Jan 17 Javascript
json的前台操作和后台操作实现代码
Jan 20 Javascript
javascript 回调函数详解
Nov 11 Javascript
jquery插件jSignature实现手动签名
May 04 Javascript
JavaScript的ExtJS框架中表格的编写教程
May 21 Javascript
微信小程序 页面之间传参实例详解
Jan 13 Javascript
JS中常用的消息框总结
Feb 24 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
Dec 28 Javascript
JS实现头条新闻的经典轮播图效果示例
Jan 30 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
Dec 02 Javascript
谈谈JavaScript中的函数
Sep 08 Javascript
在HTML5 localStorage中存储对象的示例代码
Apr 21 Javascript
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
Mar 21 #Javascript
锋利的jQuery jQuery中的DOM操作
Mar 21 #Javascript
锋利的jQuery 要点归纳(一) jQuery选择器
Mar 21 #Javascript
jquery 可拖拽的窗体控件实现代码
Mar 21 #Javascript
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
Mar 21 #Javascript
javascript qq右下角滑出窗口 sheyMsg
Mar 21 #Javascript
js 居中漂浮广告
Mar 21 #Javascript
You might like
20个PHP常用类库小结
2011/09/11 PHP
php学习笔记之面向对象编程
2012/12/29 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
php中spl_autoload详解
2014/10/17 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
PHP使用递归生成文章树
2015/04/21 PHP
PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
2017/01/13 PHP
Jquery作者John Resig自己封装的javascript 常用函数
2009/11/09 Javascript
Jquery命名冲突解决的五种方案分享
2012/03/16 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
高性能JavaScript DOM编程(1)
2015/08/11 Javascript
jQuery内容折叠效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
JavaScript严格模式下关于this的几种指向详解
2017/07/12 Javascript
浅谈函数调用的不同方式,以及this的指向
2017/09/17 Javascript
详解vue-loader在项目中是如何配置的
2018/06/04 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
详解JavaScript 的执行机制
2020/09/18 Javascript
Vue 事件的$event参数=事件的值案例
2021/01/29 Vue.js
Python与Redis的连接教程
2015/04/22 Python
在 Python 应用中使用 MongoDB的方法
2017/01/05 Python
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
pandas.loc 选取指定列进行操作的实例
2018/05/18 Python
[机器视觉]使用python自动识别验证码详解
2019/05/16 Python
Python中的self用法详解
2019/08/06 Python
python3.5的包存放的具体路径
2020/08/16 Python
Python将list元素转存为CSV文件的实现
2020/11/16 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
小学红领巾中秋节广播稿
2014/01/13 职场文书
工作违纪检讨书
2014/02/17 职场文书
安康杯竞赛活动总结
2014/05/05 职场文书
文明演讲稿范文
2014/05/12 职场文书
行政监察建议书
2014/05/19 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
2016年春节慰问信息
2015/03/25 职场文书