Яким би був ваш найшвидший, найкоротший (найкращий) спосіб виявити браузер, який має IE та версію менше 9 у JavaScript, без використання jQuery чи будь-яких додаткових бібліотек?
Яким би був ваш найшвидший, найкоротший (найкращий) спосіб виявити браузер, який має IE та версію менше 9 у JavaScript, без використання jQuery чи будь-яких додаткових бібліотек?
Відповіді:
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
while
синтаксис? Або якийсь хак?
all[0]
(яке є першим <i>
у div). Поки результат "істинний" ( <i>
знайдено), він піднімається вгору за версією IE і продовжує далі.
за свою ціну:
if( document.addEventListener ){
alert("you got IE9 or greater");
}
Це успішно націлено на IE 9+, оскільки addEventListener
метод дуже рано підтримувався для кожного основного браузера, крім IE. (Chrome, Firefox, Opera та Safari) Довідник MDN . В даний час він підтримується в IE9, і ми можемо очікувати, що він і надалі підтримуватиметься тут.
var ltIE9 = !document.addEventListener;
document.addEventListener
. Умовні коментарі IE щодо цього не захищені.
if( !document.attachEvent){ // IE8+ }
Використовуючи умовні коментарі, ви можете створити блок сценарію, який буде виконуватися лише в IE менше 9.
<!--[if lt IE 9 ]>
<script>
var is_ie_lt9 = true;
</script>
<![endif]-->
Звичайно, ви можете передувати цьому блоку універсальним блоком, який оголошує var is_ie_lt9=false
, що це замінить для IE менше 9. (У такому випадку ви хочете видалити var
декларацію, оскільки вона буде повторюваною).
РЕДАГУВАТИ : Ось версія, яка не покладається на вбудовані блоки скриптів (можна запустити із зовнішнього файлу), але не використовує внюхування агента користувача:
Через @cowboy :
with(document.createElement("b")){id=4;while(innerHTML="<!--[if gt IE "+ ++id+"]>1<![endif]-->",innerHTML>0);var ie=id>5?+id:0}
бах до умовних коментарів! Умовний код до кінця !!! (нерозумно IE)
<script type="text/javascript">
/*@cc_on
var IE_LT_9 = (@_jscript_version < 9);
@*/
</script>
Якщо серйозно, просто викиньте це на випадок, якщо вам більше підходить ... це одне і те ж, це може бути просто у файлі .js замість вбудованого HTML
Примітка: абсолютно випадково, що тут перевірка jscript_version має значення "9". Встановивши його на 8, 7 тощо не буде перевіряти "це IE8", вам потрібно буде переглянути версії jscript для цих браузерів.
IE_LT_9 == false
в IE9 та true
в IE8. Зараз я використовую mac, і тут у мене немає ПК, тому я не можу його перевірити, але я витягнув це з коду, який я написав, що знаю, що працює. Якщо з якихось причин це не працює, alert(@_jscript_version)
подивіться, що ви отримаєте, і налаштуйте звідти.
Нижче наведено вдосконалення щодо рішення Джеймса Падолсі:
1) Це не забруднює пам’ять (наприклад, фрагмент Джеймса створює 7 невилучених фрагментів документа при виявленні IE11).
2) Це швидше, оскільки він перевіряє значення documentMode перед створенням розмітки.
3) Це набагато читабельніше, особливо для початківців програмістів JavaScript.
Посилання на суть: 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.
Як це працює : тобто движок трактує масив з порожнім елементом (наприклад, [, 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.');
}
На вашому місці я б використовував умовну компіляцію або виявлення функцій.
Ось ще одна альтернатива:
<!--[if lt IE 9]><!-->
<script>
var LTEIE8 = true;
</script>
<!--<![endif]-->
Мені сподобалась відповідь Майка Льюїса, але код не пройшов jslint, і я не міг зрозуміти фанкі цикл while. Моїм випадком використання є виведення повідомлення, яке не підтримується браузером, якщо воно менше або дорівнює 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
}
/MSIE\s(\d+)/.exec(navigator.userAgent)
null
тому в такому випадку ||0
переключиться null
на0
[1]
отримає основну версію IE, або undefined
якщо це не браузер IE+
перетворить його в число, undefined
перетвориться наNaN
NaN
з числом завжди повернетьсяfalse
Ви всі намагаєтесь ускладнити такі прості речі. Просто використовуйте простий і простий умовний коментар JScript. Це найшвидше, оскільки він додає нульовий код у браузери, що не належать до IE, для виявлення, і він має сумісність, що сягає версій IE до того, як підтримувались умовні коментарі HTML. Коротко,
var IE_version=(-1/*@cc_on,@_jscript_version@*/);
Остерігайтеся мініфайерів: більшість (якщо не всі) помилково приймуть спеціальний умовний коментар за звичайний коментар і видалять його
По суті, тоді код вище встановлює значення 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>");
}