JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js


Posted in Javascript onAugust 14, 2012

检测浏览器的方式

1、对象特征检测法:判断浏览器能力的通用方法。如果更关注浏览器的能力而不在乎它的实际身份,就可以使用这种检测方法。常见的原生Ajax写法中就用这种方法来创建XMLHttpRequest:

IXHR: function(){ 
if(window.ActiveXObject){ 
XHR=new ActiveXObject('Microsoft.XMLHTTP'); 
}else if(window.XMLHttpRequest){ 
XHR=new XMLHttpRequest(); 
}else{ 
return null; 
} 
}

2、user-agent字符串检测法:通过能浏览器的user-agent字符串进行解析来判断,判断方法在下文的detect.js中

检测平台/操作系统

通过navigator折platform属性和user-agent字符串来判断,判断方法在下文的detect.js中

检测浏览器和操作系统-detect.js

var sUserAgent = navigator.userAgent; 
var fAppVersion = parseFloat(navigator.appVersion); function compareVersions(sVersion1, sVersion2) { 
var aVersion1 = sVersion1.split("."); 
var aVersion2 = sVersion2.split("."); 
if (aVersion1.length > aVersion2.length) { 
for (var i=0; i < aVersion1.length - aVersion2.length; i++) { 
aVersion2.push("0"); 
} 
} else if (aVersion1.length < aVersion2.length) { 
for (var i=0; i < aVersion2.length - aVersion1.length; i++) { 
aVersion1.push("0"); 
} 
} 
for (var i=0; i < aVersion1.length; i++) { 
if (aVersion1[i] < aVersion2[i]) { 
return -1; 
} else if (aVersion1[i] > aVersion2[i]) { 
return 1; 
} 
} 
return 0; 
} 
var isOpera = sUserAgent.indexOf("Opera") > -1; 
var isMinOpera4 = isMinOpera5 = isMinOpera6 = isMinOpera7 = isMinOpera7_5 = false; 
if (isOpera) { 
var fOperaVersion; 
if(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; 
} 
var isKHTML = sUserAgent.indexOf("KHTML") > -1 
|| sUserAgent.indexOf("Konqueror") > -1 
|| sUserAgent.indexOf("AppleWebKit") > -1; 
var isMinSafari1 = isMinSafari1_2 = false; 
var isMinKonq2_2 = isMinKonq3 = isMinKonq3_1 = isMinKonq3_2 = false; 
if (isKHTML) { 
isSafari = sUserAgent.indexOf("AppleWebKit") > -1; 
isKonq = sUserAgent.indexOf("Konqueror") > -1; 
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") >= 0; 
} 
} 
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; 
} 
var isMoz = sUserAgent.indexOf("Gecko") > -1 
&& !isKHTML; 
var isMinMoz1 = sMinMoz1_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; 
} 
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) { 
isMinNS4 = true; 
isMinNS4_5 = fAppVersion >= 4.5; 
isMinNS4_7 = fAppVersion >= 4.7; 
isMinNS4_8 = fAppVersion >= 4.8; 
} 
var isWin = (navigator.platform == "Win32") || (navigator.platform == "Windows"); 
var isMac = (navigator.platform == "Mac68K") || (navigator.platform == "MacPPC") 
|| (navigator.platform == "Macintosh"); 
var isUnix = (navigator.platform == "X11") && !isWin && !isMac; 
var isWin95 = isWin98 = isWinNT4 = isWin2K = isWinME = isWinXP = false; 
var isMac68K = isMacPPC = false; 
var isSunOS = isMinSunOS4 = isMinSunOS5 = isMinSunOS5_5 = 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); 
} 
if (isMac) { 
isMac68K = sUserAgent.indexOf("Mac_68000") > -1 
|| sUserAgent.indexOf("68K") > -1; 
isMacPPC = sUserAgent.indexOf("Mac_PowerPC") > -1 
|| sUserAgent.indexOf("PPC") > -1; 
} 
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; 
} 
}

作者:Artwl
Javascript 相关文章推荐
一个很简单的办法实现TD的加亮效果.
Jun 29 Javascript
为调试JavaScript添加输出窗口的代码
Feb 07 Javascript
jquery批量设置属性readonly和disabled的方法
Jan 24 Javascript
javascript实现随时变化着的背景颜色
Apr 02 Javascript
JS实现的竖向折叠菜单代码
Oct 21 Javascript
浅析Ajax语法
Dec 05 Javascript
jQuery自定义元素右键点击事件(实现案例)
Apr 28 jQuery
JS监控关闭浏览器操作的实例详解
Sep 12 Javascript
vue自定义过滤器创建和使用方法详解
Nov 06 Javascript
微信小程序中吸底按钮适配iPhone X方案
Nov 29 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
Jul 18 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
Oct 22 Javascript
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
Aug 14 #Javascript
JavaScript高级程序设计 阅读笔记(十三) js定义类或对象
Aug 14 #Javascript
JavaScript高级程序设计 阅读笔记(十二) js内置对象Math
Aug 14 #Javascript
jQuery 1.8 Release版本发布了
Aug 14 #Javascript
常用一些Javascript判断函数
Aug 14 #Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
Aug 14 #Javascript
JavaScript 布尔操作符解析  &amp;&amp; || !
Aug 10 #Javascript
You might like
PHP 实现explort() 功能的详解
2013/06/20 PHP
分享一段PHP制作的中文拼音首字母工具类
2014/12/11 PHP
PDO的安全处理与事物处理方法
2016/10/31 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
2017/08/17 PHP
PHP折半(二分)查找算法实例分析
2018/05/12 PHP
12款经典的白富美型—jquery图片轮播插件—前端开发必备
2013/01/08 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
原生js的弹出层且其内的窗口居中
2014/05/14 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
JavaScript中eval()函数用法详解
2015/12/14 Javascript
js前端实现图片懒加载(lazyload)的两种方式
2017/04/24 Javascript
手机注册发送验证码倒计时的简单实例
2017/11/15 Javascript
JS实现访问DOM对象指定节点的方法示例
2018/04/04 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
React SSR样式及SEO的实践
2018/10/22 Javascript
微信小程序获取用户openid的实现
2018/12/24 Javascript
JS数组方法slice()用法实例分析
2020/01/18 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
在Python的setuptools框架下生成egg的教程
2015/04/13 Python
Python算术运算符实例详解
2017/05/31 Python
用TensorFlow实现多类支持向量机的示例代码
2018/04/28 Python
Python爬虫包BeautifulSoup简介与安装(一)
2018/06/17 Python
详解django中url路由配置及渲染方式
2019/02/25 Python
浅析Python语言自带的数据结构有哪些
2019/08/27 Python
PatPat阿根廷:妈妈们的购物平台
2019/05/30 全球购物
Net Remoting把服务器端激活两种模式
2014/01/22 面试题
数控技校生自我鉴定
2014/04/19 职场文书
2014年英语教研组工作总结
2014/12/06 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
2016继续教育研修日志
2015/11/13 职场文书
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python
Python 全局空间和局部空间
2022/04/06 Python
Python实战实现爬取天气数据并完成可视化分析详解
2022/06/16 Python