Wykrywanie JavaScript IE, dlaczego nie użyć prostych komentarzy warunkowych? [duplikat]

to pytanie ma już odpowiedzi tutaj : Sprawdź czy użytkownik używa IE (31 odpowiedzi) Zamknięte 1 rok temu .

W celu wykrycia IE większość bibliotek Javascript wykonuje wszelkiego rodzaju sztuczki.

    JQuery wydaje się dodawać tymczasowy obiekt do DOM stron w celu wykrycia niektórych funkcji.]}
  • YUI2 wykonuje regex na user agencie w jego YAHOO.env.ua = function() (Plik yahoo.js)

Po przeczytaniu ta odpowiedź przyszło mi do głowy, że to prawda, aby wykryć po prostu IE w Javascript możemy po prostu dodać do naszych stron:

<!--[if IE]><script type="text/javascript">window['isIE'] = true;</script><![endif]-->

<script type="text/javascript" src="all-your-other-scripts-here.js"></script>

Teraz zmienna window.isIE jest ustaw dla całego naszego kodu Javascript, po prostu wykonując:

if(window.isIE)
   ...

Poza tym, że może to spowodować ból, ponieważ musi być dodany na wszystkich stronach, czy są jakieś problemy/rozważania, których mogę być nieświadomy?


FYI: wiem, że lepiej jest użyć wykrywania obiektów zamiast wykrywania przeglądarki , ale są przypadki, w których nadal musisz użyć wykrywania przeglądarki.

Author: Community, 2010-11-12

15 answers

James Padolsey umieścił mały fragment na Githubie, który zacytuję tutaj:

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

}());

Oczywiście wszystkie napisy powinny iść do Jamesa, jestem tylko posłańcem (ale proszę Zastrzel Posłańca, jeśli moja akcja Kopiuj-Wklej się pomyliła).

Spójrz także na widelce, które zostały stworzone. Paul Irish wyjaśnił wewnętrzne funkcjonowanie w komentarz .

 58
Author: Marcel Korpel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-19 18:33:11

Jeśli chcesz to zrobić w ten sposób, myślę, że o wiele lepiej jest użyć kompilacji warunkowej, ponieważ możesz to zrobić wewnątrz javascript bez konieczności zmiany html:

var isIE = /*@cc_on!@*/false;
 39
Author: AlfonsoML,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-12 21:40:15

ODPOWIEDŹ Marcela Korpela już nie działa(w IE 10 zwraca undef, więc IE 10 wydaje się nie być IE). Uwaga: teraz zaktualizowany do pracy z IE 11 również.

Jest to wariant tego kodu, ale który pochodzi z zaleceń Microsoftu . Jeśli używałeś poprzedniego kodu, możesz po prostu wpaść w ten zamiennik, ponieważ jest zbudowany tak, aby nazywać się dokładnie w ten sam sposób.

W przeciwieństwie do komentarzy warunkowych / kompilacji, powinna również działać dobrze z minimizery.

// ----------------------------------------------------------
// 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, IE10 ...
// ie < 9 // Anything less than IE9
// ----------------------------------------------------------
var ie = (function(){
    var undef,rv = -1; // Return value assumes failure.
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf('MSIE ');
    var trident = ua.indexOf('Trident/');

    if (msie > 0) {
        // IE 10 or older => return version number
        rv = parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
    } else if (trident > 0) {
        // IE 11 (or newer) => return version number
        var rvNum = ua.indexOf('rv:');
        rv = parseInt(ua.substring(rvNum + 3, ua.indexOf('.', rvNum)), 10);
    }

    return ((rv > -1) ? rv : undef);
}());

zaktualizowany do pracy z IE11. Dzięki "acarlon" za wskazanie, że nie działa, a "mario" za Kod, na którym oparłem poprawkę!

 26
Author: Sean Colombo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-06 15:42:51

IE 11 wiele się zmieniło i obecnie wiele wcześniejszych metod wykrywania przeglądarki nie działa. Poniższy kod działa dla IE 11 i wcześniejszych.

function isIE()
{
    var isIE11 = navigator.userAgent.indexOf(".NET CLR") > -1;      
    var isIE11orLess = isIE11 || navigator.appVersion.indexOf("MSIE") != -1;
    return isIE11orLess;
}
 11
Author: webber55,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-02 10:52:02

Myślę, że mam to, czego szukasz. Możesz uzyskać pełną wersję Internet Explorera jako ciąg znaków "AA. BB. CCCC. DDDD" za pomocą Javascript i clientCaps.

Http://www.pinlady.net/PluginDetect/IE/

Wydaje się działać dla IE 5.5 i wyższych (w tym IE 10). Jest odporny na nawigatora.tryb userAgent / document mode / browser mode. Nie ma potrzeby dodawania komentarzy warunkowych ani żadnych dodatkowych elementów HTML. Jest to czyste rozwiązanie Javascript.

Nie jestem pewien w tym razem jak IE Mobile zachowuje się, ale zawsze możesz użyć metody wykrywania kopii zapasowej w przypadku, gdy ta metoda clientCaps zawiedzie.

Jak na razie, muszę powiedzieć, że działa całkiem nieźle.

 6
Author: Eric Gerds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-21 13:59:48

Myślę, że odpowiedziałeś na własne pytanie: najpierw wykrywa TYLKO IE, więc skrypt w istocie podzieliłby wszechświat przeglądarek na 2 części: IE i .

Po drugie, musisz dodać zwariowany komentarz do każdej strony HTML. Biorąc pod uwagę, że szeroko zakrojone biblioteki JavaScript, takie jak jQuery i YUI, muszą być "łatwe" do wstawienia/wykorzystania dla szerokiego zakresu witryn, automatycznie sprawisz, że będą trudniejsze do wykorzystania poza bramą.

 4
Author: jmbucknall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-12 21:45:24

navigator.userAgent istnieje, jeśli wykrywanie przeglądarki (a nie wykrywanie funkcji) jest naprawdę potrzebne, a jQuery używa go do uzyskania informacji o obiekcie $.browser. Jest to o wiele ładniejsze niż dołączanie komentarza warunkowego specyficznego dla IE na każdej stronie.

 3
Author: PleaseStand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-12 21:34:57

Tutaj znajdziesz kilka naprawdę prostych hacków do wykrywania przeglądarek: http://www.thespanner.co.uk/2009/01/29/detecting-browsers-javascript-hacks/

var isIE = IE='\v'=='v';
 2
Author: yckart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-18 23:08:15

Używam tego kodu

Var isIE = Nawigator.userAgent.indexOf ('MSIE') > -1;

 2
Author: Viktor Fursov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-16 14:46:05
var version = navigator.userAgent.match(/(msie) (\d+)/i);
console.log(version);

Coś szybkiego napisałem szybko Po spojrzeniu na to pytanie, na wypadek gdyby ktoś chciał.

** EDIT * *

Per Johnny Darvall ' s komentarz poniżej, dodaję link dla każdego, kto próbuje wywęszyć Internet Explorer 11:

Http://blogs.msdn.com/b/ieinternals/archive/2013/09/21/internet-explorer-11-user-agent-string-ua-string-sniffing-compatibility-with-gecko-webkit.aspx

 2
Author: Jacksonkr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-13 22:02:11

Sprawdzanie przeglądarek to zły pomysł - zamiast tego lepiej sprawdzić funkcje przeglądarki . Na przykład zazwyczaj sprawdzasz, czy użytkownik używa IE, ponieważ chcesz użyć jakiejś funkcji nie obsługiwanej w IE. Czy jednak wiesz, że wszystkie obecne i przyszłe przeglądarki spoza IE będą obsługiwać tę funkcję? Nie. Tak więc sposób np. używany przez jQuery jest lepszy: tworzy i wykonuje małe testy sprawdzające pewne błędy / funkcje - i możesz po prostu sprawdzić rzeczy takie jak if(browser_supports_XYZ) zamiast sprawdzania, czy użytkownik korzysta z określonej przeglądarki.

W każdym razie zawsze są przypadki, w których sprawdzanie przeglądarki jest konieczne, ponieważ jest to błąd wizualny, którego nie można przetestować pod kątem użycia skryptu. W tym przypadku lepiej jest użyć javascript zamiast komentarzy warunkowych, ponieważ masz sprawdzanie przeglądarki bezpośrednio w miejscu, w którym tego potrzebujesz, a nie w innym miejscu (wyobraź sobie .plik js, w którym sprawdzasz czy isIE nigdy nie jest zdefiniowane w tym pliku)

 1
Author: ThiefMaster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-12 21:41:13

W moim przypadku użycia, naprawdę muszę tylko wykryć, czy jest niższa niż IE9, więc używam

if (document.body.style.backgroundSize === undefined && navigator.userAgent.indexOf('MSIE') > -1)
{
//IE8- stuff
}
 0
Author: chiliNUT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-08 00:14:08
  • zanieczyszcza globalną przestrzeń nazw
  • wymaga zmian w dwóch plikach.
  • działa tylko w IE
  • technicznie, komentarz warunkowy jest nadal komentarzem
 -1
Author: user123444555621,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-12 21:48:03

To działa całkiem dobrze.,
var isIe = !!window.ActiveXObject;

 -1
Author: Ewen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-24 23:40:45

Dlaczego po prostu nie zaprogramujesz w HTML5 i nie sprawdzisz tego

if ( window.navigator.product !== "Gecko" )

?? Prawda, że będzie to zawierać IE11 w grupie "Gecko" , ale czy to nie powinno być wystarczająco dobre?

Uwaga: Specyfikacja HTML5. mówi ten Nawigator.produkt musi zwrócić "Gecko"... a IE10 i wcześniej wszystkie zwracają coś innego.

 -1
Author: Douglas Held,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-03 16:14:58