Каким будет ваш самый быстрый, самый короткий (лучший) способ обнаружения браузера, который является IE и версии менее 9 в JavaScript, без использования jQuery или каких-либо дополнительных библиотек?
Лучший способ проверить IE менее 9 в JavaScript без библиотеки
Ответ 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 в других. Затем мы преобразуем его в логическое и обратное значение с помощью!. Просто. Кстати, мы можем использовать более короткую версию без! знак, но значение будет отменено.
Это самый короткий взлом. И я автор;)
Ответ 7
Я решил пойти с обнаружением объекта.
После прочтения этого: http://www.quirksmode.org/js/support.html и это: http://diveintohtml5.ep.io/detect.html#canvas
Я бы использовал что-то вроде
if(!!document.createElement('canvas').getContext) alert('what is needed, supported');
Ответ 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>");
}