Лучший способ проверить IE менее 9 в JavaScript без библиотеки
каков был бы ваш самый быстрый, самый короткий (лучший) способ обнаружения браузера, который является IE и версией менее 9 в JavaScript, без использования jQuery или каких-либо дополнительных библиотек?
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>"); }