Как обнаружить 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 в соответствии с Полом Свиттом ниже. Я отправил бы мой код, но он порет мертвую лошадь.
Дэвид Дж
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/…
Ройи Намир
1
Вот лучшее решение, которое я нашел: stackoverflow.com/a/20201867/2047385 if (Object.hasOwnProperty.call (window, "ActiveXObject") &&! window.ActiveXObject) {// is 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).
интерфейс Марк Авениус
11
«Причина, по которой они сделали это, была преднамеренной. Они хотели сломать сценарии обнаружения браузера, как это». from stackoverflow.com/a/18872067/1066234 ... На самом деле так и должно быть: «Они хотели, чтобы миллиард веб-сайтов сломался так».
Кай Ноак
15
Это работает для меня: var isIE11 = !!navigator.userAgent.match(/Trident\/7\./); источник
Кай Ноак
86

использование !(window.ActiveXObject) && "ActiveXObject" in window для явного определения IE11.

Чтобы обнаружить любую версию IE (pre-Edge, «Trident»), используйте "ActiveXObject" in windowвместо этого.

MCW
источник
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, вопрос OP был в том, как определить IE11
mastazi
1
@mastazi да, но в этом ответе упоминается, что ActiveXObject может использоваться для обнаружения любой версии IE. Это хотя и спорно , который должен края назвать версию 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.
Пол Свитт
Важно отметить, что для любого из этих ответов, которые могут показаться, что они не работают, нужно проверить настройки эмуляции. Я собирался пометить этот ответ как неправильный, но затем я проверил эмуляцию и увидел, что некоторые параметры совместимости с интрасетью переопределяют режим отображения. После того, как это было вычеркнуто из уравнения, это решение отлично сработало для меня.
Шон
1
Только что подтверждено #falseв не-IE, IE8,9,10, Edge 14,15. #trueтолько в IE11. Не тестировал с активным режимом документа. Протестировано с Browserstack.
Данджа
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.

Fabio
источник
12

Получить версию IE от User-Agent

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

Как это работает: Строка user-agent для всех версий IE включает в себя часть « Пространственная версия MSIE » или «Trident other-text rv space-or-colon version ». Зная это, мы берем номер версии из 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 ) ); 
Beejor
источник
«Получить версию IE от User-Agent» работает отлично! просто чтобы быть уверенным, это покажет все версии, включая 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

Angular 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 для другого браузера, такого как chrome, firefox.

Зачем ?

Начиная с Internet Explorer 11, строка user-agent значительно изменилась.

отослать это:

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

coperniko
источник
1
Мой любимый - аккаунты для IE6-10 и IE11. Я добавил в проверку для края также
AlbatrossCafe
Это обнаруживает Firefox какThis is IE 0
KSPR
3

Я использую более простой метод:

Глобальный объект навигатора имеет свойство touchpoints, в Internet Exlorer 11 он называется msMaxTouchPoints tho.

Так что если вы ищете:

navigator.msMaxTouchPoints !== void 0 

Вы найдете Internet Explorer 11.

Двид Сильва
источник
1
Он также возвращает trun для 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;
areschen
источник
Если вы используете регулярное выражение для проверки, вы можете добавить флаг 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")
}
Krunal
источник
Неверный код, потому что браузер 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;" в его 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

earlonrails
источник
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). Ссылка: 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 with IE11 v 11.1198.14393.0 я успешно прошел тестирование. Вы должны попробовать другую математическую функцию в соответствии с ES6.
Джеймс Питер
@JamesPeter Я приземлился после проверки для document.documentMode. Это, кажется, более надежное свойство для проверки IE11 или Edge. documentMode существует в IE11, но больше не существует в Edge.
Тийс
0

Откровенно говоря, я бы сказал, используйте библиотеку, которая делает то, что вам нужно (например, platform.js). В какой-то момент все изменится, и библиотека будет оборудована для этих изменений, и ручной анализ с использованием регулярных выражений не удастся.

Слава богу, IE уходит ...

Матиас Гринишак
источник