Як виявити IE11?


212

Коли я хочу виявити IE, я використовую цей код:

function getInternetExplorerVersion()
{
  var rv = -1;
  if (navigator.appName == 'Microsoft Internet Explorer')
  {
    var ua = navigator.userAgent;
    var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  return rv;
}
function checkVersion()
{
  var msg = "You're not using Internet Explorer.";
  var ver = getInternetExplorerVersion();

  if ( ver > -1 )
  {
    msg = "You are using IE " + ver;
  }
  alert( msg );
}

Але IE11 повертає "Ви не використовуєте Internet Explorer". Як я можу це виявити?


2
Дивіться також stackoverflow.com/questions/17447373 / ...
dave1010

1
Все, що базується на користувальницькому агенті, є помилковим. Це дуже легко підробляти, тепер, можливо, це не проблема, але мені здається, що сценарій виявлення браузера повинен мати неабиякі шанси виявити маскування. Я використовую комбінацію умовних коментарів, які проходять через спробу примусити document.documentMode, а потім подивитись на window.MSInputMethodContext, як описано нижче Пола Sweatte нижче. Я б опублікував свій код, але він лупить мертвого коня.
Девід Г

3
IE11 має користувальницький агент: Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; rv: 11.0) типу Gecko Os: 6.1 - win7, 6.3 - win81
бритва

1
Дивіться моя відповідь тут stackoverflow.com/questions/21825157 / ...
Royi Namir

1
ось найкраще рішення , яке я знайшов: stackoverflow.com/a/20201867/2047385 якщо (Object.hasOwnProperty.call (вікно "ActiveXObject") && window.ActiveXObject!) {// це IE11}
xorcus

Відповіді:


221

IE11 більше не повідомляє, оскільки MSIEвідповідно до цього переліку змін навмисно уникати неправильного виявлення.

Що ви можете зробити, якщо ви дійсно хочете знати, що це IE - це виявити Trident/рядок у користувальницькому агенті, якщо navigator.appNameповертається Netscape, щось на зразок (неперевірене);

function getInternetExplorerVersion()
{
  var rv = -1;
  if (navigator.appName == 'Microsoft Internet Explorer')
  {
    var ua = navigator.userAgent;
    var re = new RegExp("MSIE ([0-9]{1,}[\\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  else if (navigator.appName == 'Netscape')
  {
    var ua = navigator.userAgent;
    var re  = new RegExp("Trident/.*rv:([0-9]{1,}[\\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  return rv;
}

console.log('IE version:', getInternetExplorerVersion());

Зауважте, що IE11 (afaik) все ще знаходиться в попередньому перегляді, і агент користувача може змінитися перед випуском.


81
it's intentional to avoid mis-detection- На жаль, тепер, коли IE11 виходить, у нас є код, який розбитий лише в IE11, тоді як правильне виявлення IE спрацювало б ...
Izkata

68
Я перетворив це рішення на булевий, якщо версія менш важливаfunction isIE() { return ((navigator.appName == 'Microsoft Internet Explorer') || ((navigator.appName == 'Netscape') && (new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})").exec(navigator.userAgent) != null))); }
rg89

6
@lzkata - Відповідно до специфікації html5 , IE насправді відповідає стандарту. Так, так, це навмисно, але це відповідає новому стандарту (застаріле старе html-api.)
Mark Avenius

11
"Причиною цього вони були навмисні. Вони хотіли зламати такі сценарії виявлення браузера". від stackoverflow.com/a/18872067/1066234 ... Насправді так має бути: "Вони хотіли зробити так, щоб мільярд веб-сайтів порушився таким чином".
Кай Ноак

15
Це працює для мене: var isIE11 = !!navigator.userAgent.match(/Trident\/7\./); джерело
Кай Ноак

86

Використовуйте !(window.ActiveXObject) && "ActiveXObject" in windowдля явного виявлення IE11.

Щоб виявити будь-яку версію IE (попередній край, "Тризуб"), використовуйте "ActiveXObject" in windowзамість цього.


2
Ця стаття Microsoft передбачає, що це рішення може більше не працювати msdn.microsoft.com/en-us/library/ie/dn423948(v=vs.85).aspx
Алан

5
Насправді ця стаття описує причину роботи мого методу. Спроба доступу window.ActiveXObject, як описано в статті, повертається undefinedв IE11 зараз (як і у браузерах, що не належать Microsoft.) Тест за допомогою inоператора javascript повертається trueу всіх браузерах Microsoft, тому обидва випадки суворо в IE11. Якщо Microsoft inвидасть зміни в поведінці оператора, так, цей спосіб порушиться.
mcw

5
"ActiveXObject" у вікні повертає False в Edge.
Нео

8
@Neo Edge не IE, питання ОП полягало в тому, як виявити IE11
mastazi

1
@mastazi так, але у цій відповіді зазначається, що ActiveXObject можна використовувати для виявлення будь-якої версії IE. Хоча дискусійно, чи слід називати Edge версією IE чи ні (Microsoft, напевно, не хоче її називати), але для багатьох розробників IE став синонімом будь-якого браузера Microsoft за замовчуванням.
Нео

45

Використовувати MSInputMethodContextяк частину перевірки виявлення функцій. Наприклад:

//Appends true for IE11, false otherwise
window.location.hash = !!window.MSInputMethodContext && !!document.documentMode;

Список літератури


2
Мені це здається більш надійним. Безумовно, що-небудь, що базується на користувальницькому агенті, є досить марним.
Девід Г

1
Це працювало замість ActiveXObject. Велике спасибі
Tarık Özgün Güner

1
@tdakhla Оновлено для фільтрації IE Edge.
Пол Sweatte

Важливо зазначити, що будь-який з цих відповідей, який може здатися, що вони не працюють, - це перевірити налаштування Емуляції, я збирався відзначити цю відповідь неправильною, але потім я перевірив емуляцію та побачив, що деякі параметри сумісності внутрішньої мережі перекривають режим відображення , як тільки було виведено з рівняння, це рішення спрацювало для мене чудово.
Шон

1
Щойно підтверджено #falseв не-IE, IE8,9,10, Edge 14,15. #trueлише в IE11 Не тестувався з активованим режимом документа. Тестується за допомогою Browserstack.
danjah

15

Я прочитав ваші відповіді і склав суміш. Схоже, це працює з Windows XP (IE7 / IE8) та Windows 7 (IE9 / IE10 / IE11).

function ie_ver(){  
    var iev=0;
    var ieold = (/MSIE (\d+\.\d+);/.test(navigator.userAgent));
    var trident = !!navigator.userAgent.match(/Trident\/7.0/);
    var rv=navigator.userAgent.indexOf("rv:11.0");

    if (ieold) iev=new Number(RegExp.$1);
    if (navigator.appVersion.indexOf("MSIE 10") != -1) iev=10;
    if (trident&&rv!=-1) iev=11;

    return iev;         
}

Звичайно, якщо я поверну 0, означає відсутність IE.


12

Отримайте версію IE від User-Agent

var ie = 0;
try { ie = navigator.userAgent.match( /(MSIE |Trident.*rv[ :])([0-9]+)/ )[ 2 ]; }
catch(e){}

Як це працює: Рядок агента користувача для всіх версій IE включає в себе частину «MSIE простір версії » або «Trident інших текстового с.в. простору або двокрапка версію ». Знаючи це, ми вибираємо номер версії із String.match()звичайного виразу. try-catchБлок використовується для скорочення коду, в іншому випадку ми повинні були б перевірити межі масиву для не-IE браузерів.

Примітка . Користувач-агент може бути підробленим або пропущеним, іноді ненавмисно, якщо користувач перевів браузер у "режим сумісності". Хоча це на практиці не виглядає великою проблемою.


Отримайте версію IE без User-Agent

var d = document, w = window;
var ie = ( !!w.MSInputMethodContext ? 11 : !d.all ? 99 : w.atob ? 10 : 
d.addEventListener ? 9 : d.querySelector ? 8 : w.XMLHttpRequest ? 7 : 
d.compatMode ? 6 : w.attachEvent ? 5 : 1 );

Як це працює: Кожна версія IE додає підтримку додаткових функцій, яких не було в попередніх версіях. Тож ми можемо перевірити на наявність функцій зверху вниз. Потрійна послідовність використовується тут для стислості, хоча if-thenі switchзаяви будуть працювати так само добре. Змінна ieвстановлюється на ціле число 5-11, або 1 для старшого, або 99 для новішого / не IE. Ви можете встановити його на 0, якщо ви хочете точно перевірити IE 1-11.

Примітка. Виявлення об'єкта може порушитися, якщо ваш код запущений на сторінці зі сторонніми сценаріями, які додають поліфайли для таких речей document.addEventListener. У таких ситуаціях найкращим варіантом є користувальницький агент.


Визначте, чи переглядач сучасний

Якщо вас цікавить лише те, чи підтримує браузер більшість стандартів HTML 5 та CSS 3, ви можете обґрунтовано припустити, що IE 8 та новіші версії залишаються основними проблемами програм. Тестування на window.getComputedStyleпредмет дасть вам досить непоганий поєднання сучасних браузерів (IE 9, FF 4, Chrome 11, Safari 5, Opera 11.5). IE 9 значно покращує підтримку стандартів, але для нативної анімації CSS потрібен IE 10.

var isModernBrowser = ( !document.all || ( document.all && document.addEventListener ) ); 

"Отримати IE-версію від користувача-агента" чудово працює! щоб бути впевненим, це покаже всю версію, включаючи IE11?
омер

1
@omer Так, тому що він шукає рядок "MSIE" або "Trident"; останній використовується IE 11 і вище. Так він працюватиме для всіх майбутніх версій IE, поки MS не змінить назву свого браузера. Я вважаю, що новий браузер Edge все ще використовує Trident.
Beejor

Це чудово працює, дякую @Beejor! Я реалізував просте переспрямування на іншу сторінку, використовуючи вашу відповідь: var ie = 0; try { ie = navigator.userAgent.match( /(MSIE |Trident.*rv[ :])([0-9]+)/ )[ 2 ]; } catch(e){} if (ie !== 0) { location.href = "../ie-redirect/redirect.html"; }
BernardV

@BernardV Виглядає добре! Швидкий підказок: якщо у вас є доступ до сервера, виявлення користувача-агента в скрипті може працювати краще, оскільки користувач не помітить перенаправлення / мерехтіння, менше запитів HTTP тощо. JS теж працює.
Beejor

9

Кутовий JS робить так.

msie = parseInt((/msie (\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);
if (isNaN(msie)) {
  msie = parseInt((/trident\/.*; rv:(\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);
}

msie буде позитивним числом, якщо його IE та NaN для інших браузерів, таких як хром, firefox.

чому?

Станом на Internet Explorer 11, рядок агента користувача істотно змінився.

зверніться до цього:

msdn # 1 msdn # 2


7

рішення:

function GetIEVersion() {
  var sAgent = window.navigator.userAgent;
  var Idx = sAgent.indexOf("MSIE");
  // If IE, return version number.
  if (Idx > 0)
    return parseInt(sAgent.substring(Idx+ 5, sAgent.indexOf(".", Idx)));

  // If IE 11 then look for Updated user agent string.
  else if (!!navigator.userAgent.match(/Trident\/7\./))
    return 11;

  else
    return 0; //It is not IE

}
if ((GetIEVersion() > 0) || (navigator.userAgent.toLowerCase().indexOf('firefox') > -1)){
  alert("This is IE " + GetIEVersion());
}else {
  alert("This no is IE ");
}		


1
Моя улюблена - акаунти на IE6-10 та IE11. Я додав у чек на край також
AlbatrossCafe

Це виявляє Firefox якThis is IE 0
KSPR

3

Я використовую більш простий метод:

Глобальний об’єкт навігатора має властивості сенсорних точок, в Internet Exlorer 11 називається msMaxTouchPoints tho.

Тож якщо ви шукаєте:

navigator.msMaxTouchPoints !== void 0 

Ви знайдете Internet Explorer 11.


1
Він також повертає ствол на IE 10 (Win 7)
програміст з хімічних речовин

2
var ua = navigator.userAgent.toString().toLowerCase();
var match = /(trident)(?:.*rv:([\w.]+))?/.exec(ua) ||/(msie) ([\w.]+)/.exec(ua)||['',null,-1];
var rv = match[2];
return rv;

Якщо ви використовуєте регулярний вираз для chec, ви можете додати прапор i, щоб зробити його нечутливим, а не .toLowerCase (). Також немає необхідності в методі .toString ().
Джейк Роузелл

2

Спробуйте це:

var trident = !!navigator.userAgent.match(/Trident\/7.0/);
var net = !!navigator.userAgent.match(/.NET4.0E/);
var IE11 = trident && net
var IEold = ( navigator.userAgent.match(/MSIE/i) ? true : false );
if(IE11 || IEold){
alert("IE")
}else{
alert("Other")
}

Неправильний код, оскільки браузер Acoo використовує "MSIE" у використанні. Подивіться на useragentstring.com/pages/Acoo%20Browser
Користувач

НЕПРАВНИЙ АРГУМЕНТ. Я протестував у всіх браузерах IE, навіть на пристроях Win8.
Крунал

Ви перевірили браузер IE11, але не браузер Acoo, а браузер Acoo використовує "MSIE" у застосувальному засобі, як я скажу, так що IEold також виявляє браузер Acoo як IEold (стара версія IE), і я впевнений, що браузер Acoo використовує " MSIE "у Useragent, тому що я робив navigator.userAgent на тестовому сайті javascript з браузером Acoo (Тестовий сайт: w3schools.com )
Користувач

Чи можете ви, будь ласка, дати краще рішення для цього?
Крунал

Ви можете користуватися, !navigator.userAgent.match("Acoo Browser;") && navigator.userAgent.match(/MSIE/i) ? true : falseале це не завжди працює, тому що в браузері acoo не завжди є "Acoo Browser;" у своєму useragent, але насправді вам не потрібно дбати про те, щоб браузер acoo мав "MSIE" у своєму useragent, тому що браузер acoo є майже тим самим.
Користувач

1

Це, здається, є кращим методом. "indexOf" повертає -1, якщо нічого не відповідає. Він не перезаписує існуючі класи на тілі, а лише додає їх.

// add a class on the body ie IE 10/11
var uA = navigator.userAgent;
if(uA.indexOf('Trident') != -1 && uA.indexOf('rv:11') != -1){
    document.body.className = document.body.className+' ie11';
}
if(uA.indexOf('Trident') != -1 && uA.indexOf('MSIE 10.0') != -1){
    document.body.className = document.body.className+' ie10';
}

0

Виявити більшість браузерів за допомогою цього:

var getBrowser = function(){
  var navigatorObj = navigator.appName,
      userAgentObj = navigator.userAgent,
      matchVersion;
  var match = userAgentObj.match(/(opera|chrome|safari|firefox|msie|trident)\/?\s*(\.?\d+(\.\d+)*)/i);
  if( match && (matchVersion = userAgentObj.match(/version\/([\.\d]+)/i)) !== null) match[2] = matchVersion[1];
  //mobile
  if (navigator.userAgent.match(/iPhone|Android|webOS|iPad/i)) {
    return match ? [match[1], match[2], mobile] : [navigatorObj, navigator.appVersion, mobile];
  }
  // web browser
  return match ? [match[1], match[2]] : [navigatorObj, navigator.appVersion, '-?'];
};

https://gist.github.com/earlonrails/5266945


0

Я використовував onscrollподію на елементі за допомогою прокрутки. Після запуску в IE я додав таку перевірку:

onscroll="if (document.activeElement==this) ignoreHideOptions()"

0

Тільки для браузера IE:

var ie = 'NotIE'; //IE5-11, Edge+
    if( !!document.compatMode ) {
        if( !("ActiveXObject" in window) ) ) ie = 'EDGE';
        if( !!document.uniqueID){
            if('ActiveXObject' in window && !window.createPopup ){ ie = 11; }
            else if(!!document.all){
                    if(!!window.atob){ie = 10;}
                    else if(!!document.addEventListener) {ie = 9;}
                    else if(!!document.querySelector){ie = 8;}
                    else if(!!window.XMLHttpRequest){ie = 7;}
                    else if(!!document.compatMode){ie = 6;}
                    else ie = 5;
                }
        }
    }

використовувати попередження (тобто);

Тестування:

var browserVersionExplorer = (function() {
    var ie = '<s>NotIE</s>',
        me = '<s>NotIE</s>';

    if (/msie\s|trident\/|edge\//i.test(window.navigator.userAgent) && !!(document.documentMode || document.uniqueID || window.ActiveXObject || window.MSInputMethodContext)) {
            if (!!window.MSInputMethodContext) {
                ie = !("ActiveXObject" in window) ? 'EDGE' : 11;
            } else if (!!document.uniqueID) {
                if (!!(window.ActiveXObject && document.all)) {
                    if (document.compatMode == "CSS1Compat" && !!window.DOMParser ) {
                        ie = !!window.XMLHttpRequest ? 7 : 6;
                    } else {
                        ie = !!(window.createPopup && document.getElementById) ? parseFloat('5.5') : 5;
                    }
                    if (!!document.documentMode && !!document.querySelector ) {
                        ie = !!(window.atob && window.matchMedia) ? 10 : ( !!document.addEventListener ? 9 : 8);
                    }
                } else ie = !!document.all ? 4 : (!!window.navigator ? 3 : 2);
            }
        }
        
    return ie > 1 ? 'IE ' + ie : ie;
})();

 alert(browserVersionExplorer);

Оновлення 01 червня 2017 року

Тепер ми могли використати щось легше і простіше:

var uA = window.navigator.userAgent,
    onlyIEorEdge = /msie\s|trident\/|edge\//i.test(uA) && !!( document.uniqueID || window.MSInputMethodContext),
    checkVersion = (onlyIEorEdge && +(/(edge\/|rv:|msie\s)([\d.]+)/i.exec(uA)[2])) || NaN;

Де я можу знайти нові стандартні глобальні об’єкти, додані до нових версій Edge? Я вважаю, що Math.acosh - одна з таких.
j4v1

1
@ j4v1 Лише Math.acosh підтримується в Microsoft Edge (браузер Edge). Ref: msdn.microsoft.com/en-us/en-en/library/dn858239(v=vs.94).aspx
Джеймс Пітер

Цей метод перестав працювати для мене. Раніше він правильно виявляв IE11, але тепер, коли у мене є версія Internet Explorer версії 11.1198.14393.0 (оновлена ​​версія 11.0.42 (KB4018271)), що працює на Windows 10 Enterprise (версія 1607, збірка ОС 14393.1198), Math, схоже, підтримує метод acosh.
Тійс

@Thijs У Windows 10 Education з IE11 v 11.1198.14393.0 я пройшов тестування. Вам слід спробувати іншу математичну функцію відповідно до ES6.
Джеймс Пітер

@JamesPeter Я приземлився після перевірки наявності документа.documentMode. Це здається більш надійною властивістю перевірити наявність IE11 або Edge. documentMode існує в IE11, але більше не існує в Edge.
Тійс

0

Відверто кажучи, я б сказав, що використовуйте бібліотеку, яка робить те, що вам потрібно (наприклад, platform.js). У якийсь момент все зміниться, і бібліотека буде обладнана для цих змін, і ручний аналіз, використовуючи регулярні вирази, не зможе.

Слава богу, IE минає ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.