浏览器内核及版本检测

/* 可配置部分
 ***************************************************************************************/
var webkitVersionUrl = "http:\/\/trac.webkit.org\/browser\/tags\/Safari-%s";

var vi = [
    // chromium主版本号信息
    {
        first:{version:"5.0.307.1", date:"2010年1月。"},
        normal:{version:"5.0.375.55", date:"2010年5月。"},
        last:{version:"5.0.375.127", date:"2010年8月。"}
    },
    {
        first:{version:"6.0.408.1", date:"2010年5月。"},
        normal:{version:"6.0.472.53", date:"2010年9月。"},
        last:{version:"6.0.472.62", date:"2010年9月。"}
    },
    {
        first:{version:"7.0.503.0", date:"2010年8月。"},
        normal:{version:"7.0.517.43", date:"2010年10月。"},
        last:{version:"7.0.517.44", date:"2010年11月。"}
    },
    {
        first:{version:"8.0.552.5", date:"2010年10月。"},
        normal:{version:"8.0.552.215", date:"2010年11月。"},
        last:{version:"8.0.552.237", date:"2011年1月。"}
    },
    {
        first:{version:"9.0.570.1", date:"2010年11月。"},
        normal:{version:"9.0.597.84", date:"2011年2月。"},
        last:{version:"9.0.597.107", date:"2011年2月。"}
    },
    {
        first:{version:"10.0.612.3", date:"2010年12月。"},
        normal:{version:"10.0.648.127", date:"2011年3月。"},
        last:{version:"10.0.648.205", date:"2011年4月。"}
    },
    {
        first:{version:"11.0.686.0", date:"2011年2月。"},
        normal:{version:"11.0.696.57", date:"2011年4月。"},
        last:{version:"11.0.696.77", date:"2011年6月。"}
    },
    {
        first:{version:"12.0.712.0", date:"2011年3月。"},
        normal:{version:"12.0.742.91", date:"2011年6月。"},
        last:{version:"12.0.742.112", date:"2011年7月。"}
    },
    {
        first:{version:"13.0.767.1", date:"2011年5月。"},
        normal:{version:"13.0.782.107", date:"2011年8月。"},
        last:{version:"13.0.782.220", date:"2011年9月。"}
    },
    {
        first:{version:"14.0.794.0", date:"2011年6月。"},
        normal:{version:"14.0.835.163", date:"2011年9月。"},
        last:{version:"14.0.835.202", date:"2011年10月。"}
    },
    {
        first:{version:"15.0.849.0", date:"2011年8月。"},
        normal:{version:"15.0.874.102", date:"2011年10月。"},
        last:{version:"15.0.874.121", date:"2011年11月16日。"}
    },
    {
        first:{version:"16.0.899.0", date:"2011年9月。"},
        normal:{version:"16.0.912.63", date:"2011年12月13日。"},
        last:{version:"16.0.912.77 ", date:"2012年1月23日。"}
    },
    {
        first:{version:"17.0.928.0", date:"2011年11月。"},
        normal:{version:"17.0.963.46", date:"2012年2月8日。"},
        last:{version:"17.0.963.84", date:"2012年3月22日。"}
    },
    {
        first:{version:"18.0.1003.1", date:"2012年1月10日。"},
        normal:{version:"18.0.1025.142", date:"2012年4月30日。"},
        last:{version:"18.0.1025.168", date:"2012年4月30日。"}
    },
    {
        first:{version:"19.0.1041.0", date:"2012年2月14日。"},
        normal:{version:"19.0.1084.52", date:"2012年5月23日。"},
        last:{version:"19.0.1084.56", date:"2012年6月11日。"}
    },
    {
        first:{version:"20.0.1096.1", date:"2012年4月10日。"},
        normal:{version:"20.0.1132.43", date:"2012年6月26日。"},
        last:{version:"20.0.1132.59", date:"2012年7月28日。"}
    },
 {
        first:{version:"21.0.1145.0", date:"2012年5月21日。"},
        normal:{version:"21.0.1180.60", date:"2012年7月31日。"},
        last:{version:"21.0.1180.90", date:"2012年9月24日。"}
    },
    {
        first:{version:"22.0.1207.1", date:"2012年7月16日。"},
        normal:{version:"22.0.1229.79", date:"2012年9月25日。"},
        last:{version:"22.0.1229.94", date:"2012年10月10日。"}
    },
    {
        first:{version:"23.0.1243.2", date:"2012年8月23日。"},
        normal:{version:"23.0.1271.83", date:"2012年9月2日。"},
        last:{version:"23.0.1271.101", date:"2012年12月17日。"}
    },
    {
        first:{version:"24.0.1284.2", date:"2012年10月2日。"},
        normal:{version:"24.0.1312.52", date:"2013年1月10日。"},
        last:{version:"24.0.1312.71", date:"2012年2月14日。"}
    },
    {
        first:{version:"25.0.1359.3", date:"2012年12月13日。"},
        normal:{version:"25.0.1364.97", date:"2013年2月21日。"},
        last:{version:"25.0.1364.172", date:"2013年3月12日。"}
    },
    {
        first:{version:"26.0.1384.2", date:"2013年1月15日。"},
        normal:{version:"26.0.1410.43", date:"2013年3月26日。"},
        last:{version:"26.0.1410.64", date:"2013年4月9日。"}
    },
    {
        first:{version:"27.0.1423.0", date:"2013年2月26日。"},
        normal:{version:"27.0.1453.12", date:"2013年4月2日。"},
        last:{version:"27.0.1453.116", date:"2013年6月18日。"}
    },
    {
        first:{version:"28.0.1464.0", date:"2013年4月5日。"},
        normal:{version:"28.0.1500.71", date:"2013年7月9日。"},
        last:{version:"28.0.1500.95", date:"2013年7月30日。"}
   },
   {
        first:{version:"29.0.1516.3", date:"2013年5月24日。"},
        normal:{version:"29.0.1547.57", date:"2013年8月20日。"},
        last:{version:"29.0.1547.76", date:"2013年9月18日。"}
   },
  {
        first:{version:"30.0.1566.2", date:"2013年7月16日。"},
        normal:{version:"30.0.1599.66", date:"2013年10月01日。"},
        last:{version:"30.0.1599.114", date:"2013年10月22日。"}
   },
   {
        first:{version:"31.0.1612.0", date:"2013年8月27日。"},
        normal:{version:"31.0.1650.48", date:"2013年11月12日。"},
        last:{version:"31.0.1650.63", date:"2013年12月04日。"}
   },
   {
        first:{version:"32.0.1659.2", date:"2013年11月03日。"},
        normal:{version:"", date:""},
        last:{version:"", date:""}
   },
   {
        first:{version:"33.0.1707.0", date:"2013年11月12日。"},
        normal:{version:"", date:""},
        last:{version:"", date:""}
    }
];
var suggestion = [
    // 大版本号大于最新版
    "此版本极速内核尚未发布正式版,您可以作为尝鲜时使用。",
    // 大版本号为最新版,子版本号大于等于对应的版本号
    "此版本内核为已发布正式版的最新版极速内核,建议您继续使用。",
    // 大版本号为最新版,子版本号小于对应的版本号
    "此版本极速内核为非正式版,建议您选择使用最新正式版内核的浏览器。",
    // 大版本号为最新版-1,子版本号大于等于对应的版本号
    "此版本极速内核为较新的正式版。建议您继续使用,等待浏览器升级内核。",
    // 大版本号为最新版-1,子版本号小于对应的版本号
    "此版本极速内核为非正式版。建议您选择使用最新正式版内核的浏览器。",
    // 大版本号大于等于8、小于最新版-1,子版本号大于对应的版本号
    "此版本极速内核较旧。建议您选择使用最新正式版内核的浏览器。",
    // 大版本号大于等于8、小于最新版-1,子版本号小于对应的版本号
    "此版本极速内核为较旧的非正式版。建议您选择使用最新正式版内核的浏览器。",
    // 大版本号大于等于5、小于8,子版本号大于对应的版本号
    "此版本极速内核非常陈旧,面临安全风险。建议您立即更换为使用最新正式版内核的浏览器。",
    //大版本号大于等于5、小于8,子版本号小于对应的版本号
    "此版本极速内核为非常陈旧的非正式版,面临安全风险。建议立即更换为使用最新正式版内核的浏览器。",
    // 大版本号小于最低版本号
    "此版本极速内核非常陈旧,面临安全风险。建议您立即更换为使用最新正式版内核的浏览器。"
];
/*
 **********************************************************************************************/


/*
 * 函数功能:      判断两个版本号的大小
 * 函数参数:      两个版本号的字符串
 * 函数返回值:    1 表示第一个版本号大于第二个
 *                 0 表示两个版本号相同
 *                -1 表示第一个版本号小于第二个
 */
function cmpVersion(szV1, szV2) {
    var arrV1 = szV1.split(".");
    var arrV2 = szV2.split(".");

    for (var i = 0; i < arrV1.length && i < arrV2.length; i++) {
        if (parseInt(arrV1[i]) > parseInt(arrV2[i]))
            return (1);
        else if (parseInt(arrV1[i]) < parseInt(arrV2[i]))
            return (-1);
    }
    if (arrV1.length == arrV2.length) {
        return (0);
    } else if (arrV1.length > arrV2.length) {
        return (1);
    } else {
        if (arrV1.length == 2 && arrV1[1] == 0) {
            return (1);
        } else {
            return (-1);
        }
    }
}

/*
 * 函数功能: 获取chromium版本号的类型
 * 函数参数: 版本号的字符串
 * 函数返回值:非正式,空
 */
function chromiumVersionType(version) {
    var versionType = [
        "",               // 大版本号已知,子版本号大于等于对应的版本号
        "(非正式版)"    // 大版本号已知,子版本号小于对应的版本号(正式版)/大版本号大于最新版
    ];

    var suggest = "";
    var arrV1 = version.split(".");
    if (parseInt(arrV1[0]) < parseInt(vi[0].normal.version.split(".")[0])) {
        suggest = versionType[0];
    } else if (parseInt(arrV1[0]) > parseInt(vi[vi.length - 1].normal.version.split(".")[0])) {
        suggest = versionType[1];
    }

    for (var i = 0; i < vi.length; i++) {
        if (vi[i].normal.version == "") {
            suggest = versionType[1];
            break;
        }
        var arrV2 = vi[i].normal.version.split(".");
        if (parseInt(arrV1[0]) == parseInt(arrV2[0])) {
            if (vi[i].normal.version!="" && cmpVersion(version, vi[i].normal.version) != -1) {
                suggest = versionType[0];
            } else {
                suggest = versionType[1];
            }
            break;
        }
    }

    return suggest;
}

// 获取chromium内核版本号的发布时间
function chromiumVersionDate(version) {
    var bv = parseInt(version.split(".")[0]);
    // 大版本号大于最大版本号
    if (bv > vi.length + 4) {
        if (vi[vi.length - 1].last.version && cmpVersion(version, vi[vi.length - 1].last.version) > 0) {
            return ("此版本 Chromium 内核发布于 " + vi[vi.length - 1].last.date.replace("。", " 之后。"));
        } else if (vi[vi.length - 1].normal.version && cmpVersion(version, vi[vi.length - 1].normal.version) > 0) {
            return ("此版本 Chromium 内核发布于 " + vi[vi.length - 1].normal.date.replace("。", " 之后。"));
        } else {
            return ("此版本 Chromium 内核发布于 " + vi[vi.length - 1].first.date.replace("。", " 之后。"));
        }
    }

    var firstVersion = vi[bv - 5].first.version;
    var normalVersion = vi[bv - 5].normal.version;
    var lastVersion = vi[bv - 5].last.version;

    var lowerVersion = vi[0].first.version;
    var upperVersion = vi[vi.length - 1].last.version;

    if (cmpVersion(version, lowerVersion) == -1) {
        return ("此版本 Chromium 内核发布早于 " + vi[0].first.date);

    } else if (cmpVersion(version, lowerVersion) == 0) {
        return ("此版本 Chromium 内核发布于 " + vi[0].first.date);

    } else if (upperVersion != "" && cmpVersion(version, upperVersion) == 1) {
        return "";

    } else if (cmpVersion(version, firstVersion) == -1) {
        return ("此版本 Chromium 内核发布早于 " + vi[bv - 5].first.date);

    } else if (cmpVersion(version, firstVersion) == 0) {
        return ("此版本 Chromium 内核发布于 " + vi[bv - 5].first.date);

    } else if (cmpVersion(version, firstVersion) == 1 &&
        cmpVersion(version, normalVersion) == -1) {
        if (vi[bv - 5].first.date == vi[bv - 5].normal.date) {
            return ("此版本 Chromium 内核发布于 " + vi[bv - 5].normal.date);
        } else {
            return ("此版本 Chromium 内核发布于 " + vi[bv - 5].first.date.replace("。", "") + "-" + vi[bv - 5].normal.date.replace("。", " 之间。"));
        }
    } else if (cmpVersion(version, firstVersion) == 1 && normalVersion == ""){
        return ("此版本 Chromium 内核发布于 " + vi[bv - 5].first.date.replace("。", "之后。"));

    } else if (cmpVersion(version, normalVersion) == 0) {
        return ("此版本 Chromium 内核发布于 " + vi[bv - 5].normal.date);

    } else if (cmpVersion(version, normalVersion) == 1 &&
        cmpVersion(version, lastVersion) == -1) {
        if (vi[bv - 5].normal.date == vi[bv - 5].last.date) {
            return ("此版本 Chromium 内核发布于 " + vi[bv - 5].normal.date);
        } else {
            return ("此版本 Chromium 内核发布于 " + vi[bv - 5].normal.date.replace("。", "") + "-" + vi[bv - 5].last.date.replace("。", " 之间。"));
        }
    } else if (cmpVersion(version, normalVersion) == 1 && lastVersion=="") {
        return ("此版本 Chromium 内核发布于 " + vi[bv - 5].normal.date.replace("。", "之后。"));

    } else if (cmpVersion(version, lastVersion) == 0) {
        return ("此版本 Chromium 内核发布于 " + vi[bv - 5].last.date);

    } else if (cmpVersion(version, lastVersion) == 1) {
        return ("此版本 Chromium 内核发布于 " + vi[bv - 5].last.date.replace("。", " 之后。"));
    }
}

// 获取chromium版本的建议
function chromiumVersionSuggestion(version) {
    var arrV1 = version.split(".");
    var latestIndex = 12;
    for (var i=vi.length-1; i>=0; i--) {
        if (vi[i].normal.version != "") {
            latestIndex = i;
            break;
        }
    }

    if (parseInt(arrV1[0]) > parseInt(vi[latestIndex].normal.version.split(".")[0])) {
        return (suggestion[0]);
    } else if (cmpVersion(version, vi[latestIndex].normal.version) != -1) {
        return (suggestion[1]);
    } else if (parseInt(arrV1[0]) == parseInt(vi[latestIndex].normal.version.split(".")[0]) &&
        cmpVersion(version, vi[latestIndex].normal.version) == -1) {
        return (suggestion[2]);
    } else if (parseInt(arrV1[0]) == parseInt(vi[latestIndex-1].normal.version.split(".")[0]) &&
        cmpVersion(version, vi[latestIndex-1].normal.version) != -1) {
        return (suggestion[3]);
    } else if (parseInt(arrV1[0]) == parseInt(vi[latestIndex-1].normal.version.split(".")[0]) &&
        cmpVersion(version, vi[latestIndex-1].normal.version) == -1) {
        return (suggestion[4]);
    } else if (parseInt(arrV1[0]) < parseInt(vi[latestIndex-1].normal.version.split(".")[0]) &&
        parseInt(arrV1[0]) >= 8 &&
        cmpVersion(version, vi[parseInt(arrV1[0]) - 5].normal.version) != -1) {
        return (suggestion[5]);
    } else if (parseInt(arrV1[0]) < parseInt(vi[latestIndex-1].normal.version.split(".")[0]) &&
        parseInt(arrV1[0]) >= 8 &&
        cmpVersion(version, vi[parseInt(arrV1[0]) - 5].normal.version) == -1) {
        return (suggestion[6]);
    } else if (parseInt(arrV1[0]) < 8 &&
        parseInt(arrV1[0]) >= 5 &&
        cmpVersion(version, vi[parseInt(arrV1[0]) - 5].normal.version) != -1) {
        return (suggestion[7]);
    } else if (parseInt(arrV1[0]) < 8 &&
        parseInt(arrV1[0]) >= 5 &&
        cmpVersion(version, vi[parseInt(arrV1[0]) - 5].normal.version) == -1) {
        return (suggestion[8]);
    } else if (parseInt(arrV1[0]) < 5) {
        return (suggestion[9]);
    }
}

// 判断是否为chrome内核浏览器
function isChromium(userAgent) {
    var chromium = "mozilla/&&applewebkit/&&chrome/&&safari/".split("&&");
    for (var i = 0; i < chromium.length; i++)
        if (userAgent.indexOf(chromium[i]) < 0)
            return false;
    return true;
}

// 判断是否为webkit内核浏览器
function isWebkit(userAgent) {
    if (userAgent.indexOf("applewebkit/") < 0)
        return false;
    return true;
}

// 检测到chrome内核浏览器时显示
function chromiumDisplay(userAgent) {
    var version = userAgent.match(/chrome\/([\d.]+)/)[1];

    var versionType = chromiumVersionType(version);
    var versionsObj = document.getElementById("version");
    var suggestionObj = document.getElementById("suggestion");
    var versionDate = chromiumVersionDate(version);
    var suggestion = chromiumVersionSuggestion(version);
    var versionNum = version.split(".")[0];

    versionsObj.innerHTML = "版本号:" + version + "<\/strong>" + versionType;
    if (versionNum >= 8 && versionType == "") {
        suggestionObj.innerHTML = versionDate + "
" + suggestion;
    } else {
        suggestionObj.innerHTML = versionDate + "
" + suggestion + "<\/span>";
        var versionDiv = document.getElementById("in");
        versionDiv.style.background = "#C49259";
        versionDiv.style.borderColor = "#C49259";
        document.getElementById("version").style.borderBottomColor = "#9b6A33";
        document.getElementById("tb").style.borderTopColor = "#D7B287";
    }
}

// 检测到webkit内核浏览器时显示
function webkitDisplay(userAgent) {
    var version = userAgent.match(/applewebkit\/([\d.]+)/)[1];
    var versionsObj = document.getElementById("version");
    versionsObj.innerHTML = "版本号:" + version + "<\/strong>";
    webkitVersionUrl = webkitVersionUrl.replace("%s", version);
    var suggestion = "您的浏览器使用了Webkit内核。点此查看<\/a>内核发布时间";
    var suggestionObj = document.getElementById("suggestion");
    suggestionObj.innerHTML = suggestion;
}

// 未检测到极速内核版本号时显示
function othersDisplay(userAgent) {
    var versionsObj = document.getElementById("version");
    versionsObj.innerHTML = "未能检测到极速内核版本号";
    var suggestionObj = document.getElementById("suggestion");
    suggestionObj.innerHTML = "请使用双核浏览器的极速模式或其他Chromium、Webkit内核浏览器进行检测。";
}


// 判断浏览器类型
function whatBrowser() {
    var userAgent = navigator.userAgent.toLowerCase();
    if (isChromium(userAgent)) {
        chromiumDisplay(userAgent);
    } else if (isWebkit(userAgent)) {
        webkitDisplay(userAgent);
    } else {
        othersDisplay(userAgent);
    }
}

你可能感兴趣的:(Javascript)