Come rilevare IE11?


212

Quando voglio rilevare IE uso questo codice:

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

Ma IE11 sta restituendo "Non stai utilizzando Internet Explorer". Come posso rilevarlo?



1
Qualsiasi cosa basata sull'agente utente è difettosa. È troppo facile falsificare, ora, potrebbe non essere un problema, ma mi sembra che uno script di rilevamento del browser dovrebbe avere buone possibilità di rilevare il mascheramento. Uso una combinazione di commenti condizionali, fallendo nel tentativo di forzare document.documentMode e quindi guardare window.MSInputMethodContext secondo Paul Sweatte di seguito. Pubblicherei il mio codice ma sta frustando un cavallo morto.
David G,

3
IE11 ha user-agent: Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; rv: 11.0) come Gecko Os tipi: 6.1 - win7, 6.3 - win81
rasoio


1
ecco la soluzione migliore che ho trovato: stackoverflow.com/a/20201867/2047385 se (Object.hasOwnProperty.call (finestra, "ActiveXObject") && window.ActiveXObject!) {// è IE11}
xorcus

Risposte:


221

Internet Explorer 11 non segnala più come MSIE, in base a questo elenco di modifiche , è intenzionale evitare errori di rilevamento.

Cosa puoi fare se vuoi davvero sapere che è IE è rilevare la Trident/stringa nell'agente utente se navigator.appNamerestituisce Netscape, qualcosa del tipo (il non testato);

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

Si noti che IE11 (afaik) è ancora in anteprima e l'agente utente potrebbe cambiare prima del rilascio.


81
it's intentional to avoid mis-detection- Purtroppo, ora che IE11 è stato rilasciato, abbiamo un codice che è rotto solo in IE11, mentre un corretto rilevamento di IE avrebbe funzionato ...
Izkata

68
Ho convertito questa soluzione in un booleano se la versione è meno 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 - Secondo le specifiche html5 qui , IE sta effettivamente seguendo lo standard. Quindi sì, è intenzionale, ma è secondo il nuovo standard (deprecando il vecchio html api.)
Mark Avenius

11
"la ragione per cui lo hanno fatto è stata deliberata. Volevano rompere gli script di rilevamento del browser in questo modo." da stackoverflow.com/a/18872067/1066234 ... In realtà dovrebbe essere: "Volevano far rompere miliardi di siti Web in questo modo".
Kai Noack,

15
Questo funziona per me: var isIE11 = !!navigator.userAgent.match(/Trident\/7\./); fonte
Kai Noack

86

Utilizzare !(window.ActiveXObject) && "ActiveXObject" in windowper rilevare IE11 in modo esplicito.

Per rilevare qualsiasi versione di IE (pre-Edge, "Trident"), utilizzare "ActiveXObject" in windowinvece.


2
Questo articolo di Microsoft suggerisce che questa soluzione potrebbe non funzionare più msdn.microsoft.com/en-us/library/ie/dn423948(v=vs.85).aspx
Alan

5
In realtà, questo articolo descrive il motivo per cui il mio metodo funziona. Tentare di accedere window.ActiveXObject, come descritto nell'articolo, undefinedora ritorna in IE11 (così come i browser non Microsoft). Il test che utilizza l' inoperatore javascript ritorna truein tutti i browser Microsoft, quindi entrambi sono il caso rigorosamente in IE11. Se Microsoft emette una modifica al comportamento indell'operatore, sì, questo metodo non funzionerà.
Mc

5
"ActiveXObject" nella finestra restituisce False in Edge.
Neo,

8
@Neo Edge non è IE, la domanda dell'OP era come rilevare IE11
mastazi

1
@mastazi sì, ma in questa risposta si dice che ActiveXObject può essere usato per rilevare qualsiasi versione di IE. È tuttavia discutibile che Edge debba essere chiamato o meno una versione di IE (Microsoft sicuramente non vuole chiamarlo uno), ma per molti sviluppatori IE è diventato sinonimo di qualsiasi browser Microsoft predefinito.
Neo,

45

Utilizzare MSInputMethodContextcome parte di un controllo di rilevamento delle funzionalità. Per esempio:

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

Riferimenti


2
Questo mi sembra più robusto. Certamente qualsiasi cosa basata sull'agente utente è piuttosto inutile.
David G,

1
Funzionava invece di ActiveXObject. Grazie mille
Tarık Özgün Güner,

1
@tdakhla Aggiornato per filtrare IE Edge.
Paul Sweatte,

È importante notare che per ognuna di queste risposte che potrebbero sembrare che non funzionino è controllare le impostazioni di emulazione, stavo per contrassegnare questa risposta come errata, ma poi ho controllato l'emulazione e ho visto che alcune impostazioni di compatibilità intranet stavano scavalcando la modalità di visualizzazione , una volta che è stata tolta dall'equazione questa soluzione ha funzionato bene per me.
Shaun,

1
Appena confermato #falsein non IE, IE8,9,10, Edge 14,15. #truesolo in IE11. Non testato con la modalità documento attiva. Testato con Browserstack.
danjah

15

Ho letto le tue risposte e ho creato un mix. Sembra funzionare con Windows XP (IE7 / IE8) e 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;         
}

Naturalmente se restituisco 0, significa che non esiste IE.


12

Ottieni la versione IE dall'Utente-Agente

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

Come funziona: La stringa user-agent per tutte le versioni di IE include una parte "MSIE spazio la versione " o "Trident altro testo rv spazio-o-colon versione ". Sapendo questo, prendiamo il numero di versione da String.match()un'espressione regolare. Un try-catchblocco viene utilizzato per abbreviare il codice, altrimenti avremmo bisogno di testare i limiti dell'array per i browser non IE.

Nota: l'agente utente può essere falsificato o omesso, a volte involontariamente se l'utente ha impostato il proprio browser su una "modalità di compatibilità". Anche se questo non sembra un grosso problema in pratica.


Ottieni la versione IE senza User-Agent

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

Come funziona: ogni versione di IE aggiunge il supporto per funzionalità aggiuntive non presenti nelle versioni precedenti. Quindi possiamo testare le funzionalità in modo top-down. Un ternario sequenza è utilizzato qui per brevità, anche se if-thene switchdichiarazioni avrebbe funzionato altrettanto bene. La variabile ieè impostata su un numero intero compreso tra 5 e 11 o 1 per le versioni precedenti o 99 per le versioni più recenti / non IE. È possibile impostarlo su 0 se si desidera verificare esattamente IE 1-11.

Nota: il rilevamento degli oggetti potrebbe interrompersi se il codice viene eseguito su una pagina con script di terze parti che aggiungono polyfill per cose come document.addEventListener. In tali situazioni, l'agente utente è l'opzione migliore.


Rileva se il browser è moderno

Se ti interessa solo sapere se un browser supporta o meno la maggior parte degli standard HTML 5 e CSS 3, puoi ragionevolmente supporre che IE 8 e versioni inferiori rimangano le principali app problematiche. Il test per window.getComputedStyleti darà anche un discreto mix di browser moderni (IE 9, FF 4, Chrome 11, Safari 5, Opera 11.5). IE 9 migliora notevolmente il supporto degli standard, ma l'animazione CSS nativa richiede IE 10.

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

la "Ottieni la versione IE dall'Utente-Agente" funziona bene! solo per essere sicuri, questo mostrerà tutte le versioni incluso IE11?
omer,

1
@omer Sì, perché cerca la stringa "MSIE" o "Trident"; quest'ultimo è utilizzato da IE 11 e versioni successive. Quindi funzionerà per tutte le future versioni di IE fino a quando MS non cambierà il nome del suo motore di browser. Credo che il nuovo browser Edge usi ancora Trident.
Beejor,

Funziona benissimo, grazie @Beejor! Ho implementato un semplice reindirizzamento a un'altra pagina usando la tua risposta: 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 Sembra buono! Un suggerimento rapido: se si ha accesso al server, il rilevamento dell'agente utente in uno script potrebbe funzionare meglio, poiché l'utente non noterebbe alcun reindirizzamento / sfarfallio, meno richieste HTTP, ecc. Ma in un pizzico farlo con Anche JS funziona.
Beejor,

9

JS angolare fa così.

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

msie sarà un numero positivo se è IE e NaN per altri browser come Chrome, Firefox.

perché ?

A partire da Internet Explorer 11, la stringa dell'agente utente è cambiata in modo significativo.

riferiscilo:

msdn # 1 msdn # 2


7

soluzione:

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
Il mio preferito - rappresenta IE6-10 e IE11. Ho aggiunto anche un controllo per edge
AlbatrossCafe

Questo rileva Firefox comeThis is IE 0
KSPR il

3

Sto usando un metodo più semplice:

L'oggetto globale navigator ha un touchpoint di proprietà, in Internet Exlorer 11 si chiama thMMaxTouchPoints.

Quindi se cerchi:

navigator.msMaxTouchPoints !== void 0 

Troverai Internet Explorer 11.


1
Restituisce anche trun su IE 10 (Win 7)
Programmatore chimico

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;

Se stai usando un regex per chec puoi aggiungere il flag i per renderlo insensibile alle maiuscole, piuttosto che .toLowerCase (). Non è inoltre necessario il metodo .toString ().
Jake Rowsell,

2

Prova questo:

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

Codice errato perché il browser Acoo utilizza "MSIE" nell'agente utente. Guarda useragentstring.com/pages/Acoo%20Browser
Utente

ARGOMENTO SBAGLIATO. Ho testato tutti i browser IE, anche i dispositivi Win8.
Krunal,

Hai testato il browser IE11 ma non il browser Acoo e il browser Acoo utilizza "MSIE" nell'utente come dicevo, quindi IEold rileva anche il browser Acoo come IEold (la vecchia versione di IE) e sono sicuro che il browser Acoo utilizzi " MSIE "nell'agente utente perché ho eseguito navigator.userAgent su un sito di test javascript con browser Acoo (sito di test: w3schools.com )
Utente

Potete per favore dare una soluzione migliore per questo?
Krunal,

Puoi usarlo !navigator.userAgent.match("Acoo Browser;") && navigator.userAgent.match(/MSIE/i) ? true : falsema non sempre funziona perché il browser acoo non ha sempre "Acoo Browser;" nel suo useragent ma in realtà non devi preoccuparti che il browser acoo abbia "MSIE" nel suo useragent perché il browser acoo è quasi lo stesso.
Utente

1

Questo sembra essere un metodo migliore. "indexOf" restituisce -1 se non viene trovato nulla. Non sovrascrive le classi esistenti sul corpo, le aggiunge semplicemente.

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

Rileva la maggior parte dei browser con questo:

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

Ho usato l' onscrollevento sull'elemento con la barra di scorrimento. Quando attivato in IE, ho aggiunto la seguente convalida:

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

0

Solo per IE Browser:

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

usa alert (es.);

test:

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

Aggiornamento 01 giu 2017

Ora potremmo usare qualcosa di più facile e semplice:

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;

Dove posso trovare i nuovi oggetti globali standard aggiunti alle nuove versioni di Edge? Ne deduco che Math.acosh è uno di quelli.
j4v1,

1
@ j4v1 Math.acosh è supportato solo in Microsoft Edge (browser Edge). Rif: msdn.microsoft.com/en-us/en-en/library/dn858239(v=vs.94).aspx
James Peter,

Questo metodo ha smesso di funzionare per me. In passato ha rilevato correttamente IE11 ma ora che ho Internet Explorer versione 11.1198.14393.0 (versione di aggiornamento 11.0.42 (KB4018271)) in esecuzione su Windows 10 Enterprise (versione 1607, build del sistema operativo 14393.1198) Math sembra supportare il metodo acosh.
Thijs,

@Thijs In Windows 10 Education con IE11 v 11.1198.14393.0 Ho testato correttamente. Dovresti provare un'altra funzione matematica secondo ES6.
James Peter,

@JamesPeter Sono atterrato dopo aver verificato document.documentMode. Questa sembra essere una proprietà più affidabile per verificare IE11 o Edge. documentMode esiste in IE11 ma non esiste più in Edge.
Thijs

0

Francamente direi che usa una libreria che fa ciò di cui hai bisogno (come platform.js per esempio). Ad un certo punto le cose cambieranno e la libreria sarà attrezzata per quei cambiamenti e l'analisi manuale usando espressioni regolari fallirà.

Grazie a dio IE se ne va ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.