如何检测IE11?


212

当我想检测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”。如何检测到它?



1
任何基于用户代理的东西都是有缺陷的。欺骗很容易,现在,这可能不是问题,但是在我看来,浏览器检测脚本应该有很大的机会检测伪装。我使用了条件注释的组合,尝试强制使用document.documentMode,然后按照下面的Paul Sweatte的方法查看window.MSInputMethodContext。我会发布我的代码,但它正在鞭策一匹死马。
David G

3
IE11具有用户代理:Mozilla / 5.0(Windows NT 6.1; WOW64; Trident / 7.0; rv:11.0),如Gecko Os类型:6.1-win7,6.3
razor


1
这是我找到的最佳解决方案:stackoverflow.com/a/20201867/2047385 if(Object.hasOwnProperty.call(window,“ ActiveXObject”)&&!window.ActiveXObject){//是IE11}
xorcus 2015年

Answers:


221

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());

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


81
it's intentional to avoid mis-detection-可悲的是,现在IE11已发布,我们只有 IE11 才能破解代码,而对IE进行正确的检测就可以了……
Izkata

68
如果版本不那么重要,我将此解决方案转换为布尔值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))); }
rg89 2013年

6
@lzkata-根据此处html5规范,IE实际上遵循该标准。所以,是的,这是故意的,但它是按新标准(弃用旧HTML API)
马克Avenius

11
“这样做的原因是有意的。他们想破坏这样的浏览器检测脚本。” 来自stackoverflow.com/a/18872067/1066234 ...实际上应该是:“他们希望使十亿个网站这样破裂。”
Kai Noack

15
这对我var isIE11 = !!navigator.userAgent.match(/Trident\/7\./);
有用

86

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

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


2
Microsoft的这篇文章建议此解决方案可能不再起作用msdn.microsoft.com/en-us/library/ie/dn423948(v=vs.85).aspx
Alan

5
实际上,本文描述了我的方法可行的原因。window.ActiveXObject如文章中所述,尝试访问undefined现在会在IE11(以及非Microsoft浏览器)中in返回。使用javascript 运算符的测试会true在所有Microsoft浏览器中返回,因此在IE11中都是严格的情况。如果Microsoft更改了in操作员的行为,是的,此方法将中断。
mcw

5
窗口中的“ ActiveXObject”在Edge中返回False。

8
@Neo Edge不是IE,OP的问题是如何检测IE11
mastazi '16

1
@mastazi是的,但是在此答案中,提到可以将ActiveXObject用于检测任何IE版本。Edge是否应该被称为IE的版本是有争议的(微软肯定不希望将其称为IE),但是对于许多开发人员来说,IE成为任何默认Microsoft浏览器的代名词。
2016年

45

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

//Appends true for IE11, false otherwise
window.location.hash = !!window.MSInputMethodContext && !!document.documentMode;

参考资料


2
在我看来,这更可靠。当然,任何基于用户代理的东西都是毫无用处的。
David G

1
那代替了ActiveXObject是可行的。非常感谢
塔里克欧扎贡棍儿

1
@tdakhla已更新,以过滤掉IE Edge。
Paul Sweatte

对于可能似乎无法使用的所有答案,需要注意的重要一点是检查“仿真”设置,我要将此答案标记为不正确,但随后我检查了仿真,发现某些Intranet兼容性设置已覆盖了显示模式。 ,一旦从等式中删除了该解决方案,对我来说就很好了。
肖恩

1
刚刚#false在非IE,IE8、9、10,Edge 14,15中得到确认。#true仅在IE11中。未在激活文档模式的情况下进行测试。经过Browserstack测试。
danjah

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;         
}

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


12

从用户代理获取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浏览器。

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


在没有用户代理的情况下获取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-thenswitch声明将工作一样好。该变量ie设置为5-11的整数,对于较旧的变量设置为1,对于较新的/非IE 变量设置为99。如果只想测试IE 1-11,则可以将其设置为0。

注意:如果您的代码在带有第三方脚本的页面上运行,则对象检测可能会中断,这些脚本为诸如的内容添加了polyfills 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 ) ); 

“从用户代理获取IE版本”效果很好!可以肯定的是,它将显示包括IE11在内的所有版本?
omer

1
@omer是的,因为它寻找字符串“ MSIE”或“ Trident”;IE 11及更高版本使用后者。因此,它将适用于所有将来的IE版本,直到MS更改其浏览器引擎的名称为止。我相信新的Edge浏览器仍然使用Trident。
Beejor 2015年

效果很好,谢谢@Beejor!我使用您的答案实现了到其他页面的简单重定向: var ie = 0; try { ie = navigator.userAgent.match( /(MSIE |Trident.*rv[ :])([0-9]+)/ )[ 2 ]; } catch(e){} if (ie !== 0) { location.href = "../ie-redirect/redirect.html"; }
BernardV

@BernardV看起来不错!快速提示:如果您有权访问服务器,则在脚本中检测用户代理可能会更好,因为用户不会注意到任何重定向/闪烁,HTTP请求减少等。 JS也可以。
Beejor

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]);
}

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

为什么呢?

从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 ");
}		


1
我最喜欢的-占IE6-10和IE11。我在边检查添加,以及
AlbatrossCafe

This is IE 0
会将

3

我正在使用一种更简单的方法:

导航器全局对象具有属性接触点,在Internet Exlorer 11中称为msMaxTouchPoints。

因此,如果您寻找:

navigator.msMaxTouchPoints !== void 0 

您会发现Internet Explorer 11。


1
它还会在IE 10(Win 7)上返回trun
Chemical Programmer

2
var ua = navigator.userAgent.toString().toLowerCase();
var match = /(trident)(?:.*rv:([\w.]+))?/.exec(ua) ||/(msie) ([\w.]+)/.exec(ua)||['',null,-1];
var rv = match[2];
return rv;

如果使用正则表达式进行检查,则可以添加i标志以使其不区分大小写,而不是.toLowerCase()。也不需要.toString()方法。
杰克·罗塞尔2015年

2

试试这个:

var trident = !!navigator.userAgent.match(/Trident\/7.0/);
var net = !!navigator.userAgent.match(/.NET4.0E/);
var IE11 = trident && net
var IEold = ( navigator.userAgent.match(/MSIE/i) ? true : false );
if(IE11 || IEold){
alert("IE")
}else{
alert("Other")
}

代码错误,因为Acoo浏览器在useragent中使用“ MSIE”。查看useragentstring.com/pages/Acoo%20Browser
用户

错误的论点。我已经在所有IE浏览器(甚至是Win8设备)上进行了测试。
Krunal 2014年

您测试了IE11浏览器,但未测试Acoo浏览器,并且Acoo浏览器在用户代理中使用了“ MSIE”,就像我说的那样,因此IEold也将Acoo浏览器检测为IEold(IE的旧版本),并且我确定Acoo浏览器使用了“用户代理中的“ MSIE”,因为我已经使用Acoo浏览器在JavaScript测试网站上做了navigator.userAgent(测试网站:w3schools.com
用户

您能为此提供更好的解决方案吗?
2014年

U可以使用,!navigator.userAgent.match("Acoo Browser;") && navigator.userAgent.match(/MSIE/i) ? true : false但是并不总是有效,因为acoo浏览器并不总是具有“ Acoo Browser”;在其用户代理中,但实际上您不必关心acoo浏览器的用户代理中是否包含“ MSIE”,因为acoo浏览器几乎是相同的。
用户

1

这似乎是一个更好的方法。如果没有匹配项,“ indexOf”返回-1。它不会覆盖主体上的现有类,而只是添加它们。

// add a class on the body ie IE 10/11
var uA = navigator.userAgent;
if(uA.indexOf('Trident') != -1 && uA.indexOf('rv:11') != -1){
    document.body.className = document.body.className+' ie11';
}
if(uA.indexOf('Trident') != -1 && uA.indexOf('MSIE 10.0') != -1){
    document.body.className = document.body.className+' ie10';
}

0

使用此检测大多数浏览器:

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


0

onscroll在滚动条的元素上使用了该事件。在IE中触发时,我添加了以下验证:

onscroll="if (document.activeElement==this) ignoreHideOptions()"

0

仅适用于IE浏览器:

var ie = 'NotIE'; //IE5-11, Edge+
    if( !!document.compatMode ) {
        if( !("ActiveXObject" in window) ) ) ie = 'EDGE';
        if( !!document.uniqueID){
            if('ActiveXObject' in window && !window.createPopup ){ ie = 11; }
            else if(!!document.all){
                    if(!!window.atob){ie = 10;}
                    else if(!!document.addEventListener) {ie = 9;}
                    else if(!!document.querySelector){ie = 8;}
                    else if(!!window.XMLHttpRequest){ie = 7;}
                    else if(!!document.compatMode){ie = 6;}
                    else ie = 5;
                }
        }
    }

使用警报

测试:

var browserVersionExplorer = (function() {
    var ie = '<s>NotIE</s>',
        me = '<s>NotIE</s>';

    if (/msie\s|trident\/|edge\//i.test(window.navigator.userAgent) && !!(document.documentMode || document.uniqueID || window.ActiveXObject || window.MSInputMethodContext)) {
            if (!!window.MSInputMethodContext) {
                ie = !("ActiveXObject" in window) ? 'EDGE' : 11;
            } else if (!!document.uniqueID) {
                if (!!(window.ActiveXObject && document.all)) {
                    if (document.compatMode == "CSS1Compat" && !!window.DOMParser ) {
                        ie = !!window.XMLHttpRequest ? 7 : 6;
                    } else {
                        ie = !!(window.createPopup && document.getElementById) ? parseFloat('5.5') : 5;
                    }
                    if (!!document.documentMode && !!document.querySelector ) {
                        ie = !!(window.atob && window.matchMedia) ? 10 : ( !!document.addEventListener ? 9 : 8);
                    }
                } else ie = !!document.all ? 4 : (!!window.navigator ? 3 : 2);
            }
        }
        
    return ie > 1 ? 'IE ' + ie : ie;
})();

 alert(browserVersionExplorer);

更新2017年6月1日

现在我们可以使用更简单的方法:

var uA = window.navigator.userAgent,
    onlyIEorEdge = /msie\s|trident\/|edge\//i.test(uA) && !!( document.uniqueID || window.MSInputMethodContext),
    checkVersion = (onlyIEorEdge && +(/(edge\/|rv:|msie\s)([\d.]+)/i.exec(uA)[2])) || NaN;

在哪里可以找到添加到Edge新版本的新标准全局对象?我推断Math.acosh就是其中之一。
j4v1

1
Microsoft Edge(Edge浏览器)仅支持@ j4v1 Math.acosh。参考:msdn.microsoft.com/en-us/en-en/library/dn858239(v=vs.94).aspx
James Peter

这种方法对我停止了工作。过去,它可以正确检测到IE11,但现在我在Windows 10 Enterprise(1607版,操作系统内部版本14393.1198)上运行的Internet Explorer版本11.1198.14393.0(更新版本11.0.42(KB4018271))运行中,数学似乎支持acosh方法。
Thijs

@Thijs在具有IE11 v 11.1198.14393.0的Windows 10教育版中,我已成功测试。您应该根据ES6尝试另一个数学函数。
詹姆斯·彼得

@JamesPeter我已经检查了document.documentMode。这似乎是检查IE11或Edge的更可靠的属性。IE11中存在documentMode,但Edge中不再存在。
Thijs

0

坦率地说,我会说使用可以满足您需求的库(例如,platform.js)。在某些时候,事情将会改变,并且库将为这些改变做好准备,并且使用正则表达式进行手动解析将失败。

谢天谢地IE消失了...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.