Определить версию IE (до v9) в JavaScript

Я хочу возвращать пользователей нашего веб-сайта на страницу с ошибкой, если они используют версию Internet Explorer до v9. Просто поддерживать IE pre-v9 не стоит нашего времени и денег. Пользователи всех других браузеров, отличных от IE, в порядке и не должны отклоняться. Вот предлагаемый код:

if(navigator.appName.indexOf("Internet Explorer")!=-1){     //yeah, he's using IE
    var badBrowser=(
        navigator.appVersion.indexOf("MSIE 9")==-1 &&   //v9 is ok
        navigator.appVersion.indexOf("MSIE 1")==-1  //v10, 11, 12, etc. is fine too
    );

    if(badBrowser){
        // navigate to error page
    }
}

Подойдет ли этот код?

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

  1. Да, я знаю, что пользователи могут подделать свою useragent строку. Меня это не волнует.
  2. Да, я знаю, что профессионалы в области программирования предпочитают вынюхивать поддержку функций, а не браузер, но я не думаю, что такой подход имеет смысл в данном случае. Я уже знаю, что все (соответствующие) браузеры, отличные от IE, поддерживают нужные мне функции, а все pre-v9 IE браузеры - нет. Проверка функции за функцией на всем сайте была бы пустой тратой.
  3. Да, я знаю, что кто-то, пытающийся получить доступ к сайту с помощью IE v1 (или> = 20), не получит для 'badBrowser' значение true, и страница с предупреждением не будет отображаться должным образом. Мы готовы пойти на такой риск.
  4. Да, я знаю, что у Microsoft есть «условные комментарии», которые можно использовать для точного определения версии браузера. IE больше не поддерживает условные комментарии с IE 10, что делает этот подход абсолютно бесполезным.

Есть ли другие очевидные проблемы, о которых следует знать?


person Chad Decker    schedule 09.06.2012    source источник
comment
Поддержка IE до v9 не стоит нашего времени и денег. Хотел бы я сделать это.   -  person Hassan    schedule 10.06.2012
comment
На основании пункта [2] я не буду предлагать Modernizr (en.wikipedia.org/wiki/Modernizr) - каждый должен где-нибудь провести черту на песке, но IE9 действительно кажется высшей линией   -  person amelvin    schedule 10.06.2012
comment
@Hassan: У нас небольшая аудитория. Практически все пользователи используют приличные браузеры, за исключением нескольких парней из WinXP, которые не имеют права обновляться до IE9. Это те парни, на которых я нацелен этим сообщением об ошибке.   -  person Chad Decker    schedule 10.06.2012
comment
@Andreas: Интересная мысль. Значит, использование условных комментариев в IE 10 не приведет к подавлению IE10? Их просто проигнорируют? Если так, то то, что вы говорите, имеет большой смысл.   -  person Chad Decker    schedule 10.06.2012
comment
Условные комментарии - это просто обычные комментарии. Только IE интерпретирует их как особые. IE10 + больше этого не сделает.   -  person Andreas    schedule 10.06.2012
comment
Условные комментарии будут обрабатываться в IE 10 точно так же, как и в браузерах, отличных от IE. Это действительные комментарии HTML, поэтому они будут рассматриваться как таковые. Я согласен с Андреасом и считаю, что условные комментарии - это лучший вариант.   -  person Tim Down    schedule 10.06.2012
comment
Официальная документация, в которой говорится, что IE10 + не поддерживает условные комментарии: blogs.msdn.com/b/ie/archive/2011/07/06/ - Благодарность: stackoverflow.com/a/9900331/320399   -  person blong    schedule 18.12.2012
comment
Выбран неверный ответ и не работает для ie11. увидеть мой ответ   -  person Royi Namir    schedule 19.01.2015
comment
Кого волнует, поддерживает ли IE10 условные комментарии, если это не один из браузеров, которые вы пытаетесь обнаружить? Вам не нужно определять, IE 9 или выше, вам нужно только определять, IE8 или ниже. Ваша ошибка состоит в том, что вы думаете, что вам нужно выяснить, что это такое, чтобы понять, что это не так. Это не правда. Вам не нужно обнаруживать IE10, вам нужно только знать, что это НЕ IE8 (или ниже). Любой код, который вы добавляете в lt IE 9 условное выражение, будет работать в IE8 и ниже и больше нигде. Так просто. Это единственное, что Microsoft сделала правильно с IE.   -  person Jimbo Jonny    schedule 22.10.2015
comment
Еще два месяца, прежде чем мы сможем танцевать на могиле IE8 ... надеюсь, пройдет всего несколько лет, прежде чем мы все сможем полностью отказаться от поддержки IE ...   -  person Michael Scheper    schedule 19.11.2015


Ответы (33)


Я предпочитаю это делать. Это дает максимальный контроль. (Примечание: условные операторы поддерживаются только в IE5 - 9.)

Сначала настройте свои классы IE правильно

<!DOCTYPE html>
<!--[if lt IE 7]> <html class="lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>    <html class="lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>    <html class="lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html> <!--<![endif]-->    
<head>

Затем вы можете просто использовать CSS для создания исключений стиля или, если вам нужно, вы можете добавить простой JavaScript:

(function ($) {
    "use strict";

    // Detecting IE
    var oldIE;
    if ($('html').is('.lt-ie7, .lt-ie8, .lt-ie9')) {
        oldIE = true;
    }

    if (oldIE) {
        // Here's your JS for IE..
    } else {
        // ..And here's the full-fat code for everyone else
    }

}(jQuery));

Спасибо Полу Айришу.

person Jezen Thomas    schedule 09.06.2012
comment
Учитывая, что OP запросил чисто JavaScript-решение, я считаю, что ответ @Tim Down ниже лучше, поскольку он не требует изменения существующего HTML, а также не использует jQuery: stackoverflow.com/a/10965203/134120 - person AsGoodAsItGets; 13.01.2015
comment
Я получаю сообщение об ошибке на валидаторе w3 html: Error: Saw <!-- within a comment. Probable cause: Nested comment (not allowed). At line 5, column 21 if gt IE 8]><!--><html - person abumalick; 22.06.2016

Вернуть версию IE или, если нет, IE вернет false

function isIE () {
  var myNav = navigator.userAgent.toLowerCase();
  return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
}

Пример:

if (isIE () == 8) {
 // IE8 code
} else {
 // Other versions IE or not IE
}

or

if (isIE () && isIE () < 9) {
 // is IE version less than 9
} else {
 // is IE 9 and later or not IE
}

or

if (isIE()) {
 // is IE
} else {
 // Other browser
}
person weroro    schedule 13.04.2013
comment
Не работает для IE11. Начиная с IE 11, они изменили строку UA на "mozilla/5.0 (windows nt 6.3; wow64; trident/7.0; .net4.0e; .net4.0c; media center pc 6.0; .net clr 3.5.30729; .net clr 2.0.50727; .net clr 3.0.30729; rv:11.0) like gecko" - person Annie; 04.07.2013
comment
Обратите внимание, что в FF false ‹9 верно. Итак, условие должно быть if (isIE () && isIE () < 9) { - person nZeus; 08.09.2013
comment
то есть 10 выбивал 7. - person DeadlyChambers; 07.11.2013
comment
@DeadlyChambers, возможно, он работал в стандартном режиме IE7? msdn.microsoft.com/en-us /library/ie/cc196988(v=vs.85).aspx - person mason81; 20.11.2013
comment
Утвержденный ответ - как определить версию IE в HTML. Это отвечает на исходный вопрос. - person Matt Wagner; 07.01.2015
comment
Не работает для Microsoft Edge 38.xxx, вернуть false - person Prasad Gayan; 20.01.2017
comment
@PrasadGayan - Microsoft Edge - это не Internet Explorer. Так что возвращение false кажется правильным. - person BryanGrezeszak; 09.06.2017
comment
Спасибо. именно то, что мне было нужно, и только для IE 8 и ниже. Я понял, что обычные условные комментарии действительно не работают для всех случаев, и нуждался в решении java-скрипта. Боковое примечание: я думаю, что потратил больше времени, разбираясь с причудами IE8, чем ЛЮБОЙ другой старый браузер, который я пытался поддерживать. - person Randy; 07.12.2020

Если никто другой не добавил addEventLister-метод, и вы используете правильный режим браузера, вы можете проверить IE 8 или менее с помощью

if (window.attachEvent && !window.addEventListener) {
    // "bad" IE
}

Устаревший Internet Explorer и attachEvent (MDN)

person Andreas    schedule 09.06.2012
comment
Это кажется наиболее эффективным способом полностью обнаружить IE ‹= 8 в JavaScript - и он отлично подходит для таких людей, как я, которые искали способ это сделать. - person Gregory Magarshak; 18.03.2013
comment
Здорово! Это также обнаруживает IE9 в режиме Quirks Mode, который я искал. - person sstur; 04.04.2014
comment
Хотя это простое в использовании решение, оно сопряжено с некоторыми рисками. Любой в вашей компании (который не знает о вашем решении) может реализовать addEventListener или attachEvent, чтобы справиться с его отсутствием в IE 8. И тогда ваш код перестанет работать. - person Zé Carlos; 15.01.2015

Используйте условные комментарии. Вы пытаетесь обнаружить пользователей IE ‹9, и в этих браузерах будут работать условные комментарии; в других браузерах (IE> = 10 и не-IE) комментарии будут обрабатываться как обычные комментарии HTML, что и есть.

Пример HTML:

<!--[if lt IE 9]>
WE DON'T LIKE YOUR BROWSER
<![endif]-->

Вы также можете сделать это чисто с помощью скрипта, если вам нужно:

var div = document.createElement("div");
div.innerHTML = "<!--[if lt IE 9]><i></i><![endif]-->";
var isIeLessThan9 = (div.getElementsByTagName("i").length == 1);
if (isIeLessThan9) {
    alert("WE DON'T LIKE YOUR BROWSER");
}
person Tim Down    schedule 09.06.2012
comment
Версия ответа @Tim Down для JavaScript отлично мне поработала. Я использовал BrowserStack, чтобы протестировать его с Windows 7 и IE 8, 9, 10 и 11; Mac OS X Snow Leopard с Safari 5.1, Firefox 28.0, Chrome 33.0 и Opera 20.0; iPhone 5 Mobile Safari; и Android Samsung Galaxy Tab 2 10.1 4.0. Как и ожидалось, только IE8 сообщил, что это IeLessThan9. Хороший! - person Steve Saporta; 28.03.2014

Чтобы легко обнаружить MSIE (v6 - v7 - v8 - v9 - v10 - v11):

if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) {
   // MSIE
}
person EpokK    schedule 05.12.2013
comment
Полезно для обнаружения IE10, поскольку он не поддерживает условные комментарии. Не работает в IE11, но IE11 в целом работает нормально. - person personne3000; 13.12.2013
comment
Наконец, ответ, который не содержит лекций об использовании обнаружения функций, а фактически отвечает на вопрос. - person cdmckay; 30.07.2014

Вот способ для IE

/**
 * documentMode is an IE-only property
 * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
 */
var msie = document.documentMode;

if (msie < 9) {
    // code for IE < 9
}
person iurii    schedule 08.07.2015
comment
Вау, это намного проще, чем все условные комментарии! Никаких ограничений в этом? - person andrewb; 24.07.2015
comment
согласно документации, IE8 + поддерживает это свойство, поэтому я думаю, что этого будет достаточно для большинства случаев. - person iurii; 24.07.2015
comment
Согласно ссылке MSDN, если текущий документ еще не определен, documentMode возвращает нулевое значение (0). Обычно это происходит при загрузке документа. Означает ли это, что вы не можете получить правильный ответ в сценарии, загруженном в ‹head›? - person Erik Knowles; 30.07.2015
comment
Я думаю, вы можете исправить это, проверив значение в window.onload, когда документ уже загружен. - person iurii; 30.07.2015
comment
Вау! Умная. Спасибо! - person GTodorov; 04.06.2021

Для надежной фильтрации IE8 и более ранних версий можно использовать проверку глобальных объектов:

if (document.all && !document.addEventListener) {
    alert('IE8 or lower');
}
person Beaudinn Greve    schedule 25.06.2014
comment
document.all - не поддерживается в IE 11 - msdn.microsoft.com/en-us/library/ie/ms537434%28v=vs.85%29.aspx - person Raja Khoury; 13.04.2015
comment
@RajaKhoury - Это нормально, если вы пытаетесь протестировать IE ‹9 - условие if будет ложным. - person nnnnnn; 17.01.2017

Обнаружение версии IE с использованием функции обнаружения (IE6 +, браузеры до IE6 определяются как 6, возвращает null для браузеров, отличных от IE):

var ie = (function (){
    if (window.ActiveXObject === undefined) return null; //Not IE
    if (!window.XMLHttpRequest) return 6;
    if (!document.querySelector) return 7;
    if (!document.addEventListener) return 8;
    if (!window.atob) return 9;
    if (!document.__proto__) return 10;
    return 11;
})();

Изменить: для вашего удобства я создал репозиторий bower / npm: ie-version

Обновление:

более компактный вариант можно записать одной строкой как:

return window.ActiveXObject === undefined ? null : !window.XMLHttpRequest ? 6 : !document.querySelector ? 7 : !document.addEventListener ? 8 : !window.atob ? 9 : !document.__proto__ ? 10 : 11;
person Gabriel Llamas    schedule 28.09.2014

Эта функция вернет основной номер версии IE в виде целого числа или undefined, если браузер не является Internet Explorer. Это, как и все решения пользовательских агентов, подвержено спуфингу пользовательского агента (что является официальной функцией IE с версии 8).

function getIEVersion() {
    var match = navigator.userAgent.match(/(?:MSIE |Trident\/.*; rv:)(\d+)/);
    return match ? parseInt(match[1]) : undefined;
}
person Owen    schedule 16.05.2014
comment
Оуэн, как это использовать на практике? Как получить возвращаемое значение? Я пробовал console.log(!!match && parseInt(match[1])), console.log(parseInt(match[1])) и console.log(match), но безрезультатно ни с одним из них. - person Frank Conijn; 22.05.2014
comment
Получите возвращаемое значение, вызвав саму функцию getIEVersion(). Например: if (getIEVersion() < 9) {/* IE 8 or below */} if (!getIEVersion()) {/* Not IE */} - person Owen; 23.05.2014

Обнаружение IE в JS с помощью условных комментариев

// ----------------------------------------------------------
// A short snippet for detecting versions of IE in JavaScript
// without resorting to user-agent sniffing
// ----------------------------------------------------------
// If you're not in IE (or IE version is less than 5) then:
//     ie === undefined
// If you're in IE (>=5) then you can determine which version:
//     ie === 7; // IE7
// Thus, to detect IE:
//     if (ie) {}
// And to detect the version:
//     ie === 6 // IE6
//     ie > 7 // IE8, IE9 ...
//     ie < 9 // Anything less than IE9
// ----------------------------------------------------------

// UPDATE: Now using Live NodeList idea from @jdalton

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;

}());
person jKey    schedule 15.08.2013
comment
Это почти то же самое, что и мой ответ. - person Tim Down; 21.08.2013
comment
@TimDown: Возможно, но этот ответ немного более подробный (он сообщает вам номер версии) и хорошо прокомментирован. Кроме того, ссылка в начале этого ответа ведет к Gist с несколькими информативными комментариями и интересными вариациями этого метода. - person Alan; 10.01.2014
comment
@Alan: Справедливые очки. Я адаптировал свой к вопросу, но не стал ссылаться на источник. - person Tim Down; 10.01.2014

У меня это работает. Я использую его как перенаправление на страницу, которая объясняет, почему нам не нравится ‹IE9, и даю ссылки на браузеры, которые мы предпочитаем.

<!--[if lt IE 9]>
<meta http-equiv="refresh" content="0;URL=http://google.com">
<![endif]-->
person iconMatrix    schedule 25.01.2013
comment
Ох, это неприятно. Я использую более удобный метод, отображаю div с видом предупреждения IE, и когда посетитель нажимает на него, пользователь переходит на browsehappy.com - person Codebeat; 08.04.2015

Ваш код может выполнить проверку, но, как вы думали, если кто-то попытается получить доступ к вашей странице с помощью IE v1 или> v19, не получит ошибку, поэтому может быть более безопасно выполнить проверку с выражением Regex, как этот код ниже:

var userAgent = navigator.userAgent.toLowerCase();
// Test if the browser is IE and check the version number is lower than 9
if (/msie/.test(userAgent) && 
    parseFloat((userAgent.match(/.*(?:rv|ie)[\/: ](.+?)([ \);]|$)/) || [])[1]) < 9) {
  // Navigate to error page
}
person Fong-Wan Chau    schedule 09.06.2012
comment
Это плохой ответ. UA-сниффинг ненадежен. Подробнее об этом здесь: modernizr.com/docs. - person Jezen Thomas; 10.06.2012
comment
@Jezen Иногда UA-сниффинг - лучший выход: github.com/Modernizr/Modernizr/issues/ 538 - person István Ujj-Mészáros; 06.03.2013

Условные комментарии больше не поддерживаются в IE начиная с версии 10, как указано в Справочная страница Microsoft.

var ieDetector = function() {
  var browser = { // browser object

      verIE: null,
      docModeIE: null,
      verIEtrue: null,
      verIE_ua: null

    },
    tmp;

  tmp = document.documentMode;
  try {
    document.documentMode = "";
  } catch (e) {};

  browser.isIE = typeof document.documentMode == "number" || eval("/*@cc_on!@*/!1");
  try {
    document.documentMode = tmp;
  } catch (e) {};

  // We only let IE run this code.
  if (browser.isIE) {
    browser.verIE_ua =
      (/^(?:.*?[^a-zA-Z])??(?:MSIE|rv\s*\:)\s*(\d+\.?\d*)/i).test(navigator.userAgent || "") ?
      parseFloat(RegExp.$1, 10) : null;

    var e, verTrueFloat, x,
      obj = document.createElement("div"),

      CLASSID = [
        "{45EA75A0-A269-11D1-B5BF-0000F8051515}", // Internet Explorer Help
        "{3AF36230-A269-11D1-B5BF-0000F8051515}", // Offline Browsing Pack
        "{89820200-ECBD-11CF-8B85-00AA005B4383}"
      ];

    try {
      obj.style.behavior = "url(#default#clientcaps)"
    } catch (e) {};

    for (x = 0; x < CLASSID.length; x++) {
      try {
        browser.verIEtrue = obj.getComponentVersion(CLASSID[x], "componentid").replace(/,/g, ".");
      } catch (e) {};

      if (browser.verIEtrue) break;

    };
    verTrueFloat = parseFloat(browser.verIEtrue || "0", 10);
    browser.docModeIE = document.documentMode ||
      ((/back/i).test(document.compatMode || "") ? 5 : verTrueFloat) ||
      browser.verIE_ua;
    browser.verIE = verTrueFloat || browser.docModeIE;
  };

  return {
    isIE: browser.isIE,
    Version: browser.verIE
  };

}();

document.write('isIE: ' + ieDetector.isIE + "<br />");
document.write('IE Version Number: ' + ieDetector.Version);

затем используйте:

if((ieDetector.isIE) && (ieDetector.Version <= 9))
{

}
person Arnold.Krumins    schedule 07.10.2014
comment
Это была единственная вещь, которая работала во всей сети, по крайней мере, множество вещей, которые я пробовал ... thx;) - person Henrique C.; 10.12.2014
comment
Этот код хорош, но не может определить режим просмотра совместимости. Я использую IE 11, использую представление совместимости в IE 8, и этот код все еще дает version 11 EDIT: Этот код УДИВИТЕЛЬНЫЙ! ха-ха, он дает объект со всем внутри. Версия 11, но docModeIR равно 9. Спасибо! - person MarceloBarbosa; 11.02.2015

Для IE 10 и 11:

Вы можете использовать js и добавить класс в html для поддержки стандарта условных комментариев:

  var ua = navigator.userAgent,
      doc = document.documentElement;

  if ((ua.match(/MSIE 10.0/i))) {
    doc.className = doc.className + " ie10";

  } else if((ua.match(/rv:11.0/i))){
    doc.className = doc.className + " ie11";
  }

Или используйте библиотеку типа Bowser:

https://github.com/ded/bowser

Или modernizr для обнаружения функций:

http://modernizr.com/

person Liko    schedule 09.02.2014
comment
Я попробовал несколько сценариев и решений, но ничего не помогло. Затем я включил в проект баузер, и он просто сработал. Так что один за предложение баузера. - person Moulde; 19.01.2015

На это ответили до смерти, но это все, что вам нужно.

!!navigator.userAgent.match(/msie\s[5-8]/i)
person Timothy Perez    schedule 17.02.2016
comment
Кроме того, вот песочница, показывающая шаблон регулярного выражения для наиболее распространенных строк пользовательского агента IE: regex101.com/r / lC6oP3 / 1 - person Timothy Perez; 17.02.2016
comment
@alessadro - Но ведь так должно быть? ОП хотел проверить на ‹9 ... - person nnnnnn; 17.01.2017

Чтобы обнаружить Internet Explorer 10 | 11, вы можете использовать этот небольшой скрипт сразу после тега body:

В моем случае я использую библиотеку jQuery, загруженную в голову.

<!DOCTYPE HTML>
<html>
<head>
    <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
</head>
<body>
    <script>if (navigator.appVersion.indexOf('Trident/') != -1) $("body").addClass("ie10");</script>
</body>
</html>
person Brian    schedule 08.08.2014
comment
Мне это нравится, спасибо, мне нужно только определить 10 или 11, так как я не поддерживаю предыдущие версии - person Nearpoint; 08.09.2014
comment
IE9 - тоже трезубец, но не то же самое с поддержкой CSS. Ваше обнаружение считает, что не меньше 10, но это неверно. - person Codebeat; 08.04.2015

Согласно Microsoft, следующее лучшее решение, к тому же оно очень простое:

function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
    var rv = -1; // Return value assumes failure.
    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 )
    {
        if ( ver >= 8.0 ) 
            msg = "You're using a recent copy of Internet Explorer."
        else
            msg = "You should upgrade your copy of Internet Explorer.";
      }
    alert( msg );
}
person AHH    schedule 17.04.2014
comment
В самом деле, и на тот случай, если кто-то еще попадет сюда, пытаясь использовать вышеизложенное, код в более позднем ответе действительно работает для IE11 (stackoverflow.com / a / 26375930/1129926). Но будьте осторожны, подойдет ли он для IE12 и т. Д.? В итоге лучше всего рассматривать это как временные взломы, и они, скорее всего, потерпят неудачу позже, когда будут выпущены новые версии браузеров (я даже не буду упоминать Edge). - person Jeff Mergler; 03.04.2018

Я рекомендую не переписывать этот код в который раз. Я бы порекомендовал вам использовать библиотеку Conditionizr (http://conditionizr.com/), которая может тестировать определенные IE. версии, а также другие браузеры, операционные системы и даже наличие или отсутствие дисплеев Retina.

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

Он также хорошо сочетается с Modernizr, который может обрабатывать все те случаи, когда вам лучше тестировать конкретную возможность, а не конкретный браузер.

person John Munsch    schedule 02.07.2015

Мне это нравится:

<script>
   function isIE () {
       var myNav = navigator.userAgent.toLowerCase();
       return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
   }    
   var ua = window.navigator.userAgent;
   //Internet Explorer | if | 9-11

   if (isIE () == 9) {
       alert("Shut down this junk! | IE 9");
   } else if (isIE () == 10){
       alert("Shut down this junk! | IE 10");
   } else if (ua.indexOf("Trident/7.0") > 0) {
       alert("Shut down this junk! | IE 11");
   }else{
       alert("Thank god it's not IE!");
   }

</script>
person Julio Cesar Boaroli    schedule 21.08.2015

Этот подход к обнаружению IE сочетает в себе сильные стороны и позволяет избежать слабых сторон ответа jKey с использованием условных комментариев и ответа Оуэна с использованием пользовательских агентов.

  • Подход jKey работает до версии 9 и невосприимчив к спуфингу пользовательского агента в IE 8 и 9.
  • Подход Оуэна может потерпеть неудачу в IE 5 и 6 (отчет 7) и подвержен спуфингу UA, но он может обнаруживать версии IE> = 10 (теперь также включая 12, что соответствует ответу Оуэна).

    // ----------------------------------------------------------
    // A short snippet for detecting versions of IE
    // ----------------------------------------------------------
    // If you're not in IE (or IE version is less than 5) then:
    //     ie === undefined
    // Thus, to detect IE:
    //     if (ie) {}
    // And to detect the version:
    //     ie === 6 // IE6
    //     ie > 7 // IE8, IE9 ...
    // ----------------------------------------------------------
    var ie = (function(){
        var v = 3,
            div = document.createElement('div'),
            all = div.getElementsByTagName('i');
    
        while (
            div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
            all[0]
        );
        if (v <= 4) { // Check for IE>9 using user agent
            var match = navigator.userAgent.match(/(?:MSIE |Trident\/.*; rv:|Edge\/)(\d+)/);
            v = match ? parseInt(match[1]) : undefined;
        }
        return v;
    }());
    

Это можно использовать для установки полезных классов в ваш документ, содержащий версию IE:

    if (ie) {
        document.documentElement.className += ' ie' + ie;
        if (ie < 9)
            document.documentElement.className += ' ieLT9';
    }

Обратите внимание, что он определяет используемый режим совместимости, если IE находится в режиме совместимости. Также обратите внимание, что версия IE в основном полезна для более старых версий (‹10); более высокие версии более соответствуют стандартам, и, вероятно, лучше вместо этого проверять наличие функций с помощью чего-то вроде modernizr.js.

person jtbr    schedule 31.08.2015

Я сделал для этого удобный миксин подчеркивания.

_.isIE();        // Any version of IE?
_.isIE(9);       // IE 9?
_.isIE([7,8,9]); // IE 7, 8 or 9?

_.mixin({
  isIE: function(mixed) {
    if (_.isUndefined(mixed)) {
      mixed = [7, 8, 9, 10, 11];
    } else if (_.isNumber(mixed)) {
      mixed = [mixed];
    }
    for (var j = 0; j < mixed.length; j++) {
      var re;
      switch (mixed[j]) {
        case 11:
          re = /Trident.*rv\:11\./g;
          break;
        case 10:
          re = /MSIE\s10\./g;
          break;
        case 9:
          re = /MSIE\s9\./g;
          break;
        case 8:
          re = /MSIE\s8\./g;
          break;
        case 7:
          re = /MSIE\s7\./g;
          break;
      }

      if (!!window.navigator.userAgent.match(re)) {
        return true;
      }
    }

    return false;
  }
});

console.log(_.isIE());
console.log(_.isIE([7, 8, 9]));
console.log(_.isIE(11));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

person danrichards    schedule 23.05.2016

или просто

//   IE 10: ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'; 
//   IE 11: ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'; 
// Edge 12: ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0'; 
// Edge 13: ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586'; 

var isIE = navigator.userAgent.match(/MSIE|Trident|Edge/)
var IEVersion = ((navigator.userAgent.match(/(?:MSIE |Trident.*rv:|Edge\/)(\d+(\.\d+)?)/)) || []) [1]
person Giacomo    schedule 08.04.2018

Самый полный сценарий JS, который я нашел для проверки версий IE, - это http://www.pinlady.net/PluginDetect/IE/. Вся библиотека находится по адресу http://www.pinlady.net/PluginDetect/Browsers/.

В IE10 условные операторы больше не поддерживаются.

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

Используя скрипт PluginDetect JS, вы можете обнаруживать IE и определять точные версии, используя очень конкретный и хорошо продуманный код, предназначенный для определенных версий IE. Это очень полезно, если вам важно, с какой версией браузера вы работаете.

person PressingOnAlways    schedule 17.01.2014

Я понимаю, что немного опаздываю на вечеринку здесь, но я проверял простой однострочный способ предоставить обратную связь о том, является ли браузер IE и какой он был версией, начиная с 10 и ниже. Я не закодировал это для версии 11, поэтому, возможно, для этого потребуется небольшая поправка.

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

var isIE = { browser:/*@cc_on!@*/false, detectedVersion: function () { return (typeof window.atob !== "undefined") ? 10 : (typeof document.addEventListener !== "undefined") ? 9 : (typeof document.querySelector !== "undefined") ? 8 : (typeof window.XMLHttpRequest !== "undefined") ? 7 : (typeof document.compatMode !== "undefined") ? 6 : 5; } };

Используется isIE.browser свойство, которое возвращает логическое значение и полагается на условные комментарии, метод isIE.detectedVersion(), который возвращает число от 5 до 10. Я предполагаю, что все, что ниже 6, и вы находитесь на серьезной территории старой школы, и вы получите что-то большее. мускулистый, чем один лайнер, и все, что выше 10, и вы попадаете на новую территорию. Я читал кое-что о IE11, не поддерживающем условные комментарии, но я не изучил полностью, возможно, на более поздний срок.

В любом случае, как есть, и для одного лайнера, он будет охватывать основы браузера IE и определения версии. Он далек от совершенства, но он небольшой, и его легко исправить.

Просто для справки, и если кто-то сомневается в том, как это реализовать, то следующее условие должно помочь.

var isIE = { browser:/*@cc_on!@*/false, detectedVersion: function () { return (typeof window.atob !== "undefined") ? 10 : (typeof document.addEventListener !== "undefined") ? 9 : (typeof document.querySelector !== "undefined") ? 8 : (typeof window.XMLHttpRequest !== "undefined") ? 7 : (typeof document.compatMode !== "undefined") ? 6 : 5; } };

/* testing IE */

if (isIE.browser) {
  alert("This is an IE browser, with a detected version of : " + isIE.detectedVersion());
}
person Ric    schedule 18.06.2014

Обнаружить IE и его версии очень просто, и все, что вам нужно, это немного собственного / ванильного Javascript:

var uA = navigator.userAgent;
var browser = null;
var ieVersion = null;

if (uA.indexOf('MSIE 6') >= 0) {
    browser = 'IE';
    ieVersion = 6;
}
if (uA.indexOf('MSIE 7') >= 0) {
    browser = 'IE';
    ieVersion = 7;
}
if (document.documentMode) { // as of IE8
    browser = 'IE';
    ieVersion = document.documentMode;
}

И вот способ его использовать:

if (browser == 'IE' && ieVersion <= 9) 
    document.documentElement.className += ' ie9-';

.

Работает во всех версиях IE, включая более высокие версии в более низком представлении / режиме совместимости, а documentMode является проприетарным IE.

person Frank Conijn    schedule 18.06.2014

Если вам нужно удалить версию браузера IE, следуйте приведенному ниже коду. Этот код хорошо работает для версий от IE6 до IE11

<!DOCTYPE html>
<html>
<body>

<p>Click on Try button to check IE Browser version.</p>

<button onclick="getInternetExplorerVersion()">Try it</button>

<p id="demo"></p>

<script>
function getInternetExplorerVersion() {
   var ua = window.navigator.userAgent;
        var msie = ua.indexOf("MSIE ");
        var rv = -1;

        if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./))      // If Internet Explorer, return version number
        {               
            if (isNaN(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))))) {
                //For IE 11 >
                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);
                        alert(rv);
                    }
                }
                else {
                    alert('otherbrowser');
                }
            }
            else {
                //For < IE11
                alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
            }
            return false;
        }}
</script>

</body>
</html>
person Nimesh    schedule 15.10.2014

Окно запускает IE10 будет автоматически обновляться до IE11 + и будет стандартизирован W3C

В настоящее время нам не нужно поддерживать IE8-

    <!DOCTYPE html>
    <!--[if lt IE 9]><html class="ie ie8"><![endif]-->
    <!--[if IE 9]><html class="ie ie9"><![endif]-->
    <!--[if (gt IE 9)|!(IE)]><!--><html><!--<![endif]-->
    <head>
        ...
        <!--[if lt IE 8]><meta http-equiv="Refresh" content="0;url=/error-browser.html"><![endif]--
        ...
    </head>
person xicooc    schedule 07.01.2015

Приведенный ниже код определяет версию IE во всех случаях (IE ‹= 9, IE10, IE11 и IE / Edge)

function detectIE() {
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf('MSIE ');
    if (msie > 0) {
        // IE 10 or older => return version number
        return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
    }
    var trident = ua.indexOf('Trident/');
    if (trident > 0) {
        // IE 11 => return version number
        var rv = ua.indexOf('rv:');
        return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
    }
    var edge = ua.indexOf('Edge/');
    if (edge > 0) {
        // Edge (IE 12+) => return version number
        return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
    }
    // other browser
    return false;
}

ссылка: https://codepen.io/gapcode/pen/vEJNZN

person jeetaz    schedule 06.09.2016

Не усложняйте слишком простые вещи. Просто используйте простой условный комментарий JScript. Это самый быстрый, потому что он добавляет нулевой код в браузеры, отличные от IE, для обнаружения, и он имеет совместимость с версиями IE до того, как были поддержаны условные комментарии HTML. Короче,

var IE_version=(-1/*@cc_on,@_jscript_version@*/);

Остерегайтесь минификаторов: большинство (если не все) ошибочно принимают специальный условный комментарий за обычный и удаляют его

По сути, приведенный выше код устанавливает значение IE_version для версии IE, которую вы используете, или -1, если вы не используете 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>");
}

Это работает на основе того факта, что условные комментарии видны только в старых версиях Internet Explorer, а IE устанавливает @_jscript_version для версии браузера. Например, если вы используете Internet Explorer 7, тогда @_jscript_version будет установлено в 7, таким образом, обработанный javascript, который будет выполняться, на самом деле будет выглядеть так:

var IE_version=(-1,7);

который оценивается в 7.

person Community    schedule 18.05.2017

Это помогло мне

function IsIE8Browser() {
  var rv = -1;
  var ua = navigator.userAgent;
  var re = new RegExp("Trident\/([0-9]{1,}[\.0-9]{0,})");
  if (re.exec(ua) != null) {
    rv = parseFloat(RegExp.$1);
  }
  return (rv == 4);
}
person Pablo    schedule 30.01.2018

function getIEVersion(){
     if (/MSIE |Trident\//.test( navigator.userAgent )=== false) return -1;
    /**[IE <=9]*/
    var isIE9L = typeof ( window.attachEvent ) === 'function' && !( Object.prototype.toString.call( window.opera ) == '[object Opera]' ) ? true : false;
    var re;
    if(isIE9L){
        re = new RegExp( "MSIE ([0-9]{1,}[\.0-9]{0,})" );
        if(re.exec( navigator.userAgent ) !== null)
            return parseFloat( RegExp.$1 );
        return -1;
    }
    /**[/IE <=9]*/
    /** [IE >= 10]*/
    if(navigator.userAgent.indexOf( 'Trident/' ) > -1){
        re = new RegExp( "rv:([0-9]{1,}[\.0-9]{0,})" );
        if(re.exec( navigator.userAgent ) !== null)
            return parseFloat( RegExp.$1 );
        return -1;
    }
    /**[/IE >= 10]*/
    return -1;
};

Отметьте здесь ==>

var ieVersion = getIEVersion();

if(ieVersion < 0){
    //Not IE
}
//A version of IE

Подробнее о навигаторе браузера https://developer.mozilla.org/en-US/docs/Web/API/Window/navigator

person Rajib Chy    schedule 01.04.2018


Простое решение перестать думать браузером и использовать год.

var year = eval(today.getYear());
if(year < 1900 )
 {alert('Good to go: All browsers and IE 9 & >');}
else
 {alert('Get with it and upgrade your IE to 9 or >');}
person James Gray    schedule 20.02.2015
comment
Не могли бы вы объяснить, почему вы думаете, что это сработает. - person ; 18.05.2017