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

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

if(navigator.appName.indexOf("Internet Explorer")!=-1){     //yeah, he 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
    }
}

Будет ли этот код делать трюк?

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

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

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

Ответы

Ответ 1

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

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

<!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 your JS for IE..
    } else {
        // ..And here the full-fat code for everyone else
    }

}(jQuery));

Благодаря Paul Irish.

Ответ 2

Вернуть версию 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
}

или

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

или

if (isIE()) {
 // is IE
} else {
 // Other browser
}

Ответ 3

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

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

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

Ответ 4

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

Пример HTML:

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

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

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

Ответ 5

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

if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) {
   // MSIE
}

Ответ 7

Вот как AngularJS проверяет для 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
}

Ответ 8

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

function getIEVersion() {
    var match = navigator.userAgent.match(/(?:MSIE |Trident\/.*; rv:)(\d+)/);
    return match ? parseInt(match[1]) : undefined;
}

Ответ 9

Обнаружение 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;

}());

Ответ 10

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

<!--[if lt IE 9]>
<meta http-equiv="refresh" content="0;URL=http://google.com">
<![endif]-->

Ответ 11

Обнаружение версии IE с использованием обнаружения функции (IE7 +, браузеры до IE7 обнаруживаются как 7):

var ie = (function (){
    if (window.ActiveXObject === undefined) return null;
    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

Ответ 12

Ваш код может выполнить проверку, но, как вы думали, если кто-то попытается получить доступ к вашей странице с помощью 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
}

Ответ 13

Условные комментарии больше не поддерживаются в 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("/*@[email protected]*/!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);

Ответ 14

То есть 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";
  }

Или используйте lib, как bowser:

https://github.com/ded/bowser

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

http://modernizr.com/

Ответ 15

Чтобы обнаружить Internet Explorer 10 | 11, вы можете использовать этот маленький script сразу после тега 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>

Ответ 16

Это ответит на смерть, но это все, что вам нужно.

!!navigator.userAgent.match(/msie\s[5-8]/i)

Ответ 17

var Browser = new function () {
    var self = this;
    var nav = navigator.userAgent.toLowerCase();
    if (nav.indexOf('msie') != -1) {
        self.ie = {
            version: toFloat(nav.split('msie')[1])
        };
    };
};


if(Browser.ie && Browser.ie.version > 9)
{
    // do something
}

Ответ 18

В соответствии с 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 );
}

Ответ 19

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

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

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

Ответ 20

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

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

</script>

Ответ 21

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

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

    // ----------------------------------------------------------
    // 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.

Ответ 22

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

_.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>

Ответ 23

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

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

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

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

Ответ 24

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

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

var isIE = { browser:/*@[email protected]*/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:/*@[email protected]*/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());
}

Ответ 25

Обнаружение 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.

Ответ 26

Если вам нужно отменить версию браузера 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>

Ответ 27

Запуск окон 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>

Ответ 28

var isIE9OrBelow = function()
{
   return /MSIE\s/.test(navigator.userAgent) && parseFloat(navigator.appVersion.split("MSIE")[1]) < 10;
}

Ответ 29

if (!document.addEventListener) {
    // ie8
} else if (!window.btoa) {
    // ie9
}
// others

Ответ 30

// Detect ie <= 10
var ie = /MSIE ([0-9]+)/g.exec(window.navigator.userAgent)[1] || undefined;

console.log(ie);
// Return version ie or undefined if not ie or ie > 10