Najlepszy sposób na sprawdzenie IE mniej niż 9 w JavaScript bez biblioteki

Jaki byłby twój najszybszy, najkrótszy (najlepszy) sposób wykrycia przeglądarki, która jest IE i wersja mniej niż 9 w JavaScript, bez użycia jQuery lub żadnych bibliotek dodatków?

Author: bcm, 2011-04-07

14 answers

Javascript

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;

}());

Możesz wtedy zrobić:

ie < 9

By James Panolsey from here: http://james.padolsey.com/javascript/detect-ie-in-js-using-conditional-comments

 118
Author: Mike Lewis,
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-04-07 01:22:16

Na ile to jest warte:

    if(  document.addEventListener  ){
        alert("you got IE9 or greater");
    }

To z powodzeniem działa na IE 9+, ponieważ metoda addEventListener była obsługiwana bardzo wcześnie dla każdej większej przeglądarki oprócz IE. (Chrome, Firefox, Opera i Safari) MDN Reference. Jest on obecnie obsługiwany w IE9 i możemy się spodziewać, że będzie nadal obsługiwany tutaj.

 98
Author: vector,
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-12-16 19:05:05

Używając komentarzy warunkowych, możesz utworzyć blok skryptów, który będzie wykonywany tylko w IE poniżej 9.

<!--[if lt IE 9 ]>
<script>
var is_ie_lt9 = true;
</script>
<![endif]--> 

Oczywiście, można poprzedzić ten blok uniwersalnym blokiem, który deklaruje var is_ie_lt9=false, który to zastąpi dla IE mniej niż 9. (W takim przypadku należy usunąć deklarację var, ponieważ będzie ona powtarzalna).

EDIT: Oto wersja, która nie opiera się na wbudowanych blokach skryptów( może być uruchamiana z zewnętrznego pliku), ale nie używa agenta użytkownika sniffing:

Via @cowboy :

with(document.createElement("b")){id=4;while(innerHTML="<!--[if gt IE "+ ++id+"]>1<![endif]-->",innerHTML>0);var ie=id>5?+id:0}
 27
Author: Yahel,
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-04-08 15:55:13

Bah do komentarzy warunkowych! Kod warunkowy do końca!!! (silly IE)

<script type="text/javascript">
/*@cc_on
   var IE_LT_9 = (@_jscript_version < 9);
@*/
</script>
Poważnie, wyrzucę to na wszelki wypadek... to to samo, to może być tylko wplik js zamiast inline HTML

Uwaga: jest całkowicie przypadkowe, że sprawdzenie jscript_version to "9". Ustawienie go na 8, 7, itd nie sprawdzi "is IE8" ,trzeba będzie wyszukać wersje jscript dla tych przeglądarek.

 10
Author: Mark Kahn,
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-04-07 01:41:25

Poniżej jest poprawa w stosunku do rozwiązania Jamesa Padolseya:

1) nie zanieczyszcza pamięci (fragment Jamesa tworzy 7 nieodwracalnych fragmentów dokumentu podczas wykrywania IE11, na przykład).
2) jest szybszy, ponieważ sprawdza wartość documentMode przed wygenerowaniem znaczników.
3) jest o wiele bardziej czytelny, szczególnie dla początkujących programistów JavaScript.

Gist link: https://gist.github.com/julianshapiro/9098609

/*
 - Behavior: For IE8+, we detect the documentMode value provided by Microsoft.
 - Behavior: For <IE8, we inject conditional comments until we detect a match.
 - Results: In IE, the version is returned. In other browsers, false is returned.
 - Tip: To check for a range of IE versions, use if (!IE || IE < MAX_VERSION)...
*/

var IE = (function() { 
    if (document.documentMode) {
        return document.documentMode;
    } else {
        for (var i = 7; i > 0; i--) {
            var div = document.createElement("div");

            div.innerHTML = "<!--[if IE " + i + "]><span></span><![endif]-->";

            if (div.getElementsByTagName("span").length) {
                return i;
            }
        }
    }

    return undefined;
})();
 9
Author: execution,
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-02-27 17:45:33
var ie = !-[1,]; // true if IE less than 9

Ten hack jest obsługiwany w ie5,6,7, 8. Jest on ustalony w ie9+ (więc odpowiada wymaganiom tego pytania). Ten hack działa we wszystkich trybach kompatybilności IE.

Jak to działa: ie engine traktuje tablicę z pustym elementem (jak Ta [,1]) jako tablicę z dwoma elementami, zamiast tego inne przeglądarki myślą, że jest tylko jeden element. Więc kiedy przekonwertujemy tę tablicę na liczbę z operatorem + robimy coś takiego: (', 1' w ie / '1' w innych)*1 i otrzymujemy NaN w ie i 1 w innych. Niż zamieniamy go na boolean i odwracamy wartość z !. Proste. Przy okazji możemy użyć krótszej wersji bez ! znak, ale wartość zostanie odwrócona.

To jest najkrótszy hack do tej pory. A ja jestem autorem;)

 8
Author: Aleko,
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-06-03 15:08:08

Zdecydowałem się na wykrywanie obiektów.

Po przeczytaniu tego: http://www.quirksmode.org/js/support.html i to: http://diveintohtml5.ep.io/detect.html#canvas

Użyłbym czegoś takiego

if(!!document.createElement('canvas').getContext) alert('what is needed, supported');
 6
Author: bcm,
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-10-08 20:48:46

Ten link zawiera istotne informacje o wykrywaniu wersji programu Internet Explorer:

Http://tanalin.com/en/articles/ie-version-js/

Przykład:

if (document.all && !document.addEventListener) {
    alert('IE8 or older.');
}
 5
Author: Michael Benin,
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-04-23 18:41:31

Można to zrobić w szybki i brudny sposób za pomocą wyrażenia regularnego i .match():

if (navigator.userAgent.match(/MSIE\s(?!9.0)/)) {
    // ie less than version 9
}
 4
Author: Alex,
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-04-07 01:22:51

Na Twoim miejscu użyłbym kompilacji warunkowej lub detekcji funkcji.
Oto inna alternatywa:

<!--[if lt IE 9]><!-->
<script>
    var LTEIE8 = true;
</script>
<!--<![endif]-->
 4
Author: Knu,
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-09 00:01:44

Czy trzeba to robić w JavaScript?

Jeśli nie, możesz użyć specyficznej dla IE składni komentarza warunkowego:

<!--[if lt IE 9]><h1>Using IE 8 or lower</h1><![endif]-->
 2
Author: LukeH,
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-04-07 01:23:02

Spodobała mi się odpowiedź Mike ' a Lewisa, ale kod nie przeszedł jslint i nie mogłem zrozumieć pętli funky while. Moim przypadkiem użycia jest umieszczenie komunikatu przeglądarki nieobsługiwanej, jeśli jest mniejszy lub równy IE8.

Oto darmowa wersja jslinta oparta na Mike ' u Lewisie:

/*jslint browser: true */
/*global jQuery */
(function () {
    "use strict";
    var browserNotSupported = (function () {
        var div = document.createElement('DIV');
        // http://msdn.microsoft.com/en-us/library/ms537512(v=vs.85).aspx
        div.innerHTML = '<!--[if lte IE 8]><I></I><![endif]-->';
        return div.getElementsByTagName('I').length > 0;
    }());
    if (browserNotSupported) {
        jQuery("html").addClass("browserNotSupported").data("browserNotSupported", browserNotSupported);
    }
}());
 2
Author: Doug,
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-08-25 22:48:03
if (+(/MSIE\s(\d+)/.exec(navigator.userAgent)||0)[1] < 9) {
    // IE8 or less
}
  • wyodrębnij wersję IE z: /MSIE\s(\d+)/.exec(navigator.userAgent)
  • Jeśli nie jest to przeglądarka IE zwróci null więc w takim przypadku ||0 zmieni to null na 0
  • [1] dostanie główną wersję IE lub undefined jeśli nie była to przeglądarka IE
  • początek + zamieni ją na liczbę, undefined zamieni na NaN
  • porównanie NaN z liczbą zawsze zwróci false
 1
Author: Ivan,
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
2016-09-08 17:51:59

Wszyscy próbujecie skomplikować tak proste rzeczy. Wystarczy użyć zwykłego i prostego komentarza warunkowego JScript. Jest najszybszy, ponieważ dodaje zero kodu do przeglądarek innych niż IE w celu wykrycia i ma kompatybilność sięgającą wersji IE przed wspieraniem komentarzy warunkowych HTML. W skrócie,

var IE_version=(-1/*@cc_on,@_jscript_version@*/);

Uwaga na minifiery: większość (jeśli nie wszystkie) pomyli specjalny komentarz warunkowy z zwykłym komentarzem i usunie go

Zasadniczo, wtedy powyżej kod ustawia wartość IE_version na wersję IE, której używasz, lub -1 f nie używasz IE. Pokaz NA ŻYWO:

var IE_version=(-1/*@cc_on,@_jscript_version@*/);
if (IE_version!==-1){
    document.write("<h1>You are using Internet Explorer " + IE_version + "</h1>");
} else {
    document.write("<h1>You are not using a version of Internet Explorer less than 11</h1>");
}
 0
Author: ,
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
2017-04-22 23:46:58