Каков наилучший способ обнаружения Internet Explorer 6 с помощью JavaScript? - PullRequest
17 голосов
/ 04 февраля 2010

Каков наилучший способ обнаружения Internet Explorer 6 с помощью JavaScript?

If browser == IE6 {
    alert('hi');
}

Ответы [ 9 ]

32 голосов
/ 04 февраля 2010

Условные комментарии - хорошая альтернатива:

<!--[if IE 6]>
<script>
var everythingIsBroken = true;
</script>
<![endif]-->

Редактировать : Если вы все еще хотите поддержать IE 6 в 2017 году или после ... ну, мое сердце к вам. Ответ на этот вопрос в 2017 году на самом деле не стоит беспокоиться об IE 6. Он больше не поддерживается браузером. Любая операционная система, которая может запускать этот браузер и сам браузер, больше не получает обновлений безопасности. Это означает, что пользователи, использующие это программное обеспечение, подвергаются большому риску эксплуатации. Это большая проблема для людей, которые не могут позволить себе обновление.

27 голосов
/ 31 марта 2010

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

if (/\bMSIE 6/.test(navigator.userAgent) && !window.opera) {
  // yep, browser claims to be IE6
}
6 голосов
/ 04 февраля 2010
  var ua = window.navigator.userAgent;
  var msie = ua.indexOf ( "MSIE " );

  if ( msie > 0 )      // If Internet Explorer, return version number
     return parseInt (ua.substring (msie+5, ua.indexOf (".", msie )));
  else                 // If another browser, return 0
     return 0;

Источник: http://support.microsoft.com/kb/167820

5 голосов
/ 04 февраля 2010

Не основывайте свое обнаружение на пользовательском агенте.Есть множество других браузеров, которые используют движок Trident 4 (тот, который использует IE6), которые не являются IE6.

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


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

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

Следующий скрипт использует функции браузера для обнаружения движка.Благодарим команду разработчиков MooTools (http://mootools.net/developers/).

Примечание: Приведенный ниже фрагмент кода был изменен для работы без фреймворка JavaScript MooTools . Если вы действительно хотите работатьс MooTools вам больше не нужен этот код, он является частью дистрибутива.

function $tryCatch(){
    for (var i = 0, l = arguments.length; i < l; i++){
        try {
            return arguments[i]();
        } catch(e){}
    }
    return null;
};

var Browser = {

    Engine: {name: 'unknown', version: 0},

    Platform: {name: (window.orientation != undefined) ? 'ipod' : (navigator.platform.match(/mac|win|linux/i) || ['other'])[0].toLowerCase()},

    Features: {xpath: !!(document.evaluate), air: !!(window.runtime), query: !!(document.querySelector)},

    Plugins: {},

    Engines: {

        presto: function(){
            return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925));
        },

        trident: function(){
            return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? ((document.querySelectorAll) ? 6 : 5) : 4);
        },

        webkit: function(){
            return (navigator.taintEnabled) ? false : ((Browser.Features.xpath) ? ((Browser.Features.query) ? 525 : 420) : 419);
        },

        gecko: function(){
            return (!document.getBoxObjectFor && window.mozInnerScreenX == null) ? false : ((document.getElementsByClassName) ? 19 : 18);
        }

    }

};

Browser.Platform[Browser.Platform.name] = true;

Browser.detect = function(){

    for (var engine in this.Engines){
        var version = this.Engines[engine]();
        if (version){
            this.Engine = {name: engine, version: version};
            this.Engine[engine] = this.Engine[engine + version] = true;
            break;
        }
    }

    return {name: engine, version: version};

};

Browser.detect();

Browser.Request = function(){
    return $tryCatch(function(){
        return new XMLHttpRequest();
    }, function(){
        return new ActiveXObject('MSXML2.XMLHTTP');
    }, function(){
        return new ActiveXObject('Microsoft.XMLHTTP');
    });
};

Browser.Features.xhr = !!(Browser.Request());

Browser.Plugins.Flash = (function(){
    var version = ($tryCatch(function(){
        return navigator.plugins['Shockwave Flash'].description;
    }, function(){
        return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
    }) || '0 r0').match(/\d+/g);
    return {version: parseInt(version[0] || 0 + '.' + version[1], 10) || 0, build: parseInt(version[2], 10) || 0};
})();

function $exec(text){
    if (!text) return text;
    if (window.execScript){
        window.execScript(text);
    } else {
        var script = document.createElement('script');
        script.setAttribute('type', 'text/javascript');
        script[(Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerText' : 'text'] = text;
        document.head.appendChild(script);
        document.head.removeChild(script);
    }
    return text;
};

Просто включите этот класс JavaScript, и вы сможете обнаруживать IE6 и любой другой браузер, используя движок Trident4сделав следующее:

if(Browser.Engine.trident4) {
   alert('IE6 or similar...');
} elseif(Browser.Engine.name == "trident") {
   alert('Internet Explorer Trident Rendering Engine Version ' + Browser.Engine.version);
}
4 голосов
/ 12 декабря 2011

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

var div = document.createElement("div");
div.innerHTML = "<!--[if IE 6]><i></i><![endif]-->";
var isIe6 = (div.getElementsByTagName("i").length == 1);

alert("Is IE 6: " + isIe6);
2 голосов
/ 16 апреля 2010

Очень позднее добавление.

В дополнение к условным комментариям HTML, используемым в ответе apphacker , реализация Microsoft JScript также предоставляет условные комментарии для JavaScript :

<script type="text/javascript">
    var isIE6 = /*@cc_on/*@if(@_jscript_version<=5.6)1@else@*/0/*@end@*/;

    if (isIE6) {
        alert("You're screwed");
    }
</script>

Хорошо, что его также можно использовать во внешних файлах JavaScript (.js).

Для таблицы со списком версий JScript, реализованных хост-приложениями Microsoft: Информация о версии JavaScript

1 голос
/ 04 февраля 2010

Какой лучший способ обнаружитьиспользуя JavaScript?

По нет.

Как отметил Эндрю Мур в комментариях к этому сообщению, вы должны использовать функцию обнаружения функций.Это сделает ваш код более «ориентированным на будущее».Если другой браузер включает или больше не поддерживает функцию в будущем, тогда ваш код будет в безопасности.Есть несколько сайтов, объясняющих, как с этим справиться.Концепция огромна и охватывает множество концепций, поэтому вместо того, чтобы написать эссе / книгу по этому вопросу, вот некоторые ресурсы для использования:

0 голосов
/ 25 октября 2013
<!--[if (IE 6)|(IE 7)]>
<script>
    alert("Lesser browser detected!");
</script>
<![endif]-->
0 голосов
/ 04 февраля 2010

Я не уверен, есть ли особая причина, по которой вы хотите обнаружить IE 6, но в целом лучше попытаться обнаружить функции браузера, а не обнаруживать браузер. Вы можете легко сделать это с помощью JQuery, используя jQuery.support: http://api.jquery.com/jQuery.support/.

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