Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

关于IE浏览器的版本检测

  看到某些百度页面上的代码片段,真的很让人摸不着头脑。下面这个代码可以围观下,但是千万别学它。 version=0;
if(!!window.ActiveXObject){
  version=parseFloat(navigator.userAgent.toLowerCase().match(/msie (\d+)/)[1]);
};
  这样蛋疼的代码也许是某些历史遗留原因造成的,具体咱就不吐槽了。
  判断浏览器使用hack的方法确实很方便,比如使用“window.ActiveXObject”来判断IE,可是使用hack是有风险的。我曾经就很喜欢用“!-[1,]”来判断IE,可是IE9出来了以后这个hack就被它毁了,以前做的很多程序都无法兼容上IE9。所以我不推荐使用hack来检测浏览器。咱应该用正规的方法,那就是userAgent。我想除了360那SB浏览器,不会有哪个浏览器会在现在或者将来取消掉userAgent。至少在HTTP还盛行的年代不会做这样的脑残事情。也许有人会问,现在的很多浏览器中,userAgent这个参数都是用户可以修改的,要是用户擅自修改了怎么办?这东西我也改过,我就经常把火狐的userAgent改成Android的来做测试。但是除了开发者,有多少个普通的用户会去修改这个参数呢?就算有那样的奇葩非主流用户,咱别理它就是。就像用户把自己浏览器的JavaScript关闭了,那咱有啥办法?所以,userAgent是绝对可行的,也是最好的检测浏览器的方法。
  userAgent是个字符串,要用它来检测浏览器当然需要做字符串匹配,那么最佳的方法就是用正则表达式了。之前我一直都这么写来着 var isIE=navigator.userAgent.match(/MSIE (\d+)/i);
isIE=isIE?isIE[1]:undefined;
  这个代码是没问题的,只是有点麻烦。因为正则表达式匹配不成功返回的是null,null无法直接访问属性。既然正则匹配不到的时候会返回null,那么我没让它永远都能匹配到不就行了?于是,后台我喜欢这样写 var isIE=navigator.userAgent.match(/MSIE (\d+)|$/i)[1];   在正则中,把原来的表达式“或”上一个结束符就能匹配任何字符了,即使是空字符串也可以匹配结束符。因此这个正则表达式的match永远都不为null。这样我们就可以直接在后面跟下标来取正则中小括号匹配的内容。可是小括号有时候并没有匹配到内容,因此为undefined。这就得到了我们上面两行代码所得到的结果。虽然效率不如前面的代码高,但是检测浏览器的动作通常只做一次,所以没必要在这种地方纠结那微秒级的效率。这种时候代码整洁更重要。
  目前我使用的浏览器检测代码就是这个了,如果大家有什么更好的欢迎分享下~
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^