简洁短小的 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 相关文章推荐
jQuery checkbox全选/取消全选实现代码
Nov 14 Javascript
对js关键字命名的疑问介绍
Apr 25 Javascript
JavaScript设计模式之抽象工厂模式介绍
Dec 28 Javascript
用js实现放大镜的效果的简单实例
May 23 Javascript
详谈js模块化规范
Jul 07 Javascript
JS实现运动缓冲效果的封装函数示例
Feb 18 Javascript
vue-cli 如何打包上线的方法示例
May 08 Javascript
Vue创建头部组件示例代码详解
Oct 23 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
Jul 16 Javascript
微信小程序实现蓝牙打印
Sep 23 Javascript
vue使用recorder.js实现录音功能
Nov 22 Javascript
15分钟上手vue3.0(小结)
May 20 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
php中文验证码实现示例分享
2014/01/12 PHP
php的mkdir()函数创建文件夹比较安全的权限设置方法
2014/07/28 PHP
4种PHP异步执行的常用方式
2015/12/24 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
2016/11/03 PHP
PHP执行普通shell命令流程解析
2020/08/24 PHP
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
cookie的复制与使用记住用户名实现代码
2013/11/04 Javascript
Javascript中的arguments与重载介绍
2015/03/15 Javascript
JavaScript实现的类字典插入或更新方法实例
2015/07/10 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
js实现自动图片轮播代码
2017/03/22 Javascript
Vue2.0+ElementUI实现表格翻页的实例
2017/10/23 Javascript
jQuery 禁止表单用户名、密码自动填充功能
2017/10/30 jQuery
JS交互点击WKWebView中的图片实现预览效果
2018/01/05 Javascript
JS设计模式之策略模式概念与用法分析
2018/02/05 Javascript
Bootstrap4如何定制自己的颜色和风格
2018/02/26 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
详解使用VueJS开发项目中的兼容问题
2018/08/02 Javascript
three.js利用gpu选取物体并计算交点位置的方法示例
2019/11/25 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
2020/11/05 Javascript
Python中的random()方法的使用介绍
2015/05/15 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
python基于itchat实现微信群消息同步机器人
2017/02/27 Python
python替换字符串中的子串图文步骤
2019/06/19 Python
安装完Python包然后找不到模块的解决步骤
2020/02/13 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
澳大利亚墨尔本的在线时装店:LORETA
2018/09/14 全球购物
口腔医学技术应届生求职信
2013/11/09 职场文书
《得道多助,失道寡助》教学反思
2014/04/19 职场文书
2014年“向国旗敬礼”网上签名寄语活动方案
2014/09/27 职场文书
党支部反对四风思想汇报
2014/10/10 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers