最近写个项目,需要判断用户使用浏览器的版本是否符合系统所需最低版本要求,然后引导用户跳转到相应地址下载新版本浏览器。在网上搜了一圈,基本很难有符合要求的代码,想起之前看过的《JavaScript高级程序设计》这本书有涉及过,因此找出来,并在它的代码上进行修改。
主要改动有两个:
1. Opera 15之后转投Webkit;
2. IE 11的UserAgent跟之前版本的规则不一样。
ps:后续微软出Edge的话,这里还需要持续改进。
var client = function(){
<span style="white-space:pre"> </span>\\内核
var engine={
ie:0,
gecko:0,
webkit:0,
khtml:0,
opera:0,
//version
ver :null
};
<span style="white-space:pre"> </span>\\浏览器版本
var browser = {
ie:0,
firefox:0,
safari:0,
kongq:0,
opera:0,
chrome:0,
ver:null
};
<span style="white-space:pre"> </span>\\所在系统
var system = {
win:false,
mac:false,
x11:false,
iphone:false,
ipod:false,
ipad:false,
ios:false,
android:false,
nokiaN:false,
winMobile:false,
wii:false,
ps:false
};
var ua = navigator.userAgent;
if(window.opera){//旧版本的opera用自己的引擎,但是opera 15转投Webkit了,所以这里失效
engine.ver = browser.ver = window.opera.version();
engine.opera = browser.opera = parseFloat(engine.ver);
}else if(/AppleWebKit\/(\S+)/.test(ua)){
engine.ver = RegExp["$1"];
engine.webkit = parseFloat(engine.ver);
if(/OPR\/(\S+)/.test(ua)){//Opera 15以上版本判断方法
browser.ver = RegExp["$1"];
browser.opera = parseFloat(browser.ver);
}
else if(/Chrome\/(\S+)/.test(ua)){
browser.ver = RegExp["$1"];
browser.chrome = parseFloat(browser.ver);
} else if (/Version\/(\S+)/.test(ua)){
browser.ver = RegExp["$1"];
browser.safari = parseFloat(browser.ver);
}else{
var safariVersion = 1;
if(engine.webkit<100){
safariVersion=1;
}else if(engine.webkit<312){
safariVersion=1.2;
}else if (engine.webkit<412){
safariVersion = 1.3;
}else{
safariVersion=2;
}
browser.safari = browser.ver =safariVersion;
}
}else if(/KHTML\/(\S+)/.test(ua)||/Konqueror\/([^;]+)/.test(ua)){
engine.ver = browser.ver = RegExp["$1"];
engine.khtml = browser.konq = parseFloat(engine.ver);
}else if(/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)){
engine.ver = RegExp["$1"];
engine.gecko = parseFloat(engine.ver);
if(/Firefox\/(\S+)/.test(ua)){
browser.ver = RegExp["$1"];
browser.firefox = parseFloat(browser.ver);
}
}else if(/MSIE ([^;]+)/.test(ua)||/Trident\/[^"]*rv:([^\s,^\)]+)/.test(ua)){
//这里加上IE11的情况。后续还需要考虑微软新的Edge
engine.ver = browser.ver =RegExp["$1"];
engine.ie = browser.ie = parseFloat(engine.ver);
}
browser.ie = engine.ie;
browser.opera = engine.opera;
// check platform
var p = navigator.platform;
system.win = p.indexOf("Win")==0;
system.mac = p.indexOf("Mac")==0;
system.x11 = (p=="xll")||(p.indexOf("linux")==0);
//check Windows
if(system.win){
if(/Win(?:dows )?([^do]{2})\s?(\d+\.\d+)?/.test(ua)){
if(RegExp["$1"]=="NT"){
switch(RegExp["$2"]){
case "5.0":
system.win = "2000";
break;
case "5.1":
system.win = "XP";
break;
case "6.0":
system.win = "Vista";
break;
case "6.1":
system.win = "7";
break;
default:
system.win = "NT";
break;
}
}else if (RegExp["$1"]=="9x"){
system.win = "ME";
}else{
system.win = RegExp["$1"];
}
}
}
//moblie Device
system.iphone =ua.indexOf("iphone")>-1;
system.ipad=ua.indexOf("iPod")>-1;
system.ipad = ua.indexOf("iPad")>-1;
system.nokiaN = ua.indexOf("nokiaN")>-1;
//windows moblie
if(system.win =="CE"){
system.winMobile = system.win;
}else if (system.win == "Ph"){
if(/Windows Phone OS (\d+.\d+)/.test(ua)){
system.win = "phone";
system.winMobile = parseFloat(RegExp["$1"]);
}
}
//check IOS Version
if(system.mac && ua.indexOf("Mobile")>-1){
if(/CPU (?:iPhone )?OS (\d+_\d+)/.test(ua)){
system.ios = parseFloat(RegExp.$1.replace("_",","));
}else{
system.ios = 2;//guest one version
}
}
//check android
if(/Addroid (\d+\.\d+)/.test(ua)){
system.android = parseFloat(RegExp.$1);
}
//Game sys
system.wii = ua.indexOf("Wii")>-1;
system.ps = /playstation/i.test(ua);
return{
engine: engine,
browser: browser,
system:system
}
}()