使用JavaScript检测Internet Explorer 6的最佳方法是什么?

时间:2010-02-04 00:09:12

标签: javascript jquery

使用JavaScript检测Internet Explorer 6的最佳方法是什么?

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

9 个答案:

答案 0 :(得分:32)

条件评论是一个不错的选择:

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

编辑:如果您仍然希望在2017年或之后支持IE 6,那么我的心就会向您致敬。 2017年这个问题的答案实在不用担心IE 6.它不再是受支持的浏览器了。任何可以运行此浏览器的操作系统和浏览器本身都不再获得安全更新。这意味着使用此软件的用户很有可能被利用。对于负担不起升级的人来说,这是一个大问题。

答案 1 :(得分:27)

冒着实际回答问题的风险(并且暂时假设提问者有充分的理由专门检测IE6):

if (/\bMSIE 6/.test(navigator.userAgent) && !window.opera) {
  // yep, browser claims to be IE6
}

答案 2 :(得分:6)

  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

答案 3 :(得分:5)

不要将检测基于用户代理。还有很多其他浏览器使用不是IE6的Trident 4引擎(IE6使用的那个)。

答案很简单:不检测浏览器,检测引擎 。为此,您必须使用所谓的基于特征的检测


使用基于特征的检测具有以下优点:

  • 使用与目标类似的渲染引擎检测所有浏览器。
  • 更简单的代码分支,以解决渲染引擎的问题。
  • 减少误报(可以修改UA以作为另一个浏览器传递,功能不能)。

以下脚本使用浏览器功能来检测引擎。感谢MooTools制作团队(http://mootools.net/developers/)。

注意:以下代码段已修改为在没有MooTools javascript框架的情况下工作。如果您确实希望使用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类,您就可以通过执行以下操作来检测使用Trident4引擎的IE6和任何其他浏览器:

if(Browser.Engine.trident4) {
   alert('IE6 or similar...');
} elseif(Browser.Engine.name == "trident") {
   alert('Internet Explorer Trident Rendering Engine Version ' + Browser.Engine.version);
}

答案 4 :(得分:3)

最可靠的方法是使用@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);

答案 5 :(得分:2)

很晚才加入。

除了apphacker's answer中使用的HTML条件评论之外,Microsoft的JScript实施还提供了conditional comments for 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)。

有关列出Microsoft主机应用程序实现的JScript版本的表: JavaScript Version Information

答案 6 :(得分:1)

  

检测&lt; browser_x&gt;的最佳方式是什么?使用JavaScript?

不是。

正如Andrew Moore在本文的评论中提到的那样,你应该使用特征检测。这将使您的代码更加“面向未来”。如果其他浏览器包含或将来不再支持某项功能,那么您的代码将是安全的。有很多网站在那里解释如何处理这个问题。这个概念很大,涵盖了很多概念,所以不是写一篇关于这个的论文/书,这里有一些资源可供使用:

答案 7 :(得分:0)

我不确定您是否有特殊原因要检测IE 6,但一般来说最好是尝试检测浏览器的功能而不是检测浏览器。您可以使用jQuery.support轻松地使用JQuery执行此操作:http://api.jquery.com/jQuery.support/

答案 8 :(得分:0)

<!--[if (IE 6)|(IE 7)]>
<script>
    alert("Lesser browser detected!");
</script>
<![endif]-->