当我想检测IE时,我使用以下代码:

function getInternetExplorerVersion()
{
  var rv = -1;
  if (navigator.appName == 'Microsoft Internet Explorer')
  {
    var ua = navigator.userAgent;
    var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  return rv;
}
function checkVersion()
{
  var msg = "You're not using Internet Explorer.";
  var ver = getInternetExplorerVersion();

  if ( ver > -1 )
  {
    msg = "You are using IE " + ver;
  }
  alert( msg );
}

但是IE11返回“您没有使用Internet Explorer”。我如何检测它?


当前回答

从User-Agent获取IE版本

var ie = 0;
try { ie = navigator.userAgent.match( /(MSIE |Trident.*rv[ :])([0-9]+)/ )[ 2 ]; }
catch(e){}

工作原理:所有IE版本的用户代理字符串都包含一部分“MSIE空间版本”或“Trident其他文本rv空格或冒号版本”。知道了这一点,我们从String.match()正则表达式中获取版本号。try-catch块用于缩短代码,否则我们需要测试非ie浏览器的数组边界。

注意:如果用户将浏览器设置为“兼容模式”,用户代理可能会被欺骗或省略,有时是无意的。尽管这在实践中似乎不是什么大问题。


获取没有User-Agent的IE版本

var d = document, w = window;
var ie = ( !!w.MSInputMethodContext ? 11 : !d.all ? 99 : w.atob ? 10 : 
d.addEventListener ? 9 : d.querySelector ? 8 : w.XMLHttpRequest ? 7 : 
d.compatMode ? 6 : w.attachEvent ? 5 : 1 );

工作原理:每个版本的IE都增加了对以前版本中没有的额外功能的支持。因此,我们可以以自顶向下的方式测试特性。为了简洁起见,这里使用了三元序列,不过if-then和switch语句也同样有效。变量ie被设置为整数5-11,旧的为1,新/非ie为99。如果你只是想测试IE 1-11,你可以把它设置为0。

注意:如果您的代码运行在带有第三方脚本的页面上,这些脚本为document.addEventListener之类的东西添加了腻子,那么对象检测可能会中断。在这种情况下,用户代理是最好的选择。


检测浏览器是否是现代的

如果你只对浏览器是否支持大多数HTML 5和css3标准感兴趣,你可以合理地假设ie8及更低版本的应用程序仍然是主要的问题应用程序。测试窗口。getComputedStyle会给你一个相当好的现代浏览器的组合,以及(IE 9, FF 4, Chrome 11, Safari 5, Opera 11.5)。IE 9大大提高了对标准的支持,但原生CSS动画需要IE 10。

var isModernBrowser = ( !document.all || ( document.all && document.addEventListener ) ); 

其他回答

使用DetectOS.js。这是一个简单的JS定义,适用于没有依赖关系的流行操作系统和浏览器:

class DetectOS { constructor() { this.browser = this.searchString(this.dataBrowser()) this.version = this.searchVersion(navigator.userAgent) || this.searchVersion(navigator.appVersion) this.OS = this.searchString(this.dataOS()) } searchString(data) { for (let i = 0; i < data.length; i++) { let dataString = data[i].string, dataProp = data[i].prop this.versionSearchString = data[i].versionSearch || data[i].identity if (dataString) { if (dataString.indexOf(data[i].subString) !== -1) { return data[i].identity } } else if (dataProp) { return data[i].identity } } } searchVersion(dataString) { let index = dataString.indexOf(this.versionSearchString) if (index === -1) return return parseFloat(dataString.substring(index+this.versionSearchString.length + 1)) } dataBrowser() { return [ /*************** * Chrome ***************/ { string: navigator.userAgent, subString: "Chrome", identity: "Chrome" }, /*************** * Safari ***************/ { string: navigator.vendor, subString: "Apple", identity: "Safari", versionSearch: "Version" }, /*************** * For Older Opera (12.18-) ***************/ { prop: window.opera, identity: "Opera", versionSearch: "Version" }, /*************** * Internet Explorer 10 ***************/ { string: navigator.userAgent, subString: "MSIE", identity: "IE10", versionSearch: "MSIE" }, /*************** * Internet Explorer 11 ***************/ { string: navigator.userAgent, subString: "Trident", identity: "IE11", versionSearch: "rv" }, /*************** * Edge ***************/ { string: navigator.userAgent, subString: "Edge", identity: "Edge", versionSearch: "Edge" }, /*************** * Firefox ***************/ { string: navigator.userAgent, subString: "Firefox", identity: "Firefox" }, { string: navigator.userAgent, subString: "Gecko", identity: "Mozilla", versionSearch: "rv" }, /*************** * For Older Netscapes (4-) ***************/ { string: navigator.userAgent, subString: "Mozilla", identity: "Netscape", versionSearch: "Mozilla" }, /*************** * For Newer Netscapes (6+) ***************/ { string: navigator.userAgent, subString: "Netscape", identity: "Netscape" }, /*************** * Other Browsers ***************/ { string: navigator.userAgent, subString: "OmniWeb", versionSearch: "OmniWeb/", identity: "OmniWeb" }, { string: navigator.vendor, subString: "iCab", identity: "iCab" }, { string: navigator.vendor, subString: "KDE", identity: "Konqueror" }, { string: navigator.vendor, subString: "Camino", identity: "Camino" } ] } dataOS() { return [ { string: navigator.platform, subString: 'Win', identity: 'Windows' }, { string: navigator.platform, subString: 'Mac', identity: 'macOS' }, { string: navigator.userAgent, subString: 'iPhone', identity: 'iOS' }, { string: navigator.userAgent, subString: 'iPad', identity: 'iOS' }, { string: navigator.userAgent, subString: 'iPod', identity: 'iOS' }, { string: navigator.userAgent, subString: 'Android', identity: 'Android' }, { string: navigator.platform, subString: 'Linux', identity: 'Linux' } ] } } const Detect = new DetectOS() console.log("We know your browser – it's " + Detect.browser + " " + Detect.version); console.log("We know your OS – it's " + Detect.OS); console.log("We know everything about you.");

Angular JS就是这样做的。

msie = parseInt((/msie (\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);
if (isNaN(msie)) {
  msie = parseInt((/trident\/.*; rv:(\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);
}

msie将是正数,如果它的IE和NaN为其他浏览器,如chrome,firefox。

为什么?

从Internet Explorer 11开始,用户代理字符串发生了重大变化。

参考这个:

msdn # 1 msdn # 2

从User-Agent获取IE版本

var ie = 0;
try { ie = navigator.userAgent.match( /(MSIE |Trident.*rv[ :])([0-9]+)/ )[ 2 ]; }
catch(e){}

工作原理:所有IE版本的用户代理字符串都包含一部分“MSIE空间版本”或“Trident其他文本rv空格或冒号版本”。知道了这一点,我们从String.match()正则表达式中获取版本号。try-catch块用于缩短代码,否则我们需要测试非ie浏览器的数组边界。

注意:如果用户将浏览器设置为“兼容模式”,用户代理可能会被欺骗或省略,有时是无意的。尽管这在实践中似乎不是什么大问题。


获取没有User-Agent的IE版本

var d = document, w = window;
var ie = ( !!w.MSInputMethodContext ? 11 : !d.all ? 99 : w.atob ? 10 : 
d.addEventListener ? 9 : d.querySelector ? 8 : w.XMLHttpRequest ? 7 : 
d.compatMode ? 6 : w.attachEvent ? 5 : 1 );

工作原理:每个版本的IE都增加了对以前版本中没有的额外功能的支持。因此,我们可以以自顶向下的方式测试特性。为了简洁起见,这里使用了三元序列,不过if-then和switch语句也同样有效。变量ie被设置为整数5-11,旧的为1,新/非ie为99。如果你只是想测试IE 1-11,你可以把它设置为0。

注意:如果您的代码运行在带有第三方脚本的页面上,这些脚本为document.addEventListener之类的东西添加了腻子,那么对象检测可能会中断。在这种情况下,用户代理是最好的选择。


检测浏览器是否是现代的

如果你只对浏览器是否支持大多数HTML 5和css3标准感兴趣,你可以合理地假设ie8及更低版本的应用程序仍然是主要的问题应用程序。测试窗口。getComputedStyle会给你一个相当好的现代浏览器的组合,以及(IE 9, FF 4, Chrome 11, Safari 5, Opera 11.5)。IE 9大大提高了对标准的支持,但原生CSS动画需要IE 10。

var isModernBrowser = ( !document.all || ( document.all && document.addEventListener ) ); 

在window中使用!(window.ActiveXObject) && "ActiveXObject"显式检测IE11。

要检测任何IE (pre-Edge,“Trident”)版本,在窗口中使用“ActiveXObject”代替。

用这个检测大多数浏览器:

var getBrowser = function(){
  var navigatorObj = navigator.appName,
      userAgentObj = navigator.userAgent,
      matchVersion;
  var match = userAgentObj.match(/(opera|chrome|safari|firefox|msie|trident)\/?\s*(\.?\d+(\.\d+)*)/i);
  if( match && (matchVersion = userAgentObj.match(/version\/([\.\d]+)/i)) !== null) match[2] = matchVersion[1];
  //mobile
  if (navigator.userAgent.match(/iPhone|Android|webOS|iPad/i)) {
    return match ? [match[1], match[2], mobile] : [navigatorObj, navigator.appVersion, mobile];
  }
  // web browser
  return match ? [match[1], match[2]] : [navigatorObj, navigator.appVersion, '-?'];
};

https://gist.github.com/earlonrails/5266945