Wykryj wersję IE (przed wersją 9) w JavaScript

246

Chcę odesłać użytkowników naszej witryny do strony błędów, jeśli używają wersji Internet Explorerwcześniejszej niż v9. Wspieranie nie jest warte naszego czasu i pieniędzy IE pre-v9. Użytkownicy wszystkich innych przeglądarek innych niż IE mają się dobrze i nie należy ich odrzucać. Oto proponowany kod:

if(navigator.appName.indexOf("Internet Explorer")!=-1){     //yeah, he's using IE
    var badBrowser=(
        navigator.appVersion.indexOf("MSIE 9")==-1 &&   //v9 is ok
        navigator.appVersion.indexOf("MSIE 1")==-1  //v10, 11, 12, etc. is fine too
    );

    if(badBrowser){
        // navigate to error page
    }
}

Czy ten kod załatwi sprawę?

Aby odpowiedzieć na kilka komentarzy, które prawdopodobnie pojawią się po mojej stronie:

  1. Tak, wiem, że użytkownicy mogą sfałszować swój useragentciąg. Nie martwię się
  2. Tak, wiem, że specjaliści od programowania wolą wykopywać obsługę funkcji zamiast przeglądarki, ale nie sądzę, aby takie podejście miało sens w tym przypadku. Wiem już, że wszystkie (odpowiednie) przeglądarki inne niż IE obsługują funkcje, których potrzebuję, i że wszystkie pre-v9 IEprzeglądarki nie. Sprawdzanie poszczególnych funkcji w witrynie byłoby marnotrawstwem.
  3. Tak, wiem, że ktoś próbujący uzyskać dostęp do witryny przy użyciu IE v1(lub> = 20) nie dostałby wartości „badBrowser” ustawionej na wartość true, a strona ostrzegawcza nie byłaby wyświetlana poprawnie. To ryzyko, które jesteśmy gotowi podjąć.
  4. Tak, wiem, że Microsoft ma „komentarze warunkowe”, których można użyć do precyzyjnego wykrywania wersji przeglądarki. IE nie obsługuje już komentarzy warunkowych IE 10, co czyni tę metodę całkowicie bezużyteczną.

Czy są jeszcze jakieś oczywiste problemy?

Chad Decker
źródło
122
„Po prostu nie warto poświęcać czasu i pieniędzy na obsługę IE w wersji wcześniejszej niż 9”. Chciałbym umieć to robić.
Hassan
2
Opierając się na punkcie [2] nie sugeruję Modernizr ( en.wikipedia.org/wiki/Modernizr ) - każdy musi gdzieś narysować linię w piasku - ale IE9 wydaje się być wysoką linią
amelvin
1
Komentarze warunkowe są zwykłymi komentarzami. Tylko IE interpretuje je jako specjalne. IE10 + już tego nie zrobi.
Andreas
3
Komentarze warunkowe będą traktowane przez IE 10 dokładnie tak samo, jak przeglądarki inne niż IE. Są to poprawne komentarze HTML, więc będą traktowane jako takie. Zgadzam się z Andreasem i uważam, że właściwym rozwiązaniem są komentarze warunkowe.
Tim Down
1
Oficjalna dokumentacja z informacją, że IE10 + nie obsługuje komentarzy warunkowych: blogs.msdn.com/b/ie/archive/2011/07/06/… - Podziękowania: stackoverflow.com/a/9900331/320399
blong

Odpowiedzi:

354

To mój ulubiony sposób na zrobienie tego. Daje maksymalną kontrolę. (Uwaga: instrukcje warunkowe są obsługiwane tylko w IE5 - 9.)

Najpierw poprawnie skonfiguruj swoje np. Klasy

<!DOCTYPE html>
<!--[if lt IE 7]> <html class="lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>    <html class="lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>    <html class="lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html> <!--<![endif]-->    
<head>

Następnie możesz po prostu użyć CSS, aby zrobić wyjątki stylowe, lub, jeśli potrzebujesz, możesz dodać prosty JavaScript:

(function ($) {
    "use strict";

    // Detecting IE
    var oldIE;
    if ($('html').is('.lt-ie7, .lt-ie8, .lt-ie9')) {
        oldIE = true;
    }

    if (oldIE) {
        // Here's your JS for IE..
    } else {
        // ..And here's the full-fat code for everyone else
    }

}(jQuery));

Dzięki Paulowi Irishowi .

Jezen Thomas
źródło
21
Biorąc pod uwagę, że OP poprosił o rozwiązanie czysto JavaScript, uważam, że odpowiedź @Tim Down poniżej jest lepsza, ponieważ nie wymaga zmiany istniejącego HTML, a także nie używa jQuery: stackoverflow.com/a/10965203/134120
AsGoodAsItGets
Error: Saw <!-- within a comment. Probable cause: Nested comment (not allowed). At line 5, column 21 if gt IE 8]><!--><html
Występuje
161

Zwraca wersję IE lub jeśli nie IE zwraca false

function isIE () {
  var myNav = navigator.userAgent.toLowerCase();
  return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
}

Przykład:

if (isIE () == 8) {
 // IE8 code
} else {
 // Other versions IE or not IE
}

lub

if (isIE () && isIE () < 9) {
 // is IE version less than 9
} else {
 // is IE 9 and later or not IE
}

lub

if (isIE()) {
 // is IE
} else {
 // Other browser
}
Weroro
źródło
36
Nie działa dla IE11. Z IE 11 zmienili ciąg UA na"mozilla/5.0 (windows nt 6.3; wow64; trident/7.0; .net4.0e; .net4.0c; media center pc 6.0; .net clr 3.5.30729; .net clr 2.0.50727; .net clr 3.0.30729; rv:11.0) like gecko"
Annie
22
Należy pamiętać, że w FF „fałsz <9” to „prawda”. Tak więc warunkiem powinno byćif (isIE () && isIE () < 9) {
nZeus
3
@DeadlyChambers być może działało w trybie standardów IE7? msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
mason81
4
Zatwierdzoną odpowiedzią jest wykrywanie wersji IE w HTML. To odpowiada pierwotne pytanie.
Matt Wagner,
2
@PrasadGayan - Microsoft Edge nie jest programem Internet Explorer. Zatem zwracanie wartości false wydaje się być właściwą rzeczą.
BryanGrezeszak
120

Jeśli nikt inny nie dodał addEventListermetody i używasz poprawnego trybu przeglądarki, możesz sprawdzić IE 8 lub mniej za pomocą

if (window.attachEvent && !window.addEventListener) {
    // "bad" IE
}

Starsza wersja Internet Explorera i attachEvent (MDN)

Andreas
źródło
7
Wydaje się, że jest to najbardziej skuteczny sposób na całkowite wykrycie IE <= 8 w JavaScript - i jest świetny dla osób takich jak ja, którzy szukali sposobu, aby to zrobić.
Gregory Magarshak
Wspaniały! Wykrywa to także IE9 w trybie dziwactwa, którego właśnie szukałem.
sstur
7
Chociaż jest to „łatwe w użyciu” rozwiązanie, wiąże się z pewnym ryzykiem. Każdy w Twojej firmie (który nie zna Twojego rozwiązania) może zaimplementować „addEventListener” lub „attachEvent”, aby poradzić sobie z jego brakiem w IE 8. Wówczas kod przestanie działać.
Zé Carlos,
@RoyiNamir Ten test dla IE8. Dlaczego, u licha, ma on zwracać wartość true w IE11?
Andreas
@Andreas ups. nie widziałem, że OP chce przed ie9. usuwanie
Royi Namir,
114

Użyj komentarzy warunkowych. Próbujesz wykryć użytkowników IE <9, a komentarze warunkowe będą działać w tych przeglądarkach; w innych przeglądarkach (IE> = 10 i nie-IE) komentarze będą traktowane jak normalne komentarze HTML, takie są.

Przykładowy HTML:

<!--[if lt IE 9]>
WE DON'T LIKE YOUR BROWSER
<![endif]-->

Możesz to zrobić wyłącznie za pomocą skryptu, jeśli potrzebujesz:

var div = document.createElement("div");
div.innerHTML = "<!--[if lt IE 9]><i></i><![endif]-->";
var isIeLessThan9 = (div.getElementsByTagName("i").length == 1);
if (isIeLessThan9) {
    alert("WE DON'T LIKE YOUR BROWSER");
}
Tim Down
źródło
5
Wersja JavaScript odpowiedzi @Tim Down działała dla mnie świetnie. Użyłem BrowserStack do przetestowania go w systemie Windows 7 i IE 8, 9, 10 i 11; Mac OS X Snow Leopard z Safari 5.1, Firefox 28.0, Chrome 33.0 i Opera 20.0; iPhone 5 Mobile Safari; i Android Samsung Galaxy Tab 2 10.1 4.0. Zgodnie z oczekiwaniami tylko IE8 zgłosiło, że był to IeLessThan9. Miły!
Steve Saporta
58

Aby łatwo wykryć MSIE (v6 - v7 - v8 - v9 - v10 - v11):

if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) {
   // MSIE
}
EpokK
źródło
Przydatny do wykrywania IE10, ponieważ nie obsługuje komentarzy warunkowych. Nie działa w IE11, ale IE11 ogólnie ma dobre zachowanie
personne3000
11
Wreszcie odpowiedź, która nie wykłada na temat używania funkcji wykrywania i faktycznie odpowiada na pytanie.
cdmckay
32

Oto jak AngularJS sprawdza IE

/**
 * documentMode is an IE-only property
 * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
 */
var msie = document.documentMode;

if (msie < 9) {
    // code for IE < 9
}
iurii
źródło
Wow, to jest o wiele prostsze niż wszystkie komentarze warunkowe! Żadnych ograniczeń tego?
andrewb
zgodnie z dokumentacją IE8 + obsługuje tę właściwość, więc myślę, że powinna wystarczyć w większości przypadków.
iurii
Według odwołania do MSDN „Gdy bieżący dokument nie został jeszcze określony, documentMode zwraca wartość zero (0). Zwykle dzieje się to podczas ładowania dokumentu”. Czy to oznacza, że ​​możesz nie otrzymać poprawnej odpowiedzi w skrypcie załadowanym do <head>?
Erik Knowles,
Myślę, że możesz to naprawić, sprawdzając wartość parametru window.onload, gdy dokument jest już załadowany.
iurii
19

Wykrywanie wersji IE przy użyciu funkcji wykrywania funkcji (IE6 +, przeglądarki wcześniejsze niż IE6 są wykrywane jako 6, zwraca wartość null dla przeglądarek innych niż IE):

var ie = (function (){
    if (window.ActiveXObject === undefined) return null; //Not IE
    if (!window.XMLHttpRequest) return 6;
    if (!document.querySelector) return 7;
    if (!document.addEventListener) return 8;
    if (!window.atob) return 9;
    if (!document.__proto__) return 10;
    return 11;
})();

Edycja: Utworzyłem repozytorium bower / npm dla Twojej wygody: wersja

Aktualizacja:

bardziej kompaktową wersję można zapisać w jednym wierszu jako:

return window.ActiveXObject === undefined ? null : !window.XMLHttpRequest ? 6 : !document.querySelector ? 7 : !document.addEventListener ? 8 : !window.atob ? 9 : !document.__proto__ ? 10 : 11;
Gabriel Llamas
źródło
16

Ta funkcja zwróci główny numer wersji IE jako liczbę całkowitą lub undefinedjeśli przeglądarka nie jest Internet Explorerem. To, podobnie jak wszystkie rozwiązania agenta użytkownika, jest podatne na fałszowanie agenta użytkownika (co jest oficjalną funkcją IE od wersji 8).

function getIEVersion() {
    var match = navigator.userAgent.match(/(?:MSIE |Trident\/.*; rv:)(\d+)/);
    return match ? parseInt(match[1]) : undefined;
}
piekarnik
źródło
Owen, jak wykorzystać to w praktyce? Jak pobiera się wartość zwracaną? Próbowałem console.log(!!match && parseInt(match[1])), console.log(parseInt(match[1]))i console.log(match), ale nie wynik z żadnym z nich.
Frank Conijn
Uzyskaj wartość zwracaną, wywołując samą funkcję getIEVersion(). Na przykład:if (getIEVersion() < 9) {/* IE 8 or below */} if (!getIEVersion()) {/* Not IE */}
Owen
15

Wykryj IE w JS za pomocą komentarzy warunkowych

// ----------------------------------------------------------
// A short snippet for detecting versions of IE in JavaScript
// without resorting to user-agent sniffing
// ----------------------------------------------------------
// If you're not in IE (or IE version is less than 5) then:
//     ie === undefined
// If you're in IE (>=5) then you can determine which version:
//     ie === 7; // IE7
// Thus, to detect IE:
//     if (ie) {}
// And to detect the version:
//     ie === 6 // IE6
//     ie > 7 // IE8, IE9 ...
//     ie < 9 // Anything less than IE9
// ----------------------------------------------------------

// UPDATE: Now using Live NodeList idea from @jdalton

var ie = (function(){

    var undef,
        v = 3,
        div = document.createElement('div'),
        all = div.getElementsByTagName('i');

    while (
        div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
        all[0]
    );

    return v > 4 ? v : undef;

}());
jKey
źródło
To prawie tak samo jak moja odpowiedź.
Tim Down
@TimDown: Być może, ale ta odpowiedź jest nieco bardziej kompletna (zawiera numer wersji) i jest dobrze skomentowana. Ponadto link na początku tej odpowiedzi prowadzi do Gist z kilkoma pouczającymi komentarzami i interesującymi odmianami tej techniki.
Alan
@Alan: Sprawiedliwe punkty. Dostosowałem mój do pytania, ale nie podałem źródła.
Tim Down
12

To działa dla mnie. Używam go jako przekierowania do strony, która wyjaśnia, dlaczego nie lubimy <IE9 i zapewnia linki do przeglądarek, które preferujemy.

<!--[if lt IE 9]>
<meta http-equiv="refresh" content="0;URL=http://google.com">
<![endif]-->
iconMatrix
źródło
1
Och, to paskudne. Korzystam z bardziej przyjaznej metody, wyświetlam div z wyglądem ostrzeżenia IE, a kiedy kliknięcie go odwiedzający użytkownik przechodzi do browsehappy.com
Codebeat
10

Twój kod może wykonać sprawdzenie, ale jak myślałeś, jeśli ktoś spróbuje uzyskać dostęp do Twojej strony za pomocą IE v1 lub> v19, nie otrzyma błędu, więc może być bezpieczniej wykonać sprawdzenie za pomocą wyrażenia Regex, takiego jak ten kod poniżej:

var userAgent = navigator.userAgent.toLowerCase();
// Test if the browser is IE and check the version number is lower than 9
if (/msie/.test(userAgent) && 
    parseFloat((userAgent.match(/.*(?:rv|ie)[\/: ](.+?)([ \);]|$)/) || [])[1]) < 9) {
  // Navigate to error page
}
Fong-Wan Chau
źródło
To nie jest dobra odpowiedź. Wąchanie UA jest niewiarygodne. Więcej na ten temat tutaj: modernizr.com/docs
Jezen Thomas,
3
@Jezen Czasami jest sniffing UA: github.com/Modernizr/Modernizr/issues/538
István Ujj-Mészáros
8

Komentarze warunkowe nie są już obsługiwane w IE od wersji 10, jak podano na stronie odniesienia Microsoft .

var ieDetector = function() {
  var browser = { // browser object

      verIE: null,
      docModeIE: null,
      verIEtrue: null,
      verIE_ua: null

    },
    tmp;

  tmp = document.documentMode;
  try {
    document.documentMode = "";
  } catch (e) {};

  browser.isIE = typeof document.documentMode == "number" || eval("/*@cc_on!@*/!1");
  try {
    document.documentMode = tmp;
  } catch (e) {};

  // We only let IE run this code.
  if (browser.isIE) {
    browser.verIE_ua =
      (/^(?:.*?[^a-zA-Z])??(?:MSIE|rv\s*\:)\s*(\d+\.?\d*)/i).test(navigator.userAgent || "") ?
      parseFloat(RegExp.$1, 10) : null;

    var e, verTrueFloat, x,
      obj = document.createElement("div"),

      CLASSID = [
        "{45EA75A0-A269-11D1-B5BF-0000F8051515}", // Internet Explorer Help
        "{3AF36230-A269-11D1-B5BF-0000F8051515}", // Offline Browsing Pack
        "{89820200-ECBD-11CF-8B85-00AA005B4383}"
      ];

    try {
      obj.style.behavior = "url(#default#clientcaps)"
    } catch (e) {};

    for (x = 0; x < CLASSID.length; x++) {
      try {
        browser.verIEtrue = obj.getComponentVersion(CLASSID[x], "componentid").replace(/,/g, ".");
      } catch (e) {};

      if (browser.verIEtrue) break;

    };
    verTrueFloat = parseFloat(browser.verIEtrue || "0", 10);
    browser.docModeIE = document.documentMode ||
      ((/back/i).test(document.compatMode || "") ? 5 : verTrueFloat) ||
      browser.verIE_ua;
    browser.verIE = verTrueFloat || browser.docModeIE;
  };

  return {
    isIE: browser.isIE,
    Version: browser.verIE
  };

}();

document.write('isIE: ' + ieDetector.isIE + "<br />");
document.write('IE Version Number: ' + ieDetector.Version);

następnie użyj:

if((ieDetector.isIE) && (ieDetector.Version <= 9))
{

}
Arnold.Krumins
źródło
1
To była jedyna rzecz, która działała w całej sieci, przynajmniej humano rzeczy, których próbowałem ... dzięki;)
Henrique C.
Ten kod jest dobry, ale nie może wykryć trybu widoku zgodności. Korzystam z IE 11, korzystając z widoku zgodności w IE 8, a ten kod wciąż daje version 11EDIT: Ten kod jest NIESAMOWITY! haha, daje obiekt ze wszystkim w środku. Wersja ma 11, ale docModeIR to 9. Dzięki!
MarceloBarbosa
5

Dla np. 10 i 11:

Możesz użyć js i dodać klasę w html, aby zachować standard komentarzy warunkowych :

  var ua = navigator.userAgent,
      doc = document.documentElement;

  if ((ua.match(/MSIE 10.0/i))) {
    doc.className = doc.className + " ie10";

  } else if((ua.match(/rv:11.0/i))){
    doc.className = doc.className + " ie11";
  }

Lub użyj lib jak Bowser:

https://github.com/ded/bowser

Lub modernizator do wykrywania funkcji:

http://modernizr.com/

Liko
źródło
2
Wypróbowałem kilka skryptów i rozwiązań, ale nic nie działało. Następnie włączyłem Bowser do projektu i to po prostu działało. Tak więc jeden za sugerowanie Bowser.
Moulde,
3

Aby wykryć Internet Explorer 10 | 11, możesz użyć tego małego skryptu natychmiast po tagu body:

W moim przypadku używam biblioteki jQuery załadowanej do głowy.

<!DOCTYPE HTML>
<html>
<head>
    <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
</head>
<body>
    <script>if (navigator.appVersion.indexOf('Trident/') != -1) $("body").addClass("ie10");</script>
</body>
</html>
Brian
źródło
Podoba mi się dzięki, muszę tylko wykryć 10 lub 11, ponieważ nie obsługuję wcześniejszych wersji
Nearpoint
IE9 jest również trójząbny, ale nie taki sam z obsługą CSS. Twoje wykrycie uważa, że ​​wynosi co najmniej 10, ale to nie jest poprawne.
Codebeat
3

Odpowiedzi na śmierć, ale to wszystko, czego potrzebujesz.

!!navigator.userAgent.match(/msie\s[5-8]/i)
Timothy Perez
źródło
Tutaj jest także piaskownica pokazująca wzorzec wyrażenia regularnego względem najbardziej popularnych ciągów agenta użytkownika IE: regex101.com/r/lC6oP3/1
Timothy Perez
@alessadro - Ale tak powinno być, prawda? OP chciał przetestować na <9 ...
nnnnnn
2
var Browser = new function () {
    var self = this;
    var nav = navigator.userAgent.toLowerCase();
    if (nav.indexOf('msie') != -1) {
        self.ie = {
            version: toFloat(nav.split('msie')[1])
        };
    };
};


if(Browser.ie && Browser.ie.version > 9)
{
    // do something
}
Bereż
źródło
2

Według Microsoftu , poniższe jest najlepszym rozwiązaniem, jest również bardzo proste:

function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
    var rv = -1; // Return value assumes failure.
    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 )
    {
        if ( ver >= 8.0 ) 
            msg = "You're using a recent copy of Internet Explorer."
        else
            msg = "You should upgrade your copy of Internet Explorer.";
      }
    alert( msg );
}
AHH
źródło
Rzeczywiście, i na wypadek, gdyby ktoś wylądował tutaj, próbując użyć powyższego, kod w późniejszej odpowiedzi działa dla IE11 ( stackoverflow.com/a/26375930/1129926 ). Ale uwaga, czy to zadziała dla IE12 itp.? Podsumowując, najlepiej jest traktować je jako tymczasowe ataki hakerskie, które później mogą zawieść, gdy zostaną wydane nowe wersje przeglądarki (nawet nie wspomnę o Edge).
Jeff Mergler,
1

Polecam nie przepisywać tego kodu po raz kolejny. Polecam korzystanie z biblioteki Conditionizr ( http://conditionizr.com/ ), która może testować określone wersje IE, a także inne przeglądarki, systemy operacyjne, a nawet obecność lub brak wyświetlaczy Retina.

Dołącz kod tylko dla określonych testów, których potrzebujesz, a zyskasz także korzyść ze sprawdzonej biblioteki, która przeszła wiele iteracji (i którą można łatwo zaktualizować bez uszkodzenia kodu).

Ładnie łączy się również z Modernizr, który może obsłużyć wszystkie te przypadki, w których lepiej jest przetestować pod kątem konkretnych możliwości, a nie konkretnej przeglądarki.

John Munsch
źródło
1

Lubię to:

<script>
   function isIE () {
       var myNav = navigator.userAgent.toLowerCase();
       return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
   }    
   var ua = window.navigator.userAgent;
   //Internet Explorer | if | 9-11

   if (isIE () == 9) {
       alert("Shut down this junk! | IE 9");
   } else if (isIE () == 10){
       alert("Shut down this junk! | IE 10");
   } else if (ua.indexOf("Trident/7.0") > 0) {
       alert("Shut down this junk! | IE 11");
   }else{
       alert("Thank god it's not IE!");
   }

</script>
Julio Cesar Boaroli
źródło
1

Takie podejście do wykrywania IE łączy mocne strony i pozwala uniknąć słabych stron odpowiedzi jKey przy użyciu komentarzy warunkowych i odpowiedzi Owena przy użyciu programów użytkownika.

  • Podejście jKey działa do wersji 9 i jest odporne na fałszowanie agenta użytkownika w IE 8 i 9.
  • Podejście Owena może zawieść w IE 5 i 6 (raportowanie 7) i jest podatne na fałszowanie UA, ale może wykryć wersje IE> = 10 (teraz również 12, które są późniejsze niż odpowiedź Owena).

    // ----------------------------------------------------------
    // A short snippet for detecting versions of IE
    // ----------------------------------------------------------
    // If you're not in IE (or IE version is less than 5) then:
    //     ie === undefined
    // Thus, to detect IE:
    //     if (ie) {}
    // And to detect the version:
    //     ie === 6 // IE6
    //     ie > 7 // IE8, IE9 ...
    // ----------------------------------------------------------
    var ie = (function(){
        var v = 3,
            div = document.createElement('div'),
            all = div.getElementsByTagName('i');
    
        while (
            div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
            all[0]
        );
        if (v <= 4) { // Check for IE>9 using user agent
            var match = navigator.userAgent.match(/(?:MSIE |Trident\/.*; rv:|Edge\/)(\d+)/);
            v = match ? parseInt(match[1]) : undefined;
        }
        return v;
    }());

Można tego użyć do ustawienia użytecznych klas w dokumencie zawierającym wersję IE:

    if (ie) {
        document.documentElement.className += ' ie' + ie;
        if (ie < 9)
            document.documentElement.className += ' ieLT9';
    }

Zauważ, że wykrywa on używany tryb zgodności, jeśli IE jest w trybie zgodności. Zauważ też, że wersja IE jest najbardziej przydatna dla starszych wersji (<10); wyższe wersje są bardziej zgodne ze standardami i prawdopodobnie lepiej zamiast tego sprawdzić funkcje za pomocą czegoś takiego jak modernizr.js.

jtbr
źródło
1

Zrobiłem dla tego wygodny mixin z podkreśleniem.

_.isIE();        // Any version of IE?
_.isIE(9);       // IE 9?
_.isIE([7,8,9]); // IE 7, 8 or 9?

_.mixin({
  isIE: function(mixed) {
    if (_.isUndefined(mixed)) {
      mixed = [7, 8, 9, 10, 11];
    } else if (_.isNumber(mixed)) {
      mixed = [mixed];
    }
    for (var j = 0; j < mixed.length; j++) {
      var re;
      switch (mixed[j]) {
        case 11:
          re = /Trident.*rv\:11\./g;
          break;
        case 10:
          re = /MSIE\s10\./g;
          break;
        case 9:
          re = /MSIE\s9\./g;
          break;
        case 8:
          re = /MSIE\s8\./g;
          break;
        case 7:
          re = /MSIE\s7\./g;
          break;
      }

      if (!!window.navigator.userAgent.match(re)) {
        return true;
      }
    }

    return false;
  }
});

console.log(_.isIE());
console.log(_.isIE([7, 8, 9]));
console.log(_.isIE(11));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

Danrichards
źródło
1

lub po prostu

//   IE 10: ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'; 
//   IE 11: ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'; 
// Edge 12: ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0'; 
// Edge 13: ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586'; 

var isIE = navigator.userAgent.match(/MSIE|Trident|Edge/)
var IEVersion = ((navigator.userAgent.match(/(?:MSIE |Trident.*rv:|Edge\/)(\d+(\.\d+)?)/)) || []) [1]
Giacomo
źródło
0

Najbardziej wszechstronny skrypt JS, który sprawdziłem pod kątem wersji IE, to http://www.pinlady.net/PluginDetect/IE/ . Cała biblioteka znajduje się pod adresem http://www.pinlady.net/PluginDetect/Browsers/ .

W IE10 instrukcje warunkowe nie są już obsługiwane.

W IE11 agent użytkownika nie zawiera już MSIE. Ponadto używanie klienta użytkownika nie jest niezawodne, ponieważ można je zmodyfikować.

Korzystając ze skryptu PluginDetect JS, możesz wykryć IE i wykryć dokładne wersje, używając bardzo konkretnego i dobrze spreparowanego kodu, który jest ukierunkowany na określone wersje IE. Jest to bardzo przydatne, gdy zależy Ci dokładnie na jakiej wersji przeglądarki pracujesz.

PressingOnAlways
źródło
0

Zdaję sobie sprawę, że jestem trochę spóźniony na imprezę tutaj, ale sprawdziłem prosty, jednoliniowy sposób, aby przekazać opinię na temat tego, czy przeglądarka jest IE i jaka była wersja od 10 w dół. Nie kodowałem tego dla wersji 11, więc być może potrzebna będzie niewielka poprawka.

Jest to jednak kod, który działa jak obiekt, który ma właściwość i metodę i opiera się na wykrywaniu obiektu, a nie na skrobaniu obiektu nawigatora (który jest bardzo wadliwy, ponieważ może zostać sfałszowany).

var isIE = { browser:/*@cc_on!@*/false, detectedVersion: function () { return (typeof window.atob !== "undefined") ? 10 : (typeof document.addEventListener !== "undefined") ? 9 : (typeof document.querySelector !== "undefined") ? 8 : (typeof window.XMLHttpRequest !== "undefined") ? 7 : (typeof document.compatMode !== "undefined") ? 6 : 5; } };

Użycie jest isIE.browserwłaściwością, która zwraca wartość logiczną i opiera się na komentarzach warunkowych, isIE.detectedVersion()która zwraca liczbę od 5 do 10. Przyjmuję założenie, że cokolwiek poniżej 6 i jesteś na poważnym terenie starej szkoły i będziesz miał coś bardziej mięsistego niż jeden liniowiec i wszystko powyżej 10 i jesteś na nowym terytorium. Przeczytałem coś o IE11, który nie obsługuje komentarzy warunkowych, ale nie w pełni zbadałem, to może na później.

W każdym razie, tak jak jest, i dla jednej linijki, obejmie podstawy przeglądarki IE i wykrywania wersji. Jest daleki od ideału, ale jest mały i łatwo go zmienić.

Tylko w celach informacyjnych, a jeśli ktoś ma jakiekolwiek wątpliwości, jak to zaimplementować, pomocne powinny być następujące warunki.

var isIE = { browser:/*@cc_on!@*/false, detectedVersion: function () { return (typeof window.atob !== "undefined") ? 10 : (typeof document.addEventListener !== "undefined") ? 9 : (typeof document.querySelector !== "undefined") ? 8 : (typeof window.XMLHttpRequest !== "undefined") ? 7 : (typeof document.compatMode !== "undefined") ? 6 : 5; } };

/* testing IE */

if (isIE.browser) {
  alert("This is an IE browser, with a detected version of : " + isIE.detectedVersion());
}
Ric
źródło
0

Wykrywanie IE i jego wersji nie może być łatwiejsze, a wszystko czego potrzebujesz to trochę natywnego / waniliowego Javascript:

var uA = navigator.userAgent;
var browser = null;
var ieVersion = null;

if (uA.indexOf('MSIE 6') >= 0) {
    browser = 'IE';
    ieVersion = 6;
}
if (uA.indexOf('MSIE 7') >= 0) {
    browser = 'IE';
    ieVersion = 7;
}
if (document.documentMode) { // as of IE8
    browser = 'IE';
    ieVersion = document.documentMode;
}

I to jest sposób na to:

if (browser == 'IE' && ieVersion <= 9) 
    document.documentElement.className += ' ie9-';

.

Działa we wszystkich wersjach IE, w tym wyższych wersjach w niższym widoku / trybie zgodności, i documentModejest zastrzeżony dla IE.

Frank Conijn
źródło
0

Jeśli chcesz usunąć wersję przeglądarki IE, możesz wykonać poniższy kod. Ten kod działa dobrze dla wersji IE6 na IE11

<!DOCTYPE html>
<html>
<body>

<p>Click on Try button to check IE Browser version.</p>

<button onclick="getInternetExplorerVersion()">Try it</button>

<p id="demo"></p>

<script>
function getInternetExplorerVersion() {
   var ua = window.navigator.userAgent;
        var msie = ua.indexOf("MSIE ");
        var rv = -1;

        if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./))      // If Internet Explorer, return version number
        {               
            if (isNaN(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))))) {
                //For IE 11 >
                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);
                        alert(rv);
                    }
                }
                else {
                    alert('otherbrowser');
                }
            }
            else {
                //For < IE11
                alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
            }
            return false;
        }}
</script>

</body>
</html>
Nimesh
źródło
0

Uruchomione okno IE10 będzie automatycznie aktualizować do IE11 + i będzie znormalizowane W3C

Obecnie nie musimy obsługiwać IE8

    <!DOCTYPE html>
    <!--[if lt IE 9]><html class="ie ie8"><![endif]-->
    <!--[if IE 9]><html class="ie ie9"><![endif]-->
    <!--[if (gt IE 9)|!(IE)]><!--><html><!--<![endif]-->
    <head>
        ...
        <!--[if lt IE 8]><meta http-equiv="Refresh" content="0;url=/error-browser.html"><![endif]--
        ...
    </head>
xicooc
źródło
0
var isIE9OrBelow = function()
{
   return /MSIE\s/.test(navigator.userAgent) && parseFloat(navigator.appVersion.split("MSIE")[1]) < 10;
}
xicooc
źródło
0
if (!document.addEventListener) {
    // ie8
} else if (!window.btoa) {
    // ie9
}
// others
Bruce
źródło