Как обнаружить 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 194

15 ответов:

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. );
  }
  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. В таких ситуациях пользователь-агент является лучшим вариантом.


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

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

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

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

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

глобальный объект Navigator имеет точки соприкосновения собственность, в интернет-исследователю 11 называется свойство msmaxtouchpoints Тхо.

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

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

use 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 например). В какой-то момент все изменится, и библиотека будет оборудована для этих изменений, и ручной разбор с использованием регулярных выражений не удастся.

слава Богу, т. е. уходит...