web-dev-qa-db-fra.com

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

195
user2591042

IE11 n'indique plus que MSIE, selon cette liste de modifications il est intentionnel pour éviter les erreurs de détection.

Ce que vous pouvez faire si vous voulez {vraiment} savoir que IE consiste à 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());

Notez que IE11 (déjà) est toujours dans l'aperçu et que l'agent utilisateur peut changer avant la publication.

210
Joachim Isaksson

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

Pour détecter toute version IE (antérieure à Edge, "Trident"), utilisez plutôt "ActiveXObject" in window.

81
mcw0933

Utilisez MSInputMethodContext dans 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

35
Paul Sweatte

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 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.

15
Fabio

Obtenir la version IE de l'agent utilisateur

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

Comment cela fonctionne: La chaîne d'agent utilisateur pour toutes les versions IE comprend une partie "MSIE espaceversion" ou "Trident autre-textevr _ {espace-ou-deux-points} _ version ". Sachant cela, nous prenons le numéro de version d'une expression régulière String.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 par inadvertance si l'utilisateur a configuré son navigateur sur un "mode de compatibilité". Bien que cela ne semble pas être vraiment 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 ça marche: Chaque version de IE ajoute le support pour des 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 ternary est utilisée ici par souci de brièveté, bien que les instructions if-then et switch fonctionnent tout aussi bien. La variable ie est définie sur un nombre entier compris entre 5 et 11, ou 1 pour les plus âgés, ou 99 pour les versions plus récentes/non IE. Vous pouvez le définir sur 0 si vous souhaitez simplement tester IE 1-11 exactement.

Remarque: La détection d'objet peut échouer si votre code est exécuté sur une page avec des scripts tiers qui ajoutent des polyfill pour des éléments tels que 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 que IE 8 et les versions antérieures restent les applications à problème principal. 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 ) ); 
11
Beejor

JS angulaire 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 d'agent utilisateur a considérablement changé.

référez ceci: 

msdn # 1msdn # 2

9
Vishal Sharma

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

7
coperniko

J'utilise une méthode plus simple:

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

Donc si vous cherchez:

navigator.msMaxTouchPoints !== void 0 

Vous trouverez Internet Explorer 11.

3
Dvid Silva
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;
2
areschen

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

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

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

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|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
earlonrails

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 ...

0
Matthias Hryniszak

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 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 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;
0
James Peter

J'ai utilisé l'événement onscroll au niveau de 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()"
0
Martin