Comment détecter IE11?

Quand je veux détecter IE, j’utilise ce code:

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

Mais IE11 retourne “Vous n’utilisez pas Internet Explorer”. Comment puis-je le détecter?

IE11 n’est plus signalé comme MSIE , selon cette liste de modifications, il est intentionnel d’éviter les erreurs de détection.

Qu’est-ce que vous pouvez faire si vous voulez vraiment savoir que c’est IE est de détecter la chaîne Trident/ dans l’agent utilisateur si navigator.appName renvoie Netscape , quelque chose comme (le non testé);

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

Utilisez !(window.ActiveXObject) && "ActiveXObject" in window pour détecter explicitement IE11.

Pour détecter toute version d’IE (pré-Edge, “Trident”), utilisez "ActiveXObject" in window .

Utilisez MSInputMethodContext dans le cadre d’une vérification de la détection des fonctionnalités. Par exemple:

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

Les références

  • Objet MSInputMethodContext
  • API de l’éditeur de méthode d’entrée
  • Ce que j’aimerais voir dans IE12: Internet Explorer 12 Liste de corrections de bogues et nouvelles fonctionnalités
  • TypeScript / lib.dom.d.ts at master · API DOM Microsoft / TypeScript IE

J’ai lu vos réponses et fait un mélange. Il semble fonctionner avec Windows XP (IE7 / IE8) et Windows 7 (IE9 / IE10 / IE11).

 function ie_ver(){ var iev=0; var ieold = (/MSIE (\d+\.\d+);/.test(navigator.userAgent)); var sortingdent = !!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 (sortingdent&&rv!=-1) iev=11; return iev; } 

Bien sûr, si je retourne 0, cela signifie pas d’IE.

Obtenir la version IE de l’agent utilisateur

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

Fonctionnement: La chaîne de l’agent utilisateur pour toutes les versions d’IE comprend une partie ” Version de l’ espace MSIE” ou ” Version de l’ espace ou du colon RV -texte Trident autre texte “. Sachant cela, nous récupérons le numéro de version d’une expression régulière Ssortingng.match() . Un bloc try-catch est utilisé pour raccourcir le code, sinon nous devrons tester les limites du tableau pour les navigateurs non-IE.

Remarque: L’agent utilisateur peut être usurpé ou omis, parfois involontairement si l’utilisateur a défini son navigateur sur un “mode de compatibilité”. Bien que cela ne semble pas être un problème dans la pratique.


Obtenir la version IE sans l’agent utilisateur

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

Comment cela fonctionne: Chaque version d’IE ajoute la prise en charge des fonctionnalités supplémentaires non trouvées dans les versions précédentes. Nous pouvons donc tester les fonctionnalités de manière descendante. Une séquence ternaire est utilisée ici pour des raisons de concision, bien if-then instructions if-then et switch fonctionneraient aussi bien. La variable, ie à- ie un nombre entier compris entre 5 et 11, ou 1 pour les plus anciens ou 99 pour les plus récents / non-IE. Vous pouvez le définir à 0 si vous voulez simplement tester IE 1-11 exactement.

Remarque: La détection d’objects peut être interrompue si votre code est exécuté sur une page contenant des scripts tiers qui ajoutent des polyfills pour des choses telles que document.addEventListener . Dans de telles situations, l’agent utilisateur est la meilleure option.


Détecter si le navigateur est moderne

Si vous ne souhaitez que savoir si un navigateur prend en charge la plupart des standards HTML 5 et CSS 3, vous pouvez raisonnablement supposer que IE 8 et versions ultérieures restnt les principales applications problématiques. Tester pour window.getComputedStyle vous donnera également un assez bon mélange de navigateurs modernes (IE 9, FF 4, Chrome 11, Safari 5, Opera 11.5). IE 9 améliore considérablement la prise en charge des normes, mais l’animation CSS native nécessite IE 10.

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

Angular JS fait comme ça.

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

msie sera un nombre positif si son IE et NaN pour un autre navigateur comme chrome, firefox.

Pourquoi ?

À partir d’Internet Explorer 11, la chaîne de l’agent utilisateur a considérablement changé.

référez ceci:

msdn # 1 msdn # 2

Solution :

 function GetIEVersion() { var sAgent = window.navigator.userAgent; var Idx = sAgent.indexOf("MSIE"); // If IE, return version number. if (Idx > 0) return parseInt(sAgent.subssortingng(Idx+ 5, sAgent.indexOf(".", Idx))); // If IE 11 then look for Updated user agent ssortingng. 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 "); } 

J’utilise une méthode plus simple:

L’object global du navigateur a des points de contact de propriété, dans Internet, Exlorer 11 s’appelle msMaxTouchPoints tho.

Donc, si vous cherchez:

 navigator.msMaxTouchPoints !== void 0 

Vous trouverez Internet Explorer 11.

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

Essaye ça:

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

Cela semble être une meilleure méthode. “indexOf” renvoie -1 si rien ne correspond. Il ne remplace pas les classes existantes sur le corps, il suffit de les append.

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

Détecter la plupart des navigateurs avec ceci:

 var getBrowser = function(){ var navigatorObj = navigator.appName, userAgentObj = navigator.userAgent, matchVersion; var match = userAgentObj.match(/(opera|chrome|safari|firefox|msie|sortingdent)\/?\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

J’ai utilisé l’événement onscroll sur l’élément avec la barre de défilement. Lorsque déclenché dans IE, j’ai ajouté la validation suivante:

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

Seulement pour le navigateur 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; } } } 

utiliser l’alerte (c.-à-d.)

Essai:

 var browserVersionExplorer = (function() { var ie = 'NotIE', me = 'NotIE'; if (/msie\s|sortingdent\/|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); 

Franchement, je dirais que vous utilisez une bibliothèque qui fait ce dont vous avez besoin (comme platform.js par exemple). À un moment donné, les choses changeront et la bibliothèque sera équipée pour ces changements et l’parsing manuelle utilisant des expressions régulières échouera.

Dieu merci, IE s’en va …