西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页编程开发javascript|JQuery → JS识别各浏览器版本完整实例代码

JS识别各浏览器版本完整实例代码

相关软件相关文章发表评论 来源:西西整理时间:2014/5/19 15:06:35字体大小:A-A+

作者:西西点击:772次评论:1次标签: 浏览器

谷歌浏览器2017(Chrome)v57.0.2987.19 官方正式版
  • 类型:浏览器类大小:41.4M语言:中文 评分:9.8
  • 标签:
立即下载

自昨天发了各浏览器内核介绍的随笔,就闲不住了,想直接写个JS来识别用户所用浏览器版本。

写着写着却发现很多坑爹的地方,比如IE10-的版本是依循常规只支持attachEvent而不支持addEventListener,但到了IE11,却反过来只支持addEventListener而不支持attachEvent。光是这一点就可以判断IE是个大坑,IE11的存在可能会导致之前你写过的代码出现错乱。另如原本可用

var ieVersion = eval("''+/*@cc_on"+" @_jscript_version@*/-0")*1

嗅探脚本来判断是否IE,如果值非0则表示为IE浏览器,但到了IE11,也直接返回0了(即IE11不再识别@cc_on这个IE独有的条件编译语句)。。。。

还有就是上篇文章提到的Opera自从去年就抛弃了自家的Presto内核,转而跟进使用Chrome内核,导致的结果是,新版Opera不再支持window.opera,而且跟随Chrome浏览器支持window.chrome等系列Chrome特性,就连userAgent字样也去了“opera”并直接套用Chromium/Blink内核的userAgent信息(好事是在尾部还是保留了一句OPR/XX.0)

不过琢磨琢磨,问题总会得到解决的。首先解决下比较容易解决的Firefox,其userAgent信息如下:

对比其它浏览器内核的ua信息它独有“Firefox/XX.0”字样,故我们可以这样判断:

rFirefox = /(firefox)\/([\w.]+)/;
matchBS = rFirefox.exec(ua);if ((matchBS != null)&&(!(window.attachEvent))&&(!(window.chrome))&&(!(window.opera))) {    //codes...}

这里还判断了是否支持window.attachEvent 和 window.chrome、window.opera事件,是为了防止其它非Firefox浏览器的伪装ua信息,但我承认这点很难做到尽善尽美。

接着是Safari,虽然Safari的ua信息含有safari字样,但由于谷歌的浏览器是苹果浏览器内核WebKit的分支,导致Chrome的ua信息也含有safari字样:

这种情况只能“找不同”了,可以看到Safari的ua信息在“Safari/...”之前连着一个“Version/...”,而Chrome的ua信息是没有的,所以可以这样写:


rSafari = /version\/([\w.]+).*(safari)/;
matchBS = rSafari.exec(ua);if ((matchBS != null)&&(!(window.attachEvent))&&(!(window.chrome))&&(!(window.opera))) {     //....}

接着说Chrome和Opera,这里比较头疼的一点。。。。是Chrome的好基友Opera也开始使用了Chromium或Blink引擎,导致二者ua信息以及对BOM的支持几乎一致(这不废话么,内核都一样了),但还是可以从ua找不同:

于是我们可以这样写(注意Opera也要兼顾旧版本,也就是使用Presto内核的情况):


rOpera = /(opera).+version\/([\w.]+)/; 
rNewOpera = /(opr)\/(.+)/;
rChrome = /(chrome)\/([\w.]+)/;
matchBS = rOpera.exec(ua);if ((matchBS != null)&&(!(window.attachEvent))) {               //旧Opera识别return { browser : matchBS[1] || "", version : matchBS[2] || "0" };
}
matchBS = rChrome.exec(ua);                   
if ((matchBS != null)&&(!!(window.chrome))&&(!(window.attachEvent))) {          //Chrome识别
   matchBS2 = rNewOpera.exec(ua);   if(matchBS2 == null)                           //新Opera识别   return { browser : matchBS[1] || "", version : matchBS[2] || "0" };   else   return { browser : "Opera", version : matchBS2[2] || "0" };
}

最后说下IE的识别吧,IE是个大坑(红框部分是建议用于判断的地方):

由上图可知,IE6/7从MSIE版本号直接判断即可,从IE8开始多了个Trident信息,则IE8-IE11只需判断Trident版本号。那么我们就可以自行写两个判断,先判断是否IE——即ua信息是否包含了MSIE信息或者Trident信息(注意IE11已经移除了MSIE信息),接着再判断是否IE7-或者IE8+ :

rMsie = /(msie\s|trident\/7)([\w.]+)/;
rTrident = /(trident)\/([\w.]+)/;
matchBS = rMsie.exec(ua);if (matchBS != null) {
matchBS2 = rTrident.exec(ua);  if (matchBS2 != null){  switch (matchBS2[2]){  case "4.0": return { browser : "IE", version : "8" };break;  case "5.0": return { browser : "IE", version : "9" };break;  case "6.0": return { browser : "IE", version : "10" };break;  case "7.0": return { browser : "IE", version : "11" };break;  default:return { browser : "IE", version : "undefined" };
  }
  }  else
  return { browser : "IE", version : matchBS[2] || "0" };
}

下面贴下全部代码,可供参考:

<script type="text/javascript">                var userAgent = navigator.userAgent, 
                rMsie = /(msie\s|trident\/7)([\w.]+)/, 
                rTrident = /(trident)\/([\w.]+)/, 
                rFirefox = /(firefox)\/([\w.]+)/, 
                rOpera = /(opera).+version\/([\w.]+)/, 
                rNewOpera = /(opr)\/(.+)/, 
                rChrome = /(chrome)\/([\w.]+)/, 
                rSafari = /version\/([\w.]+).*(safari)/;                var matchBS,matchBS2;                var browser;                var version;                var ua = userAgent.toLowerCase();                var uaMatch = function(ua) {
                    matchBS = rMsie.exec(ua);                    if (matchBS != null) {
                        matchBS2 = rTrident.exec(ua);                        if (matchBS2 != null){                            switch (matchBS2[2]){                                case "4.0": return { browser : "IE", version : "8" };break;                                case "5.0": return { browser : "IE", version : "9" };break;                                case "6.0": return { browser : "IE", version : "10" };break;                                case "7.0": return { browser : "IE", version : "11" };break;                                default:return { browser : "IE", version : "undefined" };
                            }
                        }                        else
                        return { browser : "IE", version : matchBS[2] || "0" };
                    }
                    matchBS = rFirefox.exec(ua);                    if ((matchBS != null)&&(!(window.attachEvent))&&(!(window.chrome))&&(!(window.opera))) {                        return { browser : matchBS[1] || "", version : matchBS[2] || "0" };
                    }
                    matchBS = rOpera.exec(ua);                    if ((matchBS != null)&&(!(window.attachEvent))) {                        return { browser : matchBS[1] || "", version : matchBS[2] || "0" };
                    }
                    matchBS = rChrome.exec(ua);                    if ((matchBS != null)&&(!!(window.chrome))&&(!(window.attachEvent))) {
                        matchBS2 = rNewOpera.exec(ua);                        if(matchBS2 == null)                        return { browser : matchBS[1] || "", version : matchBS[2] || "0" };                        else
                        return { browser : "Opera", version : matchBS2[2] || "0" };
                    }
                    matchBS = rSafari.exec(ua);                    if ((matchBS != null)&&(!(window.attachEvent))&&(!(window.chrome))&&(!(window.opera))) {                        return { browser : matchBS[2] || "", version : matchBS[1] || "0" };
                    }                    if (matchBS != null) {                        return { browser : "undefined", version : " browser" };
                    }
                }                var browserMatch = uaMatch(userAgent.toLowerCase());                if (browserMatch.browser) {
                    browser = browserMatch.browser;
                    version = browserMatch.version;
                }
                document.write(browser+version);        
</script>

不过还是得说,识别各种版本的浏览器是项非常麻烦的事情,以上代码能帮你顺利应付大部分的情况,但如果遇到某些特殊情景(比如浏览器伪装ua信息),就无法识别浏览器具体版本了。

    火狐浏览器
    (87)火狐浏览器
    火狐浏览器安卓版功能特性快速快速浏览从启动到页面加载,到平移和缩放,都有超快的浏览体验智能工具栏轻点智能工具栏,即可获得经常访问的网站列表,书签和历史记录,点击访问,无需输入便捷简洁易用标签页便于您同时浏览多个站点加载项提供无图阅读模式,流量受限时启用也能便捷查看网页智能同步从任何装置存取您浏览器的历史纪录,书签,密码,以及开启的标签页阅读自动将零散的文章组合成美观易读的页面插件提供多种功能插件以丰富您的浏...更多>>
    ie浏览器
    (39)ie浏览器
    西西软件园提供好用的浏览器官方下载,包括,浏览器真的是越来越强大了,界面极其清爽简洁新增网页固定功能智能网址地址栏快速访问入口独立标签页下载管理器开发人员工具多功能地址栏加载管理和跟踪保护功能支持和加速功能。...更多>>
    opera浏览器
    (34)opera浏览器
    目前市场上的安卓浏览器种类繁多,不过有一款浏览器却一直活跃在安卓系统上,那就是欧朋浏览器。欧朋浏览器是全球最流行的手机浏览器的中文版本。欧朋手机浏览器基于开发,延续小巧快速节省流量的优点,同时集成了诸多贴近中国用户的社会化应用。欧朋浏览器最大的特色就是快,与同类产品相比优势比较明显。体积小,适应性好,同时支持智能非智能手机。欧朋浏览器特点欧朋浏览器支持智能预读智能缩放手势操作,外加时尚个性化的界面...更多>>
    浏览器2016
    (24)浏览器2016
    西西软件园强力推荐的浏览器下载排行榜产品,目前市场上的浏览器产品众多,大家可能会有选择性困难,到底哪款浏览器速度最快,体验最好最安全这些都是在使用浏览器当中常见的疑问,如何选择一款最好的浏览器,其实最适合的就是最好的。火狐浏览器是一个完全开放源代码,任何人都可以自由参与开发的,支持多种操作系统的浏览器,因为其强大的可定制性和丰富的扩展程序而成为最有个性的浏览器.和支持最好,弹窗拦截和更胜一筹,执行速度...更多>>
    搜狗浏览器
    (76)搜狗浏览器
    搜狗浏览器是搜狗公司推出的国内首款集高速的内核谷歌浏览器内核与兼容的内核微软浏览器内核于一身的双核高速浏览器。最新推出的搜狗高速浏览器.正式版具有具有超高速,超兼容,超安全的特点。搜狗浏览器还具有扩展功能,涵盖了从工作学习生活服务系统工具时尚休闲资讯阅读到影音视频游戏娱乐大类余款扩展。更有包括登录助手如意淘微信摇一摇传图等特色扩展。搜狗助手搜狗助手是一款用于订购火车票的助手软件,能够减少大家在网上订...更多>>

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(1)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)