Вопрос по internet-explorer, javascript, browser-detection, user-agent – Определить версию IE (до v9) в JavaScript

242

Я хочу, чтобы пользователи нашего веб-сайта отображали страницу с ошибкой, если они используют версию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
    }
}

Этот код поможет?

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

Yes, I know that users can forge their useragent string. I'm not concerned. Yes, I know that programming pros prefer sniffing out feature-support instead of browser-type but I don't feel this approach makes sense in this case. I already know that all (relevant) non-IE browsers support the features that I need and that all pre-v9 IE browsers don't. Checking feature by feature throughout the site would be a waste. Yes, I know that someone trying to access the site using IE v1 (or >= 20) wouldn't get 'badBrowser' set to true and the warning page wouldn't be displayed properly. That's a risk we're willing to take. Yes, I know that Microsoft has "conditional comments" that can be used for precise browser version detection. IE no longer supports conditional comments as of IE 10, rendering this approach absolutely useless.

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

Условные комментарии - это просто нормальные комментарии. Только IE интерпретирует их как специальные. IE10 + больше не будет этого делать. Andreas
"Это просто не стоит нашего времени и денег, чтобы поддержать IE pre-v9". Я хотел бы сделать это. Hassan
Исходя из пункта [2], я не буду предлагать Modernizr (en.wikipedia.org/wiki/Modernizr) - каждый должен где-то нарисовать линию на песке - но IE9 действительно кажется высокой линией amelvin
Официальная документация, в которой говорится, что IE10 + не поддерживает условные комментарии:blogs.msdn.com/b/ie/archive/2011/07/06/… - Благодаря:stackoverflow.com/a/9900331/320399 blong
IE 10 будет обрабатывать условные комментарии точно так же, как и браузеры без IE. Они являются действительными HTML-комментариями, поэтому будут рассматриваться как таковые. Я согласен с Андреасом и считаю, что условные комментарии - это путь. Tim Down

Ваш Ответ

29   ответов
16

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

function getIEVersion() {
    var match = navigator.userAgent.match(/(?:MSIE |Trident\/.*; rv:)(\d+)/);
    return match ? parseInt(match[1]) : undefined;
}
Оуэн, как можно использовать это на практике? Как получить возвращаемое значение? Я старалсяconsole.log(!!match && parseInt(match[1])), console.log(parseInt(match[1])) а такжеconsole.log(match), но без результата ни с одним из них.
Получить возвращаемое значение, вызвав саму функциюgetIEVersion(), Например:if (getIEVersion() < 9) {/* IE 8 or below */} if (!getIEVersion()) {/* Not IE */}
0
if (!document.addEventListener) {
    // ie8
} else if (!window.btoa) {
    // ie9
}
// others
3

!!navigator.userAgent.match(/msie\s[5-8]/i)
@alessadro - Но ведь так и должно быть? OP хотел проверить & lt; 9 ...
Этот код возвращаетсяfalse на IE11 ...
Кроме того, вот песочница, показывающая шаблон регулярных выражений для наиболее распространенных строк пользовательского агента IE:regex101.com/r/lC6oP3/1
2
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
}
351

римечание: условные операторы поддерживаются только в 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));

БлагодаряПол Ирландский.

Принимая во внимание тот факт, что ОП запросил чисто JavaScript-решение, я считаю, что ответ @Tim Down ниже лучше, так как он не включает изменение существующего HTML, плюс он не использует jQuery:stackoverflow.com/a/10965203/134120
Я получаю сообщение об ошибке на W3 HTML валидатор:Error: Saw <!-- within a comment. Probable cause: Nested comment (not allowed). At line 5, column 21 if gt IE 8]><!--><html
15

браузеры до IE6 определяются как 6, возвращает ноль для браузеров не 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 для вашего удобства:т.е.-версия

Update:

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

return window.ActiveXObject === undefined ? null : !window.XMLHttpRequest ? 6 : !document.querySelector ? 7 : !document.addEventListener ? 8 : !window.atob ? 9 : !document.__proto__ ? 10 : 11;
@FrankFang см обновленный ответ
перейти по ссылке ...
Это то, что я ищу, спасибо. Но как определить IE 6?
хорошо, спасибо за тебя
15

Определить 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;

}());
Это почти совпадает с моим ответом.
@ Алан: Ярмарка очков. Я адаптировал свой вопрос к этому, но не привел источник.
@TimDown: Возможно, но этот ответ немного более функциональный (он сообщает вам номер версии) и хорошо прокомментирован. Кроме того, ссылка в начале этого ответа приводит к Gist с несколькими информативными комментариями и интересными вариациями этой техники.
1

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

jKey's approach works up to version 9 and immune to user agent spoofing in IE 8 & 9.

Owen's approach can fail on IE 5 & 6 (reporting 7) and is susceptible to UA spoofing, but it can detect IE versions >= 10 (now also including 12, which postdates Owen's answer).

// ----------------------------------------------------------
// 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 в основном полезна для более старых версий (& lt; 10); более высокие версии более совместимы со стандартами, и, вероятно, вместо этого лучше проверять функции, используя что-то вроде modernizr.js.

0

http://www.pinlady.net/PluginDetect/IE/, Вся библиотека находится наhttp://www.pinlady.net/PluginDetect/Browsers/.

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

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

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

1

//   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]
0

If you need to delect IE Browser version then you can follow below code. This code working well for version IE6 to IE11

<!DOCTYPE html>
<html>
<body>

<p>Click on Try button to check IE Browser version.
<button onclick="getInternetExplorerVersion()">Try it</button>

<p id="demo">

<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>
8

как указано вСправочная страница 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);

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

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

}
Этот код хорош, но не может определить режим просмотра совместимости. Я в IE 11 использую представление совместимости в IE 8, и этот код все еще даетversion 11 РЕДАКТИРОВАТЬ: Этот код удивительный! ха-ха, это дает объект со всем внутри. Версия 11, но docModeIR равен 9. Спасибо!
Это было единственное, что работало во всей сети, по крайней мере, огромное количество вещей, которые я пробовал ... спасибо;)
0

что немного опоздал на вечеринку здесь, но я искал простой однострочный способ предоставить обратную связь о том, является ли браузер 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());
}
2

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 );
}
В самом деле, и на тот случай, если кто-то еще приземлится здесь, пытаясь использовать вышеизложенное, код в следующем ответе действительно работает для IE11 (stackoverflow.com/a/26375930/1129926). Но будьте осторожны, он будет работать для IE12 и т. Д.? Суть в том, что лучше всего рассматривать их как временные хаки, и они могут потерпеть неудачу позже, когда будут выпущены новые версии браузера (я даже не упомянул Edge).
Не работает для IE11. Я знаю, что это старый ответ.
160

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
}
Обратите внимание, что в FF & quot; false & lt; 9 & Quot; является "верным". Итак, условие должно бытьif (isIE () && isIE () < 9) {
Не работает для 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"
Утвержденный ответ - как определить версию IE в HTML. Это отвечает на оригинальный вопрос.
@PrasadGayan - Microsoft Edge не является Internet Explorer. Поэтому возвращение false кажется правильным для этого.
@DeadlyChambers, возможно, он работал в режиме стандартов IE7?msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
27

проверка глобальных объектов может быть использован:

if (document.all && !document.addEventListener) {
    alert('IE8 or lower');
}
document.all - не поддерживается в IE 11 -msdn.microsoft.com/en-us/library/ie/ms537434%28v=vs.85%29.aspx
@RajaKhoury - это нормально, если вы пытаетесь проверить IE
3

маленький скрипт сразу после тега 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>
IE9 также трезубец, но не то же самое с поддержкой CSS. Ваше обнаружение считает, что по меньшей мере 10, но это неверно.
Мне нравится это спасибо, мне нужно только обнаружить 10 или 11, так как я не поддерживаю предыдущие версии
1

<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>
1

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

5

Вы можете использовать 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/

Я пробовал несколько сценариев и решений, но ничего не получалось. Затем я включил Bowser в проект, и он просто сработал. Так что один за предложение Bowser.
1

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

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

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

113

й IE & lt; 9 и условные комментарии будут работать в этих браузерах; в других браузерах (IE & gt; = 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");
}
JavaScript-версия ответа @Tim Down мне очень понравилась. Я использовал 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. Ницца!
10

но, как вы и думали, если кто-то попытается получить доступ к вашей странице с помощью IE v1 или & gt; 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
}
Это не хороший ответ. UA-сниффинг ненадежен. Подробнее об этом здесь:modernizr.com/docs
@Jezen Иногда UA-сниффинг - это путь:github.com/Modernizr/Modernizr/issues/538
0
var isIE9OrBelow = function()
{
   return /MSIE\s/.test(navigator.userAgent) && parseFloat(navigator.appVersion.split("MSIE")[1]) < 10;
}
0

дартизировано 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>
0

и все, что вам нужно, это немного нативный / ванильный 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, включая более высокие версии в более низком режиме совместимости View / Mode, иdocumentMode является собственностью IE.

12

которая объясняет, почему нам не нравится & lt; IE9 и предоставить ссылки на браузеры, которые мы предпочитаем.

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

проверки для 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
}
Я думаю, что вы можете это исправить, проверив значение в window.onload, когда документ уже загружен.
Согласно справочнику MSDN, «когда текущий документ еще не определен, documentMode возвращает значение ноль (0). Обычно это происходит при загрузке документа. & Quot; Означает ли это, что вы не можете получить действительный ответ в скрипте, загруженном в & lt; head & gt ;?
Согласно документам, IE8 + поддерживает это свойство, поэтому я думаю, что этого должно быть достаточно для большинства случаев.
Ого, это намного проще, чем все условные комментарии! Нет ограничений этого?
55

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

Похожие вопросы