Как обнаружить IE11?

когда я хочу обнаружить 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. );
  }
  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". Как я могу это обнаружить?

15 ответов


IE11 больше не сообщает как MSIE, по данным список изменений это намеренно, чтобы избежать неправильного обнаружения.

что вы можете сделать, если вы действительно хотите знать, что это IE, чтобы обнаружить Trident/ строка в Агенте пользователя if 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. );
  }
  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. );
  }
  return rv;
}

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

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


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

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


использовать MSInputMethodContext в рамках проверки обнаружения объектов. Например:

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

ссылки


Я прочитал ваши ответы и сделал микс. Кажется, он работает с 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.);
    if (navigator.appVersion.indexOf("MSIE 10") != -1) iev=10;
    if (trident&&rv!=-1) iev=11;

    return iev;         
}

конечно, если я возвращаю 0, означает отсутствие IE.


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

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

как работает: строка user-agent для всех версий IE включает в себя часть " MSIE пробел версия" или "Тризуб Другое-Текст rv пространство-или-двоеточие версия". Зная это, мы берем номер версии от 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. В таких ситуациях наилучшим вариантом является user-agent.


определить, если браузер является современным

если вас интересует только то, поддерживает ли браузер большинство стандартов 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 ) ); 

угловой 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 строка агента пользователя значительно изменилась.

передать этот :

msdn #1 msdn #2


устранение :

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

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

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

Итак, если вы ищете:

navigator.msMaxTouchPoints !== void 0 

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


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;

Попробуйте Это:

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

Это, по-видимому, лучший метод. "помощи 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';
}

обнаружение большинства браузеров с помощью этого:

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


я использовал onscroll событие в элементе с полосой прокрутки. При запуске в IE я добавил следующую проверку:

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

только для браузера 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;
                }
        }
    }

использовать alert (ie);

тестирование:

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;

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

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