Лучший способ проверить IE менее 9 в JavaScript без библиотеки

Каким будет ваш самый быстрый, самый короткий (лучший) способ обнаружения браузера, который является IE и версии менее 9 в JavaScript, без использования jQuery или каких-либо дополнительных библиотек?

Ответ 1

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;

}());

Затем вы можете:

ie < 9

Джеймс Панольси: http://james.padolsey.com/javascript/detect-ie-in-js-using-conditional-comments

Ответ 2

за что стоит:

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

Это успешно нацелено на IE 9+, потому что метод addEventListener был поддержан очень рано для каждого главного браузера, кроме IE. (Chrome, Firefox, Opera и Safari) Справочник по MDN. Он поддерживается в настоящее время в IE9, и мы можем ожидать продолжения поддержки здесь.

Ответ 3

Используя условные комментарии, вы можете создать блок script, который будет выполняться только в IE менее 9.

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

Конечно, вы могли бы предшествовать этому блоку с универсальным блоком, объявляющим var is_ie_lt9=false, который это переопределит для IE менее 9. (В этом случае вам нужно удалить объявление var, так как оно будет повторяться).

РЕДАКТИРОВАТЬ: здесь версия, которая не полагается на встроенные script блоки (может быть запущена из внешнего файла), но не использует нюхание агента пользователя:

Через @cowboy:

with(document.createElement("b")){id=4;while(innerHTML="<!--[if gt IE "+ ++id+"]>1<![endif]-->",innerHTML>0);var ie=id>5?+id:0}

Ответ 4

bah к условным комментариям! Условный код полностью! (глупый IE)

<script type="text/javascript">
/*@cc_on
   var IE_LT_9 = (@_jscript_version < 9);
@*/
</script>

Серьезно, хотя, просто бросая это на случай, если вам будет лучше... они то же самое, это может быть только в .js файле вместо встроенного HTML

Примечание: совершенно случайно, что проверка jscript_version здесь "9". Установка 8, 7 и т.д. НЕ проверяет "это IE8", вам нужно будет искать версии jscript для этих браузеров.

Ответ 5

Ниже приводится улучшение по сравнению с решением Джеймса Падолси:

1) Это не загрязняет память (фрагмент Джеймса создает 7 неуправляемых фрагментов документа при обнаружении IE11, например).
2) Это быстрее, поскольку он проверяет значение documentMode перед генерированием разметки.

3) Это гораздо более разборчиво, особенно для начинающих программистов JavaScript.

Ссылка Gist: 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;
})();

Ответ 6

var ie = !-[1,]; // true if IE less than 9

Этот взлом поддерживается в ie5,6,7,8. Он фиксируется в ie9 + (поэтому он удовлетворяет требованиям этого вопроса). Этот хак работает во всех режимах совместимости IE.

Как работает: ie engine обрабатывает массив с пустым элементом (например, [, 1]) как массив с двумя элементами, а другие браузеры считают, что есть только один элемент. Поэтому, когда мы преобразуем этот массив в число с оператором +, мы делаем что-то вроде этого: (', 1' в ie/'1' в других) * 1 и получаем NaN в ie и 1 в других. Затем мы преобразуем его в логическое и обратное значение с помощью!. Просто. Кстати, мы можем использовать более короткую версию без! знак, но значение будет отменено.

Это самый короткий взлом. И я автор;)

Ответ 8

Эта ссылка содержит релевантную информацию об обнаружении версий Internet Explorer:

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

Пример:

if (document.all && !document.addEventListener) {
    alert('IE8 or older.');
}

Ответ 9

Вы можете сделать это быстрым и грязным способом с регулярным выражением и .match():

if (navigator.userAgent.match(/MSIE\s(?!9.0)/)) {
    // ie less than version 9
}

Ответ 10

Если бы я был вами, я бы использовал условную компиляцию или функцию обнаружения.
Вот еще одна альтернатива:

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

Ответ 11

Нужно ли это делать в JavaScript?

Если нет, вы можете использовать синтаксис условного комментария, специфичный для IE:

<!--[if lt IE 9]><h1>Using IE 8 or lower</h1><![endif]-->

Ответ 12

Мне понравился ответ Майка Льюиса, но код не прошел jslint, и я не мог понять фанковый цикл. Моим вариантом использования является размещение не поддерживаемого браузера сообщения, если оно меньше или равно IE8.

Вот бесплатная версия jslint на основе Майка Льюиса:

/*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);
    }
}());

Ответ 13

if (+(/MSIE\s(\d+)/.exec(navigator.userAgent)||0)[1] < 9) {
    // IE8 or less
}
  • извлечение версии IE с помощью: /MSIE\s(\d+)/.exec(navigator.userAgent)
  • если это не-IE-браузер, это вернет null, поэтому в этом случае ||0 переключит это значение null на 0
  • [1] получит основную версию IE или undefined, если это не браузер IE
  • ведущий + преобразует его в число, undefined будет преобразован в NaN
  • сравнение NaN с номером всегда будет возвращать false

Ответ 14

Вы все пытаетесь перекомплементировать такие простые вещи. Просто используйте простой и простой условный комментарий JScript. Это самый быстрый из-за того, что он добавляет нулевой код в не-IE-браузеры для обнаружения, и у него есть совместимость, относящаяся к версиям IE до того, как были учтены условные комментарии HTML. Короче говоря,

var IE_version=(-1/*@cc_on,@[email protected]*/);

Остерегайтесь minifiers: most (if not all) будет ошибочно принимать специальный условный комментарий для обычного комментария и удалять его

В принципе, тогда код выше устанавливает значение IE_version в версию IE, которую вы используете, или -1f вы не используете IE. Живая демонстрация:

var IE_version=(-1/*@cc_on,@[email protected]*/);
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>");
}