所有的前端开发人员都没有办法回避一个问题,那就是浏览器版本判断,当我们无法回避需要进行浏览器版本判断时,前辈们往往会告诉我们,可以判断 UserAgent这个用来标示浏览器的字符串,通过判断这一字符串的特征来判断浏览器版本。但是现在浏览器层出不穷,许多浏览器都内置更改 UserAgent的选项,或者专门的插件,使得UserAgent告诉我们的信息越来越不准确。那么什么样的方式判断浏览器版本才是比较靠谱的呢?查查 浏览器厂商提供的文档,我们不难发现,许多浏览器厂商其实为我们内置了专门的标示方法,或者有其非常独特的DOM对象,利用这些,我们就能精确的判断浏览 器,甚至判断出版本号呢。下面我们开始演示。我们从简单的先开始。

1.presto内核(Opera)
opera浏览器中有个特有的window.opera对象,通过opera.version()可以直接获取版本号,这是官方内置方法。

目前对于webkit 内核的 opera 已经没有这个内置标志了

2.webkit内核(safari、chrome、maxthon3高速模式)
webkit内核的浏览器中window对象一下成员以“WebKitXxxxx”开头,这是其有别于其他浏览器内核的独特特征
        1)safari浏览器中,navigator.vendor的值为“Apple Computer, Inc.”
        2)chrome中有两个特有的对象window.google、window.chrome、window.chromium
        3)maxthon下window.external.mxVersion为版本号

3.Gecko内核(Firefox)
继承netscape浏览器衣钵的Firefox至今依然保留留着window.netscape对象,且navigator.product的值为“Gecko”

4.IE
IE的JScript独有的条件注释可以方便的与其他浏览器区别开来,document.documentMode可以判断IE8以上的版本号,I5、E6、7 可根据DOM对象差异来区别。

原理讲完,下面写一个DEMO,用上边的方法重写jQuery的$.browser.对象。

(function(win, $){

    var doc = win.document,
nav = win.navigator,
html = doc.documentElement; //浏览器版本判断
/*@cc_on @if (@_jscript)
$.browser = {
msie: true,
version: doc.documentMode || (doc.compatMode == "CSS1Compat" ? "XMLHttpRequest" in win ? 7 : 6 : 5)
};
nav.language = nav.userLanguage;
@else @*/ if ( win.opera ) {
//opera
$.browser = {
opera: true,
version: opera.version()
};
nav.language = nav.language.replace(/-[a-z]{2}$/, function(str ) {
return str.toUpperCase();
});//20150115 测试只对opera 浏览器不起作用,其他的都ok
} else {
function browser(name){
if( !$.browser[name] ) {
$.browser = {version: true};
$.browser[name] = true;
}
}
if ( win.netscape && nav.product == "Gecko" ) {
//firefox
browser("mozilla");
} else {
//webkit
browser("webkit");
$.browser.chrome = !!win.chrome;
$.browser.safari = /^apple\s+/i.test(nav.vendor);
}
} /*@end @*/
})(this, jQuery);

在加一句:console.log("v"==="\v")

//IE8以下的浏览器会返回true;IE9,chrome,firefox会返回false;因为IE8,7,6会把v和\v都编译为垂直制表符。

自测:目前只有opera 判断不了,因为现在加入了 webkit 内核的 opera 已经不再具有 window.opera 了,希望大家找到更好的解决判断浏览器类型的办法!
【来自:http://www.w3cfuns.com/article-2440-1-1.html】

更靠谱的js判断浏览器及其版本的更多相关文章

  1. 实验:JS判断浏览器中英文版本

    <script type="text/javascript"> var lang = (navigator.systemLanguage?navigator.syste ...

  2. JS判断浏览器类型及版本

    浏览器 ie firefox opera safari chrome 分类: 一路辛酸---JavaScript 你知道世界上有多少种浏览器吗?除了我们熟知的IE, Firefox, Opera, S ...

  3. js判断浏览器类型 js判断ie6不执行

    js判断浏览器类型 $.browser  对象 $.browser.version 浏览器版本 var binfo = ''; if ($.browser.msie) { binfo = " ...

  4. js判断浏览器类型以及版本

    你知道世界上有多少种浏览器吗?除了我们熟知的IE, Firefox, Opera, Safari四大浏览器之外,世界上还有近百种浏览器. 几天前,浏览器家族有刚诞生了一位小王子,就是Google推出的 ...

  5. Js 判断浏览器类型整理

    判断原理 JavaScript是前端开发的主要语言,我们可以通过 编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根据各种浏览器独有的属性 ...

  6. JS判断浏览器类型,JS判断客户端操作系统

    JS判断浏览器类型 function judge(){ var browser = { versions: function() { var u = navigator.userAgent, app ...

  7. JS判断浏览器类型和详细区分IE各版本浏览器

    今天用到JS判断浏览器类型,于是就系统整理了一下,便于后期使用. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...

  8. js判断浏览器是否安装或启用了flash的方法总结

    目录 # js判断浏览器是否安装或启用了flash的方法 # chrome浏览器启用flash插件的方法 # 参考 # js判断浏览器是否安装或启用了flash的方法 在传统浏览器,可以使用windo ...

  9. JS判断浏览器类型的方法总结(IE firefox chrome opera safari)

    JS判断浏览器类型的方法总结,可判别当前客户端所使用的浏览器是ie,firefox,safari,chrome或者是opera,另外js可以精确判断到ie浏览器的版本,依然直接上代码,需要的朋友可按照 ...

随机推荐

  1. VS2010如何调试IIS上的网站

    通常,我们在Visual Studio里调试ASP.NET网站,都是加个断点,然后按F5,在VS自带的虚拟服务器下调试的.但有时候,VS自带的服务器弱爆了,无法满足一些特定情况的要求,我们必须把网站放 ...

  2. 函数的重载与 泛型(generic)有什么不同?

    函数重载指   重载函数,形参(类型)不同,实现的功能一样. 泛型算法指2个方面:这些算法可作用于各种不同的容器类型,而这些容器类型又可以容纳多种不同类型的元素.

  3. ArcGIS Runtime for Android开发教程V2.0(8)基础篇-----地图事件

    转自:http://blog.csdn.net/arcgis_mobile/article/details/8263283 ArcGIS Runtime sdk for Android为我们提供了丰富 ...

  4. [POJ1477]Box of Bricks

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19503   Accepted: 7871 Description Litt ...

  5. 一分钟快速入门openstack

    一.它是什么,能干什么想认识一个事物,必须先弄明白它是什么,能干什么.首先说一下,openstack是一个搭建云平台的一个解决方案,说他不是个软件,但是我觉得说是一个软件,能够让大家认识更清晰些.op ...

  6. HDU-4415 Assassin’s Creed 贪心

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4415 用贪心来解,开始分为两个集合的方法错了,没有考虑之间的相互影响,正确的姿势应该是这样的,分两种情 ...

  7. php学习小记2 类与对象

    php类的一些特性: 1. 伪变量$this.$this是一个到主叫对象的引用.取值:该方法所从属的对象,可能是另外的对象(前提,当该方法被静态调用时).$this变量存在于一个类的非静态方法中,在静 ...

  8. 从源码剖析一个Spark WordCount Job执行的全过程

      原文地址:http://mzorro.me/post/55c85d06e40daa9d022f3cbd   WordCount可以说是分布式数据处理框架的”Hello World”,我们可以以它为 ...

  9. weblogic启动时日志重定向(nohup.out)

    由于weblogic使用  nohup ./startWebLogic.sh &   启动时会将所有日志打印到nohup.out上,长此以往会导致该文件越来越大,不便于管理. 故下面介绍如何重 ...

  10. mongoDB中的连接池(转载)

    一.mongoDB中的连接池 刚上手MongoDB,在做应用时,受以前使用关系型数据库的影响,会考虑数据库连接池的问题! 关系型数据库中,我们做连接池无非就是事先建立好N个连接(connection) ...