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


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

14 77

14 ответов:

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

для чего это стоит:

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

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

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

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

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

EDIT: вот версия, которая не зависит от встроенных блоков скрипта (может быть запущена из внешнего файл), но не использует нюхание агента пользователя:

через @cowboy:

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

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

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

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

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

ниже соответствующего показателя за решение Джеймс Padolsey это:

1) он не загрязняет память (фрагмент Джеймса создает 7 неотправленных фрагментов документа при обнаружении IE11, например).
2) это быстрее, так как он проверяет значение documentMode перед созданием разметки.
3) это гораздо более разборчиво, особенно для начинающих программистов 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;
})();
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 в других. Чем мы преобразуем его в логическое и обратное значение с !. Простой. Кстати, мы можем использовать более короткую версию без ! знак, но значение будет отменено.

Это самый короткий Хак на данный момент. А я-автор ;)

Я решил пойти с обнаружением объекта.

после прочтения этого: http://www.quirksmode.org/js/support.html и это: http://diveintohtml5.ep.io/detect.html#canvas

Я бы использовал что-то вроде

if(!!document.createElement('canvas').getContext) alert('what is needed, supported');

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

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

пример:

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

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

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

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

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

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

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

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

Мне понравился ответ Майка Льюиса, но код не прошел 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);
    }
}());
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

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

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

остерегайтесь minifiers: большинство (если не все) будет ошибкой специальные условные комментарии для регулярные комментарии, и удалить это

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

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