如何检测IE11?

207 debugging internet-explorer browser-detection forward-compatibility internet-explorer-11

当我想检测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 );
}
Run Code Online (Sandbox Code Playgroud)

但IE11正在返回"你没有使用Internet Explorer".我该如何检测它?

Joa*_*son 218

IE11不再报告MSIE,根据此更改列表,它有意避免错误检测.

如果你真的想知道它是什么你可以做IE是检测Trident/用户代理中的字符串,如果navigator.appName返回Netscape,像(未经测试);

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 );
  }
  else if (navigator.appName == 'Netscape')
  {
    var ua = navigator.userAgent;
    var re  = new RegExp("Trident/.*rv:([0-9]{1,}[\\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  return rv;
}

console.log('IE version:', getInternetExplorerVersion());
Run Code Online (Sandbox Code Playgroud)

请注意,IE11(afaik)仍处于预览状态,用户代理可能会在发布前更改.

  • "这是故意避免错误检测" - 遗憾的是,现在IE11已经发布了,我们的代码在_only_ IE11中被破坏了,而IE的正确检测会起作用...... (80认同)
  • 如果版本不太重要,我将此解决方案转换为布尔值`function isIE(){return((navigator.appName =='Microsoft Internet Explorer')||((navigator.appName =='Netscape')&&(new RegExp ("Trident /.*rv:([0-9] {1,} [\.0-9] {0,})").exec(navigator.userAgent)!= null))); }` (68认同)
  • 这对我有用:`var isIE11 = !! navigator.userAgent.match(/ Trident\/ 7\./);`[来源](http://stackoverflow.com/a/17447718/1066234) (15认同)
  • "他们这样做的原因是故意的.他们想破坏像这样的浏览器检测脚本." 从http://stackoverflow.com/a/18872067/1066234 ...其实它应该是:"他们想让十亿网站打破这个样子." (11认同)
  • @lzkata - 根据[html5规范](http://www.w3.org/html/wg/drafts/html/master/webappapis.html#navigator),IE实际上遵循标准.所以是的,它是有意的,但它符合新标准(弃用旧的HTML API). (6认同)

mcw*_*933 85

用于!(window.ActiveXObject) && "ActiveXObject" in window显式检测IE11.

要检测任何IE(pre-Edge,"Trident")版本,请"ActiveXObject" in window改用.

  • @Neo Edge不是IE,OP的问题是如何检测IE11 (7认同)
  • 实际上,本文描述了我的方法工作的原因.试图访问`window.ActiveXObject`,如文中所述,现在在IE11中返回`undefined`(以及非Microsoft浏览器.)使用javascript`in`运算符的测试在所有Microsoft浏览器中返回`true`,所以两者都是IE11严格的情况.如果Microsoft对`in`运算符的行为发出更改,是的,此方法将中断. (4认同)
  • 窗口中的"ActiveXObject"在Edge中返回False. (4认同)
  • 这篇微软文章表明这​​个解决方案可能不再起作用http://msdn.microsoft.com/en-us/library/ie/dn423948(v=vs.85).aspx (2认同)

Pau*_*tte 43

使用MSInputMethodContext为特征检测检查的一部分.例如:

//Appends true for IE11, false otherwise
window.location.hash = !!window.MSInputMethodContext && !!document.documentMode;
Run Code Online (Sandbox Code Playgroud)

参考

  • 在我看来,这似乎更强大.当然,任何基于用户代理的东西都是无用的. (2认同)
  • 刚刚在非 IE、IE8、9、10、Edge 14、15 中确认了 `#false`。`#true` 仅在 IE11 中。未在文档模式激活时进行测试。使用 Browserstack 测试。 (2认同)

Fab*_*bio 15

我已经阅读了你的答案并进行了混合.它似乎适用于Windows XP(IE7/IE8)和Windows 7(IE9/IE10/IE11).

function ie_ver(){  
    var iev=0;
    var ieold = (/MSIE (\d+\.\d+);/.test(navigator.userAgent));
    var trident = !!navigator.userAgent.match(/Trident\/7.0/);
    var rv=navigator.userAgent.indexOf("rv:11.0");

    if (ieold) iev=new Number(RegExp.$1);
    if (navigator.appVersion.indexOf("MSIE 10") != -1) iev=10;
    if (trident&&rv!=-1) iev=11;

    return iev;         
}
Run Code Online (Sandbox Code Playgroud)

当然,如果我返回0,则表示没有IE.


Bee*_*jor 12

从User-Agent获取IE版本

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

工作原理:所有IE版本的用户代理字符串包括"MSIE 空间 版本 "或"Trident other-text rv space-or-colon version "部分.知道这一点,我们从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 );
Run Code Online (Sandbox Code Playgroud)

工作原理:每个版本的IE都增加了对以前版本中没有的其他功能的支持.因此,我们可以自上而下的方式测试功能.一个三元序列在这里用于简洁,虽然if-thenswitch声明将工作一样好.变量ie设置为整数5-11,对于较旧的设置为1,对于较新/非IE,设置为99.如果您只想准确测试IE 1-11,可以将其设置为0.

注意:如果您的代码在包含第三方脚本的页面上运行,对象检测可能会中断document.addEventListener.在这种情况下,用户代理是最佳选择.


检测浏览器是否为现代

如果您只对浏览器是否支持大多数HTML 5和CSS 3标准感兴趣,您可以合理地假设 IE 8及更低版本仍然是主要的问题应用程序.测试window.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 ) ); 
Run Code Online (Sandbox Code Playgroud)


Vis*_*rma 9

Angular JS就是这样做的.

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

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

为什么?

从Internet Explorer 11开始,用户代理字符串发生了显着变化.

请参考:

msdn#1 msdn#2


小智 7

方案:

function GetIEVersion() {
  var sAgent = window.navigator.userAgent;
  var Idx = sAgent.indexOf("MSIE");
  // If IE, return version number.
  if (Idx > 0)
    return parseInt(sAgent.substring(Idx+ 5, sAgent.indexOf(".", Idx)));

  // If IE 11 then look for Updated user agent string.
  else if (!!navigator.userAgent.match(/Trident\/7\./))
    return 11;

  else
    return 0; //It is not IE

}
if ((GetIEVersion() > 0) || (navigator.userAgent.toLowerCase().indexOf('firefox') > -1)){
  alert("This is IE " + GetIEVersion());
}else {
  alert("This no is IE ");
}		
Run Code Online (Sandbox Code Playgroud)