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 相关文章推荐
Hallo.js基于jQuery UI所见即所得的Web编辑器
Jan 26 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
Oct 05 Javascript
jq stop()和:is(:animated)的用法及区别(详解)
Feb 12 Javascript
jQuery滚动监听实现商城楼梯式导航效果
Mar 06 Javascript
jQuery EasyUI开发技巧总结
Sep 26 jQuery
vue-router实现tab标签页(单页面)详解
Oct 17 Javascript
js中document.write和document.writeln的区别
Mar 11 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
Oct 25 Javascript
Jquery的Ajax技术使用方法
Jan 21 jQuery
基于vue手写tree插件的那点事儿
Aug 20 Javascript
vue+element导航栏高亮显示的解决方式
Nov 12 Javascript
vue实现树状表格效果
Dec 29 Vue.js
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
为查询结果建立向后/向前按钮
2006/10/09 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
ThinkPHP开发框架函数详解:C方法
2015/08/14 PHP
一个javascript参数的小问题
2008/03/02 Javascript
js中的值类型和引用类型小结 文字说明与实例
2010/12/12 Javascript
jquery each()源代码
2011/02/14 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
2014/09/03 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
Bootstrap每天必学之简单入门
2015/11/19 Javascript
JS 获取HTML标签内的子节点的方法
2016/09/21 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
解决vue移动端适配问题
2018/12/12 Javascript
[02:08:58]2014 DOTA2国际邀请赛中国区预选赛 Ne VS CIS
2014/05/22 DOTA
[03:46]DAC趣味视频-中文考试.mp4
2017/04/02 DOTA
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
通过数据库向Django模型添加字段的示例
2015/07/21 Python
python的else子句使用指南
2016/02/27 Python
Python WEB应用部署的实现方法
2019/01/02 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
使用python进行波形及频谱绘制的方法
2019/06/17 Python
Python中IP地址处理IPy模块的方法
2019/08/16 Python
python如何通过闭包实现计算器的功能
2020/02/22 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
python 匿名函数与三元运算学习笔记
2020/10/23 Python
纯CSS3代码实现文字描边
2016/04/25 HTML / CSS
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
琳达·法罗眼镜英国官网:Linda Farrow英国
2021/01/19 全球购物
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
市场营销专业个人自荐信格式
2013/09/21 职场文书
中专毕业生求职简历的自我评价
2013/10/21 职场文书
小学生红领巾广播稿
2014/01/21 职场文书
新年抽奖获奖感言
2014/03/02 职场文书
大二学习计划书范文
2014/04/27 职场文书
个人四风问题整改措施
2014/10/24 职场文书
优秀毕业生主要事迹材料
2015/11/04 职场文书