Как я могу определить, какую версию IE использует пользователь в JavaScript?

В некотором существующем коде есть тест, чтобы увидеть, работает ли пользователь IE, проверяя, определен ли объект Browser.Engine.trident и возвращает ли он истину.

Но как я могу определить, использует ли пользователь IE6 (или более раннюю версию) или IE7 (или более позднюю версию)?

Тест необходим внутри функции JavaScript, поэтому условный комментарий не подходит.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
17
0
29 551
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

Если вы уже используете jQuery в версии до 1.9 и вам не нужно обнаруживать IE 11, вы можете сделать это:

if (jQuery.browser.msie == true) { 
if (jQuery.browser.version == 7.0)
  // .. do something for 7.0
else 
  // .. do something for < 7.0
}

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

TravisO 11.11.2008 16:43

автоматический -1 голос за болезнь вопросов SO JavaScript, перетаскивание сотен строк фреймворка, чтобы сделать тривиальный однострочный.

bobince 11.11.2008 17:50

Многие из нас уже используют jQuery по другим причинам, поэтому полезно получить ответы на эти вопросы. Как видите, оно намного лаконичнее, чем решение на чистом javascript.

Adam Lassek 01.12.2008 17:30

Если у вас уже нет jQuery на вашем сайте (а у кого его нет), что делает этот ответ лучшим на сегодняшний день.

Adam Rackis 16.09.2011 07:18

jQuery.browser устарел в версии 1.3 и больше не поддерживается в версии 1.9.0. Если вы обновитесь до 1.9.0 и используете jQuery.browser, он больше не будет работать.

Ricketts 20.01.2013 01:48

Объект Navigator содержит всю информацию о браузере пользователя:

например:

var browser = navigator.appName;

вар b_version = навигатор.appVersion;

var version = parseFloat (b_version);

Видеть:

http://www.w3schools.com/js/js_browser.asp

Это полезно знать, но в этом случае navigator.appVersion возвращает «4» как в IE6, так и в IE7, поэтому я не могу использовать это, чтобы различать их. Спасибо хоть.

Simon 11.11.2008 16:45

На самом деле это уже не так. HTML5 говорит, например, что navigator.appName 'должен возвращать либо строку «Netscape», либо полное имя браузера, например "Mellblom Browsernator" - и эта версия приложения должна возвращать либо строку "4.0", либо строку, подробно представляющую версию браузера, например «1.0 (VMS; en-US) Mellblomenator / 9000» - поэтому этот код будет возвращать версию = 4.0 или 1.0 для любого браузера, совместимого с HTML5.

Spike0xff 06.11.2013 20:03

Если вы проверяете определенную функциональность, вам следует проверить ее напрямую, например if (window.focus) {window.focus();}Обнаружение браузера никогда не бывает достаточно надежным.

Для получения дополнительной информации об обнаружении объекта и браузера, посмотрите эту статью на Quirksmode.

С другой стороны, если вам нужна функция, ЕСТЬ тип и версия браузера, например для статистических целей используйте navigator.appName и navigator.appVersion. (Однако будьте осторожны - многие менее популярные браузеры маскируются под MSIE 6 или 7, поскольку определенные сайты блокируют все, что не является IE, на том основании, что «все современные браузеры - это IE, верно?» (Подсказка: больше нет).)

Неплохо подмечено. Хотя в этом случае наличие объекта не говорит мне, IE это 6 или 7. Мне нужно знать, как обойти ошибку в IE6.

Simon 12.11.2008 01:25

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

<script>
    var isIE = false;
    var version = -1;
</script>
<!--[if IE 6]>
    <script>
        isIE = true;
        version = 6
    </script>
<![endif]-->
<!--[if IE 7]>
    <script>
        isIE = true;
        version = 7
    </script>
<![endif]-->

Это довольно понятно. В IE6 isIE - это true, а version - это 6, в IE7 isIE - это true, а version - это 7, в противном случае isIE является ложным, а version - это -1.

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

var userAgent = navigator.userAgent.toLowerCase();
var version = (userAgent.match( /.+(?:rv|it|ra|ie)[/: ]([\d.]+)/ ) || [])[1],
var isIE = /msie/.test( userAgent ) && !/opera/.test( userAgent ),    

Извините, я пропустил часть вашего сообщения, в которой вы говорите, что условные комментарии не подходят

James Hughes 11.11.2008 17:07

Это сценарий, который я использую, и он, кажется, работает достаточно хорошо:

// Returns 0 if the browser is anything but IE
function getIEVersion() {
   var ua = window.navigator.userAgent;
   var ie = ua.indexOf("MSIE ");
   return ((ie > 0) ? parseInt(ua.substring(ie+5, ua.indexOf(".", ie))) : 0);
}

Надеюсь, это кому-то поможет ...

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

Обновлено: Единственный раз, когда мне показалось полезным иметь условные комментарии, было то, что мне нужно было включить ie6.css или ie7.css.

Ответ принят как подходящий

Из более эффективное обнаружение Internet Explorer в msdn:

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 >= 6.0 ) 
      msg = "You're using a recent copy of Internet Explorer."
    else
      msg = "You should upgrade your copy of Internet Explorer.";
  }
  alert( msg );
}

Это должно дать вам больше деталей, чем вы хотите:

var agent = navigator.userAgent;
var msiePattern = /.*MSIE ((\d+).\d+).*/
if ( msiePattern.test( agent ) ) {
  var majorVersion = agent.replace(msiePattern,"$2");
  var fullVersion = agent.replace(msiePattern,"$1");
  var majorVersionInt = parseInt( majorVersion );
  var fullVersionFloat = parseFloat( fullVersion );
}

Поскольку, кажется, еще никто этого не сказал:

The test is needed inside a JavaScript function so a conditional comment doesn't seem suitable.

Вы можете легко поместить условный комментарий - условный комментарий JScript, а не HTML - внутри функции:

function something() {
    var IE_WIN= false;
    var IE_WIN_7PLUS= false;
    /*@cc_on
    @if (@_win32)
        IE_WIN= true;
        @if (@_jscript_version>=5.7)
            IE_WIN_7PLUS = true;
        @end
    @end @*/
    ...
}

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

CC более надежны, чем просеивать беспорядок, в который превратилась строка User-Agent в наши дни. Методы сопоставления строк в navigator.userAgent могут неверно идентифицировать браузеры, использующие спуфинг, такие как Opera.

Конечно, сниффинг возможностей намного лучше для кроссбраузерного кода, где это возможно, но в некоторых случаях - обычно это обходные пути для исправления ошибок - вам действительно нужно конкретно идентифицировать IE, и CC, вероятно, лучший способ сделать это сегодня.

Таким образом, режим просмотра совместимости IE8 сообщает о себе как IE7, хотя он не всегда ведет себя одинаково. И за это даю вам этого монстра:

    // IE8's "Compatibility mode" is anything but.  Oh well, at least it doesn't take 40 lines of code to detect and work around it.
// Oh wait:
/*
 * Author: Rob Reid
 * CreateDate: 20-Mar-09
 * Description: Little helper function to return details about IE 8 and its various compatibility settings either use as it is
 * or incorporate into a browser object. Remember browser sniffing is not the best way to detect user-settings as spoofing is
 * very common so use with caution.
*/
function IEVersion(){
    var _n=navigator,_w=window,_d=document;
    var version = "NA";
    var na=_n.userAgent;
    var ieDocMode = "NA";
    var ie8BrowserMode = "NA";
    // Look for msie and make sure its not opera in disguise
    if (/msie/i.test(na) && (!_w.opera)){
        // also check for spoofers by checking known IE objects
        if (_w.attachEvent && _w.ActiveXObject){        
            // Get version displayed in UA although if its IE 8 running in 7 or compat mode it will appear as 7
            version = (na.match( /.+ie\s([\d.]+)/i ) || [])[1];
            // Its IE 8 pretending to be IE 7 or in compat mode        
            if (parseInt(version)==7){                
                // documentMode is only supported in IE 8 so we know if its here its really IE 8
                if (_d.documentMode){
                    version = 8; //reset? change if you need to
                    // IE in Compat mode will mention Trident in the useragent
                    if (/trident/\d/i.test(na)){
                        ie8BrowserMode = "Compat Mode";
                    // if it doesn't then its running in IE 7 mode
                    }else{
                        ie8BrowserMode = "IE 7 Mode";
                    }
                }
            }else if (parseInt(version)==8){
                // IE 8 will always have documentMode available
                if (_d.documentMode){ ie8BrowserMode = "IE 8 Mode";}
            }
            // If we are in IE 8 (any mode) or previous versions of IE we check for the documentMode or compatMode for pre 8 versions            
            ieDocMode = (_d.documentMode) ? _d.documentMode : (_d.compatMode && _d.compatMode= = "CSS1Compat") ? 7 : 5;//default to quirks mode IE5                               
        }
    }

    return {
        "UserAgent" : na,
        "Version" : version,
        "BrowserMode" : ie8BrowserMode,
        "DocMode": ieDocMode
    }            
}
var ieVersion = IEVersion();
var IsIE8 = ieVersion.Version != "NA" && ieVersion.Version >= 8;

Это хорошо для сайтов с такими тегами: <meta http-equiv = "X-UA-Compatible" content = "IE=EmulateIE7, IE=9">

jfroom 26.04.2013 03:16

Ну ... вот что я придумал, немного подумав. просто хотел найти простое решение.

if (navigator.appName == 'Microsoft Internet Explorer') {
        // Take navigator appversion to an array & split it 
        var appVersion = navigator.appVersion.split(';');
        // Get the part that you want from the above array  
        var verNumber = appVersion[1];

        alert(verNumber);
}

Он возвращает ex: - MSIE 10.0, MSIE 9.0, MSIE 8.0

дополнительно расширить, если вы хотите проверить, является ли он «ниже» или «выше» версии IE, вы можете немного изменить

if (navigator.appName == 'Microsoft Internet Explorer') {
        var appVersion = navigator.appVersion.split(';');
        var verNumber = appVersion[1];
        // Reaplce "MSIE " from the srting and parse it to integer value        
        var IEversion = parseInt(verNumber.replace('MSIE ', ''));

        if (IEversion <= 9){
            alert(verNumber);
        }
}

получил базовую идею от w3schools, надеюсь, это кому-то поможет ...: D

<script>
    alert("It is " + isIE());

    //return ie number as int else return false
    function isIE() {
        var myNav = navigator.userAgent.toLowerCase();
        if (myNav.indexOf('msie') != -1) //ie less than ie11 (6-10)
        {
            return parseInt(myNav.split('msie')[1]);
        }
        else 
        {
            //Is the version more than ie11? Then return false else return ie int number
            return (!!(myNav.match(/trident/) && !myNav.match(/msie/)) == false)?false : parseInt(myNav.split('rv:')[1].substring(0, 2));               
        }
    }
</script>

Другие вопросы по теме