如何检测IE11?

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

14 Solutions collect form web for “如何检测IE11?”

IE11不再作为MSIE报告,根据这一列表的变化 ,有意避免误检。

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

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

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

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

为了检测任何IE(“Edge”,“Trident”)版本,请使用"ActiveXObject" in window

使用MSInputMethodContext作为功​​能检测检查的一部分。 例如:

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

参考

  • MSInputMethodContext对象
  • input法编辑器API
  • 我想在IE12中看到:Internet Explorer 12 Bug修复和新function的愿望清单
  • 在主·Microsoft / TypeScript IE DOM API的TypeScript / lib.dom.d.ts

我已经读了你的答案,并做了一个混合。 它似乎与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。

从用户代理获取IE版本

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

工作原理: 所有IE版本的用户代理string包含“MSIE 空间 版本 ”或“Trident other-text rv 空格或冒号 版本 ”部分。 知道这一点,我们从String.match()正则expression式中获取版本号。 try-catch块用于缩短代码,否则我们需要testing非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的每个版本都增加了对以前版本中没有的附加function的支持。 所以我们可以自上而下的方式testing这些function。 三元序列在这里使用简洁,虽然if-thenswitch语句也可以工作。 variablesie被设置为5-11的整数,或者对于较老的设置为1,对于较新/非IE设置为99。 如果您只是想精确testingIE 1-11,您可以将其设置为0。

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


检测浏览器是否是现代的

如果您只关心浏览器是否支持大多数HTML 5和CSS 3标准,那么可以合理地假设 IE 8及更低版本仍然是主要的问题应用程序。 testingwindow.getComputedStyle会给你一个相当不错的现代浏览器组合(IE 9,FF 4,Chrome 11,Safari 5,Opera 11.5)。 IE 9大大提高了对标准的支持,但本机CSSanimation需要IE 10。

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

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开始,用户代理string发生了显着变化。

请参阅:

msdn#1 msdn#2

scheme:

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

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

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

所以,如果你寻找:

 navigator.msMaxTouchPoints !== void 0 

你会发现Internet Explorer 11。

 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; 

尝试这个:

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

这似乎是一个更好的方法。 如果没有匹配,“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'; } 

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

 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

仅适用于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; } } } 

使用警报(ie);

testing:

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

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

 onscroll="if (document.activeElement==this) ignoreHideOptions()" 
  • 如何在IE11中带回“浏览器模式”?
  • 柔性容器中的文本不包装在IE11中
  • 在Windows 7上的IE11中损坏的JavaScript localStorage对象
  • Internet Explorer 9,10和11事件构造函数不起作用
  • 如何将IE11文档模式设置为默认边缘?