检测浏览器和操作系统[JavaScript高级程序设计]

/*
 * 检测浏览器和操作系统
 * Book:JavaScript高级程序设计
 * Author:Nicholas C. Zakas
 * 在客户端浏览器检测中最重要的对象是navigator对象,它包含一些可以向你提供浏览器信息的属性
 */
/*
 * 检测浏览器的方式:
 * 1.对象/特征检测法:一种判断浏览器能力的通用方法,涉及到在使用一个给定对象之前首先检测它的存在
 * 例如:
 * if(document.getElementById) [如果一个属性或者方法不存在,就会返回undefined,被翻译成Boolean就是false
 * {
 *    //the method exists,so use it here
 * }else{
 *    //do something else
 * }
 * 如果更关注浏览器的能力而不在乎它实际的身份,就可以使用这种检测方法
 *
 * 2.user-agent字符串检测法
 * user-agent字符串检测法是最古老的浏览器检测方法,每个访问网站的程序都必须提供一个user-agent字符串来向服务器确定它的身份。
 * 在JavaScript中的navigator对象中引入了userAgent属性来提供客户端对user-agent字符串的访问
 *    var sUserAgent = navigator.userAgent;
 * 关于user-agent字符串的历史以及各种浏览器之间user-agent字符串格式的差异详情参见第八章内容
 */

//保存user-agent字符串
var sUserAgent = window.navigator.userAgent;
//保存浏览器版本
var fAppVersion = parseFloat(window.navigator.appVersion) ;

/*
 * 接受两个版本字符串作为参数,如果相等返回0,如果第一个大于第二个返回1,如果第二个大于第一个返回-1
 * 参数sVersion例如:0.9.2  ; 0.9  ;1.13.2;  1.14
 */
function compareVersions(sVersion1,sVersion2)
{
    var aVersion1 = sVersion1.split(".");
    var aVersion2 = sVersion2.split(".");
   
    if(aVersion1.length < aVersion2.length)
    {
        for(var i=0;i<aVersion2.length-aVersion1.length;i++)
           aVersion1.push("0");
    }else if(aVersion2.length < aVersion1.length)
    {
        for(var i=0;i<aVersion1.length-aVersion2.length;i++)
           aVersion2.push("0");
    }
    for(var i=0;i<aVersion1.length;i++)
    {
        var iVal1 = parseInt(aVersion1[i],10);
        var iVal2 = parseInt(aVersion2[i],10);
       
        if(iVal1<iVal2)
           return -1;
        else if(iVal1>iVal2)
           return 1;
    }
    return 0;
}

/*
 * 检测Opera
 * 最方便的判断方法是在user-agent字符串中搜索有没有Opera
 * 然后继续判断实际使用的版本
 */
var isOpera = sUserAgent.indexOf("Opera")>-1;
var isMinOpera4 = isMinOpera5 = isMinOpera6 = isMinOpera7 = isMinOpera7_5 = false;
if(isOpera)
{
    var fOperaVersion;
    if(window.navigator.appName=="Opera")
    {
        fOperaVersion = fAppVersion;
    }else
    {
        var reOperaVersion = new RegExp("Opera (\\d+\\.\\d+)");
        reOperaVersion.test(sUserAgent);
        fOperaVersion = parseFloat(RegExp["$1"]);
    }
   
    isMinOpera4 = fOperaVersion>=4;
    isMinOpera5 = fOperaVersion>=5;
    isMinOpera6 = fOperaVersion>=6;
    isMinOpera7 = fOperaVersion>=7;
    isMinOpera7_5 = fOperaVersion>=7.5;
}

/*
 * 检测Konqueror/Safari
 * Konqueror/Safari都是基于KHTML项目
 */

var isKHTML = sUserAgent.indexOf("KHTML")>-1
              ||sUserAgent.indexOf("Konqueror")>-1
              ||sUserAgent.indexOf("AppleWebKit")>-1;

if(isKHTML)
{
    isSafari = sUserAgent.indexOf("AppleWebKit")>-1;
    isKonq = sUserAgent.indexOf("Konqueror")>-1;
    var isMinSafari1 = isMinSafari1_2 = false;
    var isMinKonq2_2 = isMinKonq3 = isMinKonq3_1 = isMinKonq3_2 = false;
   
    if(isSafari)
    {
        var reAppleWebKit = new RegExp("AppleWebKit\\/(\\d+(?:\\.\\d*)?)");
        reAppleWebKit.test(sUserAgent);
        var fAppleWebKitVersion = parseFloat(RegExp["$1"]);
       
        isMinSafari1 = fAppleWebKitVersion>=85;
        isMinSafari1_2 = fAppleWebKitVersion>=124;
    }
   
    else if(isKonq)
    {
        var reKonq = new RegExp("Konqueror\\/(\\d+(?:\\.\\d+(?:\\.\\d)?)?)");
        reKonq.test(sUserAgent);
        isMinKonq2_2 = compareVersions(RegExp["$1"],"2.2")>=0;
        isMinKonq3 = compareVersions(RegExp["$1"],"3.0")>=0;
        isMinKonq3_1 = compareVersions(RegExp["$1"],"3.1")>=0;
        isMinKonq3_2 = compareVersions(RegExp["$1"],"3.2");
    }
}

/*
 * 检测IE
 */
var isIE = sUserAgent.indexOf("compatible")>-1
            && sUserAgent.indexOf("MSIE")>-1
            && !isOpera;
var isMinIE4 = isMinIE5 = isMinIE5_5 = isMinIE6 = false;

if(isIE)
{
    var reIE = new RegExp("MSIE (\\d+\\.\\d+);");
    reIE.test(sUserAgent);
    var fIEVersion = parseFloat(RegExp["$1"]);
   
    isMinIE4 = fIEVersion>=4;
    isMinIE5 = fIEVersion>=5;
    isMinIE5_5 = fIEVersion>=5.5;
    isMinIE6 = fIEVersion>=6.0;
}

/*
 * 检测Mozilla
 */
var isMoz = sUserAgent.indexOf("Gecko")>-1 && !isKHTML;
var isMinMoz1 = isMinMoz1_4 = isMinMoz1_5 = false;

if(isMoz)
{
    var reMoz = new RegExp("rv:(\\d+\\.\\d+(?:\\.\\d+)?)");
    reMoz.test(sUserAgent);
    isMinMoz1 = compareVersions(RegExp["$1"],"1.0")>=0;
    isMinMoz1_4 = compareVersions(RegExp["$1"],"1.4")>=0;
    isMinMoz1_5 = compareVersions(RegExp["$1"],"1.5")>=0;
}

/*
 * 检测Netscape Communicator 4.x
 * 尽管Netscape Communicator已经过时,但可能仍然存在一些它的用户
 */
var isNS4 = !isIE && !isOpera && !isMoz && !isKHTML && (sUserAgent.indexOf("Mozilla")==0) && (navigator.appName == "Netscape") && (fAppVersion>=4.0 && fAppVersion<5.0);

var isMinNS4 = isMinNS4_5 = isMinNS4_7 = isMinNS4_8 = false;

if(isNS4)
{
    isNS4 = true;
    isMinNS4_5 = fAppVersion>=4.5;
    isMinNS4_7 = fAppVersion>=4.7;
    isMinNS4_8 = fAppVersion>=4.8;
}


/*
 * 平台/操作系统检测脚本
 * 判断操作系统应该先从查找平台开始,平台主要分成三大类:Windows,Macintosh和Unix
 */
var isWin = (window.navigator.platform =="Win32")||(window.navigator.platform=="Windows");
var isMac = (window.navigator.platform =="Mac68K")||(window.navigator.platform == "MacPPC");
var isUnix = (window.navigator.platform == "X11") && !isWin && !isMac;

var isWin95 = isWin98 = isWinNT4 = isWin2K = isWinME = isWinXP = false;
if(isWin)
{
    isWin95 = sUserAgent.indexOf("Win95")>-1 || sUserAgent.indexOf("Windows 95")>-1;
    isWin98 = sUserAgent.indexOf("Win98")>-1 || sUserAgent.indexOf("Windows 98")>-1;
    isWinME = sUserAgent.indexOf("Win 9x 4.90")>-1 || sUserAgent.indexOf("Windows ME")>-1;
    isWin2K = sUserAgent.indexOf("Windows NT 5.0")>-1 || sUserAgent.indexOf("Windows 2000")>-1;
    isWinXP = sUserAgent.indexOf("Windows NT 5.1")>-1 || sUserAgent.indexOf("Windows XP")>-1;
    isWinNT4 = sUserAgent.indexOf("WinNT")>-1 || sUserAgent.indexOf("Windows NT")>-1 || sUserAgent.indexOf("WinNT4.0")>-1 || sUserAgent.indexOf("Windows NT 4.0")>-1 && (!isWinME && !isWin2K && !isWinXP);
}

var isMac68K = isMacPPC = false;
if(isMac)
{
    isMac68K = sUserAgent.indexOf("Mac_68000")>-1 || sUserAgent.indexOf("68K")>-1;
    isMacPPC = sUserAgent.indexOf("Mac_PowerPC")>-1 || sUserAgent.indexOf("PPC")>-1;
}

/*
 * Unix有相当多的款式,SunOS,HP-UX,AIX,Linux等等,每种又有不同的版本以及不同的user-agent字符串表示
 * 这里只关注了SunOS及其一些版本,你应该有足够的知识来将脚本改造成检测其他Unix平台
 */
var isSunOS = isMinSunOS4 = isMinSunOS5 = isMinSunOS5_5 = false;
if(isUnix)
{
    isSunOS = sUserAgent.indexOf("SunOS")>-1;
    if(isSunOS)
    {
        var reSunOS = new RegExp("SunOS (\\d+\\.\\d+(?:\\.\\d+)?)");
        reSunOS.test(sUserAgent);
        isMinSunOS4 = compareVersions(RegExp["$1"],"4.0")>=0;
        isMinSunOS5 = compareVersions(RegExp["$1"],"5.0")>=0;
        isMinSunOS5_5 = compareVersions(RegExp["$1"],"5.5")>=0;
    }
}


转载于:https://www.cnblogs.com/simply-zhao/archive/2008/01/03/1025171.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值