仅针对IE浏览器和国内主流套壳浏览器进行判断,不对其他浏览器进行判断
IE判断说明:判断浏览器的目的在于根据不同的浏览器作出不同的后台响应,而最主要针对的无非是CSS样式代码,而IE浏览器坑很多,它同时具备文档模式和浏览器模式(用户代理字符串),IE浏览器的文档模式不同则其对应的渲染引擎不同,CSS样式的显示应该以渲染引擎为参考标准,而不是单纯以用户代理字符串为标准。
function browerType() {
var browerName = '其他浏览器';
var ua = navigator.userAgent.toLocaleLowerCase();
// 判断是否为IE(第一个是正常的IE,第二个是Edge,第三个是IE11)
var isIE = (ua.indexOf("compatible") > -1 && ua.indexOf("msie") > -1) || (ua.indexOf("edge") > -1) || (ua.indexOf('trident') > -1 && ua.indexOf("rv:11.0") > -1);
// 判断是否为IE5678,!+[1,] 在IE5678返回true,在IE9、IE10、IE11返回false
var isLteIE8 = isIE && !+[1,];
// 用于防止因通过IE8+的文档兼容性模式设置文档模式,导致版本判断失效
var dm = document.documentMode,
isIE5,
isIE6,
isIE7,
isIE8,
isIE9,
isIE10,
isIE11;
if (dm) {
isIE5 = dm === 5;
isIE6 = dm === 6;
isIE7 = dm === 7;
isIE8 = dm === 8;
isIE9 = dm === 9;
isIE10 = dm === 10;
isIE11 = dm === 11;
} else {
// 判断是否为IE5,IE5的文本模式为怪异模式(quirks),真实的IE5.5浏览器中没有document.compatMode属性
isIE5 = (isLteIE8 && (!document.compatMode || document.compatMode === 'BackCompat'));
// 判断是否为IE6,IE7开始有XMLHttpRequest对象
isIE6 = isLteIE8 && !isIE5 && !XMLHttpRequest;
// 判断是否为IE7,IE8开始有document.documentMode属性
isIE7 = isLteIE8 && !isIE6 && !document.documentMode;
// 判断是否IE8
isIE8 = isLteIE8 && document.documentMode;
// 判断IE9,IE9严格模式中函数内部this不为undefined
isIE9 = !isLteIE8 && (function () {
"use strict";
return !!this;
}());
// 判断IE10,IE10开始支持严格模式,严格模式中函数内部this为undefined
isIE10 = isIE && !!document.attachEvent && (function () {
"use strict";
return !this;
}());
// 判断IE11,IE11开始移除了attachEvent属性
isIE11 = isIE && !document.attachEvent;
};
// IE浏览器的判断
browerName = isIE5 ? 'IE5' :
isIE6 ? 'IE6' :
isIE7 ? 'IE7' :
isIE8 ? 'IE8' :
isIE9 ? 'IE9' :
isIE10 ? 'IE10' :
isIE11 ? 'IE11' :
// 国内套壳浏览器判断
(ua.indexOf('qqbrowser') > -1) ? 'QQ浏览器' :
// 先判断QQ浏览器再判断搜狗浏览器,因为QQ浏览器也有'se'
(ua.indexOf('se') > -1) ? '搜狗浏览器' :
(ua.indexOf('aoyou') > -1) ? '遨游浏览器' :
(ua.indexOf('theworld') > -1) ? '世界之窗浏览器' :
(ua.indexOf('worldchrome') > -1) ? '世界之窗极速浏览器' :
(ua.indexOf('greenbrowser') > -1) ? '绿色浏览器' :
(ua.indexOf('baidu') > -1) ? '百度浏览器' :
// 360浏览器判断的特殊方法,打开新页原来的'360'字符串代理已经不显示,方法失效,同时也要晚于搜狗浏览器判断,不然搜狗会被认为360浏览器
(window.navigator.mimeTypes[40] || !window.navigator.mimeTypes.length) ? '360浏览器' : '其他浏览器';
console.log(browerName);
}
注:针对IE浏览器的文档模式和浏览器模式,这里作出一定的区别解释。
- 浏览器模式
“浏览器模式”用于切换IE针对该网页的默认文档模式、对不同版本浏览器的条件备注解析、发送给网站服务器的用户代理(User-Agent)字符串的值。网站可以根据浏览器返回的不同用户代理字符串判断浏览器的版本和安装的功能,这样就可以向不同的浏览器返回不同的页面内容。 默认情况下,IE8的浏览器模式为IE8。用户可以通过单击地址栏旁边的兼容性视图按钮来手动切换到不同的浏览器模式。在IE8中,IE8兼容性视图会以IE7文档模式来显示网页,同时会向服务器发送IE7的用户代理字符串。 - 文档模式
“文档模式”用于指定IE的页面排版引擎(Trident)以哪个版本的方式来解析并渲染网页代码。切换文档模式会导致网页被刷新,但不会更改用户代理字符串中的版本号,也不会从服务器重新下载网页。切换浏览器模式的同时,浏览器也会自动切换到相应的文档模式。