Comment détecter IE11?

212

Lorsque 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 renvoie "Vous n'utilisez pas Internet Explorer". Comment puis-je le détecter?

Paul Sweatte
la source
1
Tout ce qui est basé sur l'agent utilisateur est défectueux. C'est trop facile à usurper, maintenant, il se peut que ce ne soit pas un problème, mais il me semble qu'un script de détection de navigateur devrait avoir une bonne chance de détecter le masquage. J'utilise une combinaison de commentaires conditionnels, j'essaye de forcer le document.documentMode, puis je regarde window.MSInputMethodContext selon Paul Sweatte ci-dessous. Je posterais mon code mais ça fouette un cheval mort.
David G
3
IE11 a un agent utilisateur: Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; rv: 11.0) comme les types Gecko Os: 6.1 - win7, 6.3 - win81
rasoir
1
voir ma réponse ici stackoverflow.com/questions/21825157/…
Royi Namir
1
voici la meilleure solution que j'ai trouvée: stackoverflow.com/a/20201867/2047385 if (Object.hasOwnProperty.call (window, "ActiveXObject") &&! window.ActiveXObject) {// is IE11}
xorcus

Réponses:

221

IE11 ne rapporte plus car MSIE, selon cette liste de modifications il est intentionnel d'éviter toute détection erronée.

Ce que vous pouvez faire si vous voulez vraiment savoir que c'est IE, c'est détecter la Trident/chaîne dans l'agent utilisateur si navigator.appNameretourne 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());

Notez que IE11 (afaik) est toujours en prévisualisation et l'agent utilisateur peut changer avant la sortie.

Joachim Isaksson
la source
81
it's intentional to avoid mis-detection- Malheureusement, maintenant que IE11 est libéré, nous avons un code qui est cassé en seulement IE11, alors qu'une détection correcte de IE aurait travaillé ...
Izkata
68
J'ai converti cette solution en booléen si la version est moins importantefunction 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
6
@lzkata - Selon la spécification html5 ici , IE suit en fait la norme. Alors oui, c'est intentionnel, mais c'est selon la nouvelle norme (obsolète l'ancienne API html.)
Mark Avenius
11
"La raison pour laquelle ils ont fait cela était délibérée. Ils voulaient casser des scripts de détection de navigateur comme celui-ci." de stackoverflow.com/a/18872067/1066234 ... En fait, cela devrait être: "Ils voulaient faire éclater des milliards de sites Web comme ça."
Kai Noack
15
Cela fonctionne pour moi: var isIE11 = !!navigator.userAgent.match(/Trident\/7\./); source
Kai Noack
86

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

Pour détecter toute version d'IE (pré-Edge, "Trident"), utilisez "ActiveXObject" in windowplutôt.

mcw
la source
2
Cet article de Microsoft suggère que cette solution peut ne plus fonctionner. Msdn.microsoft.com/en-us/library/ie/dn423948(v=vs.85).aspx
Alan
5
En fait, cet article décrit la raison pour laquelle ma méthode fonctionne. Tenter d'accéder window.ActiveXObject, comme décrit dans l'article, renvoie undefinedmaintenant dans IE11 (ainsi que les navigateurs non Microsoft.) Le test utilisant l' inopérateur javascript renvoie truedans tous les navigateurs Microsoft, donc les deux sont strictement le cas dans IE11. Si Microsoft émet une modification du comportement de l' inopérateur, oui, cette méthode sera interrompue.
mcw
5
"ActiveXObject" dans la fenêtre renvoie False dans Edge.
Neo
8
@Neo Edge n'est pas IE, la question du PO était de savoir comment détecter IE11
mastazi
1
@mastazi oui mais dans cette réponse, il est mentionné que ActiveXObject peut être utilisé pour détecter n'importe quelle version d'IE. Il est cependant discutable que Edge soit appelé ou non une version d'IE (Microsoft ne veut sûrement pas l'appeler), mais pour de nombreux développeurs, IE est devenu le synonyme de tout navigateur Microsoft par défaut.
Neo
45

À utiliser MSInputMethodContextdans le cadre d'une vérification de détection de fonctionnalité. Par exemple:

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

Références

Paul Sweatte
la source
2
Cela me semble plus robuste. Certes, tout ce qui est basé sur l'agent utilisateur est assez inutile.
David G
1
Cela a fonctionné au lieu d'ActiveXObject. Merci beaucoup
Tarık Özgün Güner
1
@tdakhla Mis à jour pour filtrer IE Edge.
Paul Sweatte
Il est important de noter que pour toutes ces réponses qui pourraient sembler ne pas fonctionner, il faut vérifier les paramètres d'émulation, j'allais marquer cette réponse comme incorrecte, mais j'ai vérifié l'émulation et j'ai vu que certains paramètres de compatibilité intranet remplaçaient le mode d'affichage , une fois que cela a été retiré de l'équation, cette solution a bien fonctionné pour moi.
Shaun
1
Juste confirmé #falsedans non-IE, IE8,9,10, Edge 14,15. #truedans IE11 uniquement. N'a pas testé avec le mode document activé. Testé avec Browserstack.
danjah
15

J'ai lu vos réponses et fait un mix. 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 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;         
}

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

Fabio
la source
12

Obtenez la version d'IE à partir de l'agent utilisateur

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

Comment ça marche: La chaîne de l' agent utilisateur pour toutes les versions IE comprend une partie « MSIE espace la version » ou « Trident autre texte rv espace ou deux points la version ». Sachant cela, nous récupérons le numéro de version à partir d'une String.match()expression régulière. Un try-catchbloc est utilisé pour raccourcir le code, sinon nous aurions besoin de 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 gros problème dans la pratique.


Obtenez la version d'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 );

Fonctionnement: chaque version d'IE ajoute la prise en charge de fonctionnalités supplémentaires introuvables 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 par souci de concision, cependant if-thenet les switchdéclarations fonctionneraient tout aussi bien. La variable ieest définie sur un entier 5-11, ou 1 pour les anciens, ou 99 pour les plus récents / non IE. Vous pouvez le mettre à 0 si vous voulez juste tester IE 1-11 exactement.

Remarque: La détection d'objets peut se casser si votre code est exécuté sur une page avec des scripts tiers qui ajoutent des polyfills pour des choses comme document.addEventListener. Dans de telles situations, l'agent utilisateur est la meilleure option.


Détecter si le navigateur est moderne

Si vous souhaitez uniquement savoir si un navigateur prend en charge la plupart des normes HTML 5 et CSS 3, vous pouvez raisonnablement supposer qu'IE 8 et versions inférieures restent les principales applications problématiques. Tester pour window.getComputedStylevous 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 ) ); 
Beejor
la source
la 'Get IE Version from the User-Agent' fonctionne très bien! juste pour être sûr, cela montrera toutes les versions, y compris IE11?
omer
1
@omer Oui, car il recherche la chaîne "MSIE" ou "Trident"; ce dernier est utilisé par IE 11 et supérieur. Il fonctionnera donc pour toutes les futures versions d'IE jusqu'à ce que MS change le nom de son moteur de navigateur. Je pense que le nouveau navigateur Edge utilise toujours Trident.
Beejor
Cela fonctionne très bien, merci @Beejor! J'ai implémenté une simple redirection vers une autre page en utilisant votre réponse: 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 semble bon! Un petit conseil: si vous avez accès au serveur, la détection de l'agent utilisateur dans un script peut mieux fonctionner, car l'utilisateur ne remarquerait aucune redirection / scintillement, moins de requêtes HTTP, etc. JS fonctionne aussi.
Beejor
9

Angular JS fait de cette façon.

msie = parseInt((/msie (\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);
if (isNaN(msie)) {
  msie = parseInt((/trident\/.*; 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 ?

Depuis Internet Explorer 11, la chaîne de l'agent utilisateur a considérablement changé.

référer ceci:

msdn # 1 msdn # 2

Vishal Sharma
la source
7

Solution :

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

coperniko
la source
1
Mon préféré - représente IE6-10 et IE11. J'ai également ajouté une vérification de bord
AlbatrossCafe
Cela détecte Firefox commeThis is IE 0
KSPR
3

J'utilise une méthode plus simple:

L'objet global du navigateur a une propriété points de contact, dans Internet Exlorer 11 est appelé msMaxTouchPoints tho.

Donc si vous cherchez:

navigator.msMaxTouchPoints !== void 0 

Vous trouverez Internet Explorer 11.

Dvid Silva
la source
1
Il retourne également trun sur IE 10 (Win 7)
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;
areschen
la source
Si vous utilisez une expression régulière pour chec, vous pouvez ajouter l'indicateur i pour le rendre insensible à la casse, plutôt que .toLowerCase (). Il n'y a pas non plus besoin de la méthode .toString ().
Jake Rowsell
2

Essaye ça:

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")
}
Krunal
la source
Code incorrect car le navigateur Acoo utilise "MSIE" dans l'agent utilisateur. Regardez useragentstring.com/pages/Acoo%20Browser
Utilisateur
FAUX ARGUMENT. J'ai testé tous les navigateurs IE, même les appareils Win8.
Krunal
Vous avez testé le navigateur IE11 mais pas le navigateur Acoo et le navigateur Acoo utilise "MSIE" dans l'agent utilisateur comme je vous l'ai dit, donc IEold détecte également le navigateur Acoo comme IEold (l'ancienne version d'IE) et je suis sûr que le navigateur Acoo utilise " MSIE "dans le useragent car j'ai fait navigator.userAgent sur un site de test javascript avec le navigateur Acoo (Site de test: w3schools.com )
Utilisateur
Pouvez-vous s'il vous plaît donner une meilleure solution pour cela?
Krunal
U peut utiliser !navigator.userAgent.match("Acoo Browser;") && navigator.userAgent.match(/MSIE/i) ? true : falsemais cela ne fonctionne pas toujours parce que le navigateur acoo n'a pas toujours "Navigateur Acoo"; dans son useragent mais en fait vous n'avez pas besoin de vous soucier du fait que le navigateur acoo a "MSIE" dans son useragent car le navigateur acoo est presque le même.
Utilisateur
1

Cela semble être une meilleure méthode. "indexOf" renvoie -1 si rien ne correspond. Il n'écrase pas les classes existantes sur le corps, il les ajoute simplement.

// 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';
}
Joe
la source
0

Détectez 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|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

earlonrails
la source
0

J'ai utilisé l' onscrollévénement à 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()"
Martin
la source
0

Uniquement 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 = '<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);

Mise à jour 01 juin 2017

Maintenant, nous pourrions utiliser quelque chose de plus simple et de plus simple:

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;
James Peter
la source
Où puis-je trouver les nouveaux objets globaux standard ajoutés aux nouvelles versions d'Edge? Je suppose que Math.acosh en fait partie.
j4v1 du
1
@ j4v1 Math.acosh uniquement est pris en charge dans Microsoft Edge (navigateur Edge). Réf: msdn.microsoft.com/en-us/en-en/library/dn858239(v=vs.94).aspx
James Peter
Cette méthode a cessé de fonctionner pour moi. Dans le passé, il a correctement détecté IE11 mais maintenant que j'ai la version 11.1198.14393.0 d'Internet Explorer (mise à jour de la version 11.0.42 (KB4018271)) exécutée sur Windows 10 Enterprise (version 1607, OS Build 14393.1198), Math semble prendre en charge la méthode acosh.
Thijs
@Thijs Dans Windows 10 Education avec IE11 v 11.1198.14393.0, j'ai testé avec succès. Vous devriez essayer une autre fonction mathématique selon ES6.
James Peter
@JamesPeter J'ai atterri lors de la vérification de document.documentMode. Cela semble être une propriété plus fiable pour vérifier IE11 ou Edge. documentMode existe dans IE11 mais n'existe plus dans Edge.
Thijs
0

Franchement, je dirais d'utiliser une bibliothèque qui fait ce dont vous avez besoin (comme platform.js par exemple). À un moment donné, les choses vont changer et la bibliothèque sera équipée pour ces changements et l'analyse manuelle à l'aide d'expressions régulières échouera.

Dieu merci, IE s'en va ...

Matthias Hryniszak
la source