/*
* 检测浏览器和操作系统
* 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