Jak wykryć IE11?

212

Kiedy chcę wykryć IE, używam tego kodu:

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

Ale IE11 zwraca „Nie używasz Internet Explorera”. Jak mogę to wykryć?

Paul Sweatte
źródło
2
Zobacz także stackoverflow.com/questions/17447373/…
dave1010,
1
Wszystko oparte na kliencie użytkownika jest wadliwe. Zbyt łatwo jest go sfałszować. Być może nie stanowi to problemu, ale wydaje mi się, że skrypt wykrywający przeglądarkę powinien mieć spore szanse na wykrycie maskarady. Używam kombinacji komentarzy warunkowych, przechodząc do próby wymuszenia document.documentMode, a następnie patrzę na window.MSInputMethodContext zgodnie z opisem poniżej: Paul Sweatte. Zamieszczę mój kod, ale chłosta martwego konia.
David G
3
IE11 ma klienta użytkownika: Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; rv: 11.0), podobnie jak typy Gecko Os: 6.1 - win7, 6.3 - win81
razor
1
zobacz moją odpowiedź tutaj stackoverflow.com/questions/21825157/...
Royi Namir
1
oto najlepsze rozwiązanie, jakie znalazłem: stackoverflow.com/a/20201867/2047385 if (Object.hasOwnProperty.call (okno, „ActiveXObject”) &&! window.ActiveXObject) {// to IE11}
xorcus

Odpowiedzi:

221

IE11 nie zgłasza już, ponieważ MSIEzgodnie z tą listą zmian celowo jest unikać błędnego wykrywania.

To, co możesz zrobić, jeśli naprawdę chcesz wiedzieć, że to IE, to wykrycie Trident/ciągu w kliencie użytkownika, jeśli navigator.appNamezwróci Netscape, coś w rodzaju (nieprzetestowane);

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

Zauważ, że IE11 (afaik) wciąż jest w wersji zapoznawczej, a klient użytkownika może się zmienić przed wydaniem.

Joachim Isaksson
źródło
81
it's intentional to avoid mis-detection- Niestety, teraz, gdy IE11 jest wydany, mamy kod, który jest uszkodzony tylko w IE11, podczas gdy poprawne wykrycie IE działałoby ...
Izkata,
68
Przekształciłem to rozwiązanie na wartość logiczną, jeśli wersja jest mniej ważnafunction 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 - Zgodnie ze specyfikacją html5 tutaj IE faktycznie przestrzega standardu. Tak, to celowe, ale zgodne z nowym standardem (nieaktualne w starym interfejsie HTML).
Mark Avenius,
11
„powodem, dla którego to zrobili, było celowe. Chcieli złamać takie skrypty wykrywające przeglądarkę”. from stackoverflow.com/a/18872067/1066234 ... Właściwie powinno być: „Chcieli, aby miliardy stron się zepsuło”.
Kai Noack,
15
To działa dla mnie: var isIE11 = !!navigator.userAgent.match(/Trident\/7\./); źródło
Kai Noack,
86

Służy !(window.ActiveXObject) && "ActiveXObject" in windowdo jawnego wykrywania IE11.

Aby wykryć dowolną wersję IE (wcześniejszą niż Edge, „Trident”), użyj "ActiveXObject" in windowzamiast tego.

McW
źródło
2
W tym artykule Microsoft sugeruje, że to rozwiązanie może już nie działać. Msdn.microsoft.com/en-us/library/ie/dn423948(v=vs.85).aspx
Alan
5
Właściwie ten artykuł opisuje powód, dla którego moja metoda działa. Próba dostępu window.ActiveXObject, jak opisano w tym artykule, powraca undefinedteraz w IE11 (a także w przeglądarkach innych niż Microsoft). Test przy użyciu inoperatora javascript zwraca się truewe wszystkich przeglądarkach Microsoft, więc oba przypadki mają miejsce dokładnie w IE11. Jeśli Microsoft wyda zmianę w zachowaniu inoperatora, tak, ta metoda się zepsuje.
mcw
5
„ActiveXObject” w oknie zwraca False in Edge.
Neo
8
@Neo Edge nie jest IE, pytanie OP dotyczyło sposobu wykrycia IE11
mastazi 11.04.16
1
@mastazi tak, ale w tej odpowiedzi wspomniano, że ActiveXObject można wykorzystać do wykrywania dowolnej wersji IE. Dyskusyjne jest to, że Edge powinien być nazywany wersją IE, czy nie (Microsoft z pewnością nie chce go tak nazwać), ale dla wielu deweloperów IE stał się synonimem każdej domyślnej przeglądarki Microsoft.
Neo
45

Użyj MSInputMethodContextjako część kontroli wykrywania funkcji. Na przykład:

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

Bibliografia

Paul Sweatte
źródło
2
Wydaje mi się to bardziej solidne. Z pewnością wszystko oparte na kliencie użytkownika jest dość bezużyteczne.
David G
1
Działa to zamiast ActiveXObject.
Wielkie
1
@tdakhla Zaktualizowano, aby odfiltrować IE Edge.
Paul Sweatte
Ważne, aby pamiętać, że dla każdej z tych odpowiedzi, które mogą wydawać się, że nie działają, jest sprawdzenie ustawień emulacji. Oznaczę tę odpowiedź jako niepoprawną, ale potem sprawdziłem emulację i zobaczyłem, że niektóre ustawienia zgodności intranetu zastępują tryb wyświetlania , kiedy to zostało wyjęte z równania, to rozwiązanie działało dla mnie dobrze.
Shaun,
1
Właśnie potwierdzone #falsew nie-IE, IE8,9,10, Edge 14,15. #truetylko w IE11. Nie testowano przy aktywnym trybie dokumentu. Testowane z Browserstack.
danjah
15

Przeczytałem twoje odpowiedzi i zrobiłem miks. Wygląda na to, że działa z Windows XP (IE7 / IE8) i 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;         
}

Oczywiście, jeśli zwrócę 0, oznacza to brak IE.

Fabio
źródło
12

Pobierz wersję IE z User-Agent

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

Jak to działa: Łańcuch klienta użytkownika dla wszystkich wersji IE zawiera fragment „MSIE Space Version ” lub „Trident other-text rv space-or-colon version ”. Wiedząc o tym, pobieramy numer wersji zString.match() wyrażenia regularnego. try-catchBlok służy do skrócenia kodu, w przeciwnym razie musielibyśmy testować granice tablicy dla przeglądarek nie-IE.

Uwaga: klienta użytkownika można sfałszować lub pominąć, czasem niezamierzenie, jeśli użytkownik ustawił przeglądarkę w „trybie zgodności”. Chociaż w praktyce nie wydaje się to dużym problemem.


Pobierz wersję IE bez klienta użytkownika

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

Jak to działa: Każda wersja IE dodaje obsługę dodatkowych funkcji, których nie znaleziono w poprzednich wersjach. Możemy więc przetestować funkcje w sposób odgórny. Jednak dla zwięzłości zastosowano tutaj sekwencję trójskładnikową , if-thena switchinstrukcje równie dobrze by działały. Zmienna iejest ustawiona na liczbę całkowitą 5-11 lub 1 dla starszych lub 99 dla nowszych / nie-IE. Możesz ustawić go na 0, jeśli chcesz dokładnie przetestować IE 1-11.

Uwaga: Wykrywanie obiektów może się zepsuć, jeśli Twój kod jest uruchamiany na stronie ze skryptami innych firm, które dodają polifill dla takich rzeczydocument.addEventListener . W takich sytuacjach najlepszym rozwiązaniem jest klient użytkownika.


Wykryj, czy przeglądarka jest nowoczesna

Jeśli interesuje Cię tylko to, czy przeglądarka obsługuje większość standardów HTML 5 i CSS 3, możesz rozsądnie założyć, że głównym problemem są aplikacje IE 8 i niższe. Testowanie window.getComputedStyledaje również całkiem dobrą mieszankę nowoczesnych przeglądarek (IE 9, FF 4, Chrome 11, Safari 5, Opera 11.5). IE 9 znacznie poprawia obsługę standardów, ale natywna animacja CSS wymaga IE 10.

var isModernBrowser = ( !document.all || ( document.all && document.addEventListener ) ); 
Beejor
źródło
„Pobierz wersję IE z User-Agent” działa ładnie! dla pewności, pokaże to wszystkie wersje łącznie z IE11?
omer
1
@omer Tak, ponieważ szuka ciągu „MSIE” lub „Trident”; ten ostatni jest używany przez IE 11 i nowsze wersje. Będzie więc działał dla wszystkich przyszłych wersji IE, dopóki MS nie zmieni nazwy swojego silnika przeglądarki. Wierzę, że nowa przeglądarka Edge nadal korzysta z Trident.
Beejor
Działa to świetnie, dzięki @Beejor! Zaimplementowałem proste przekierowanie na inną stronę, używając twojej odpowiedzi: 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 Wygląda dobrze! Szybka wskazówka: jeśli masz dostęp do serwera, wykrycie klienta użytkownika w skrypcie może działać lepiej, ponieważ użytkownik nie zauważyłby żadnego przekierowania / migotania, mniej żądań HTTP itp. Ale w mgnieniu oka robi to z JS też działa.
Beejor,
9

Angular JS robi to w ten sposób.

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

msie będzie liczbą dodatnią, jeśli jej IE i NaN dla innych przeglądarek takich jak chrome, firefox.

czemu ?

Począwszy od Internet Explorera 11, łańcuch użytkownika-użytkownika znacznie się zmienił.

odnoszą się to:

msdn # 1 msdn # 2

Vishal Sharma
źródło
7

rozwiązanie :

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

koperniko
źródło
1
Moje ulubione - konta dla IE6-10 i IE11. Dodałem również czek na przewagę
AlbatrossCafe
To wykrywa Firefox jakoThis is IE 0
KSPR
3

Używam prostszej metody:

Globalny obiekt nawigatora ma punkty styku z właściwością, w programie Internet Exlorer 11 nazywa się msMaxTouchPoints.

Więc jeśli szukasz:

navigator.msMaxTouchPoints !== void 0 

Znajdziesz Internet Explorer 11.

Dvid Silva
źródło
1
Zwraca także trun na IE 10 (Win 7)
programista chemiczny
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
źródło
Jeśli używasz wyrażenia regularnego do sprawdzania, możesz dodać flagę i, aby rozróżnić wielkość liter, zamiast .toLowerCase (). Nie ma również potrzeby stosowania metody .toString ().
Jake Rowsell
2

Spróbuj tego:

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
źródło
Błędny kod, ponieważ przeglądarka Acoo używa „MSIE” w pliku użytkownika. Spójrz na useragentstring.com/pages/Acoo%20Browser
Użytkownik
ŹLE ARGUMENT. Testowałem we wszystkich przeglądarkach IE, nawet na urządzeniach Win8.
Krunal
Testowałeś przeglądarkę IE11, ale nie przeglądarkę Acoo, a przeglądarka Acoo używa „MSIE” w narzędziu użytkownika, tak jak mówiłem, więc IEold wykrywa również przeglądarkę Acoo jako IEold (stara wersja IE) i jestem pewien, że przeglądarka Acoo używa „ MSIE ”w useragent, ponieważ zrobiłem navigator.userAgent na stronie testowej javascript z przeglądarką Acoo (strona testowa: w3schools.com )
użytkownik
Czy możesz podać lepsze rozwiązanie tego problemu?
Krunal
U może używać, !navigator.userAgent.match("Acoo Browser;") && navigator.userAgent.match(/MSIE/i) ? true : falseale to nie zawsze działa, ponieważ przeglądarka acoo nie zawsze ma „Acoo Browser;” w swoim useragent, ale tak naprawdę nie musisz się przejmować, że przeglądarka acoo ma w swoim useragent „MSIE”, ponieważ przeglądarka acoo jest prawie taka sama.
Użytkownik
1

To wydaje się być lepszą metodą. „indexOf” zwraca -1, jeśli nic nie jest dopasowane. Nie zastępuje istniejących klas na ciele, po prostu dodaje je.

// 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
źródło
0

Wykryj większość przeglądarek za pomocą tego:

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

Earlrails
źródło
0

Użyłem onscrollzdarzenia przy elemencie z paskiem przewijania. Po uruchomieniu w IE dodałem następującą weryfikację:

onscroll="if (document.activeElement==this) ignoreHideOptions()"
Jaskółka oknówka
źródło
0

Tylko dla przeglądarki 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;
                }
        }
    }

użyj alertu (tj.);

Testowanie:

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

Aktualizacja 01 czerwca 2017 r

Teraz możemy użyć czegoś łatwiejszego i prostszego:

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
źródło
Gdzie mogę znaleźć nowe standardowe obiekty globalne dodane do nowych wersji Edge? Wnioskuję, że Math.acosh jest jednym z nich.
j4v1,
1
@ j4v1 Math.acosh Obsługiwany jest tylko Microsoft Edge (przeglądarka Edge). Ref: msdn.microsoft.com/en-us/en-en/library/dn858239(v=vs.94).aspx
James Peter
Ta metoda przestała działać dla mnie. W przeszłości poprawnie wykrywała IE11, ale teraz, gdy mam Internet Explorer 11.1198.14393.0 (Aktualizacja wersji 11.0.42 (KB4018271)) działający na Windows 10 Enterprise (wersja 1607, kompilacja systemu operacyjnego 14393.1198) Matematyka wydaje się obsługiwać metodę acosh.
Thijs
@Thijs W Windows 10 Education z IE11 v 11.1198.14393.0 Przetestowałem pomyślnie. Powinieneś wypróbować inną funkcję matematyczną zgodnie z ES6.
James Peter
@JamesPeter Wylądowałem po sprawdzeniu dokumentu.documentMode. Wydaje się, że jest to bardziej niezawodna właściwość do sprawdzania IE11 lub Edge. documentMode istnieje w IE11, ale już nie istnieje w Edge.
Thijs
0

Szczerze mówiąc powiedziałbym, że korzystaj z biblioteki, która robi to, czego potrzebujesz (na przykład platforma.js). W pewnym momencie wszystko się zmieni i biblioteka zostanie wyposażona w te zmiany, a ręczne parsowanie przy użyciu wyrażeń regularnych zakończy się niepowodzeniem.

Dzięki Bogu IE odchodzi ...

Matthias Hryniszak
źródło