Как я могу определить, какую версию IE использует пользователь в JavaScript? - PullRequest
17 голосов
/ 11 ноября 2008

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

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

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

Ответы [ 12 ]

18 голосов
/ 11 ноября 2008

С Более эффективное обнаружение 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 );
}
12 голосов
/ 11 ноября 2008

Если вы действительно хотите быть уверенным, что используете 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 ),    
4 голосов
/ 11 ноября 2008

Если вы уже используете 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
}
3 голосов
/ 30 сентября 2010

Так что режим просмотра совместимости с 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;
3 голосов
/ 11 ноября 2008

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

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

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

3 голосов
/ 11 ноября 2008

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

например:

var browser = navigator.appName;

var b_version = navigator.appVersion;

var version = parseFloat (b_version);

См:

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

2 голосов
/ 11 ноября 2008

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

РЕДАКТИРОВАТЬ: Единственный раз, когда мне было полезно иметь условные комментарии, это когда мне нужно было включить ie6.css или ie7.css.

1 голос
/ 13 июня 2013

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

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

Возвращает, например: - 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

0 голосов
/ 13 марта 2014
<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>
0 голосов
/ 12 ноября 2008

Как никто, кажется, еще не сказал:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...