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

使用JavaScript检测Internet Explorer 6的最佳方法是什么?,javascript,jquery,Javascript,Jquery,使用JavaScript检测Internet Explorer 6的最佳方法是什么 If browser == IE6 { alert('hi'); } 来源:有条件的评论是一个很好的选择: <!--[if IE 6]> <script> var everythingIsBroken = true; </script> <![endif]--> 编辑:如果您仍希望在2017年或之后支持IE 6。。。我的心向你倾心。2017年,这个问

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

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

来源:

有条件的评论是一个很好的选择:

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


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

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

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


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

  • 检测使用与目标类似的渲染引擎的所有浏览器
  • 更容易的代码分支来解决渲染引擎的问题
  • 更少的误报(UAs可以被修改为另一个浏览器,功能不能)
以下脚本使用浏览器功能检测引擎。归功于MooTools生产团队()

注意:下面的代码片段已被修改,可以在不使用javascript框架的情况下工作。如果您确实希望使用,则不再需要此代码,它是发行版的一部分

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进行检测的最佳方法是什么

If browser == IE6 {
    alert('hi');
}
当然不是

正如Andrew Moore在本文的评论中提到的,您应该使用特征检测。这将使您的代码更“经得起未来的考验”。如果其他浏览器包含某个功能,或者将来不再支持该功能,则您的代码将是安全的。有很多网站在解释如何处理这个问题。这个概念非常庞大,涵盖了很多概念,因此与其就此写一篇文章/一本书,不如使用以下资源:

  • (从这里开始)
  • (或从这里开始)
  • -如果页面上已经包含jQuery,那么检查功能的好方法

我不确定您想要检测IE 6是否有特殊原因,但一般来说,最好尝试检测浏览器的功能,而不是检测浏览器。您可以使用JQuery.support:.

轻松实现这一点,但要冒着实际回答问题的风险(假设提问者有充分的理由专门检测IE6):

非常晚的添加

除了中使用的HTML条件注释外,Microsoft的实现还提供:



var isIE6=/*@cc_on/*@if(@_jscript_version最可靠的方法是使用条件注释,如@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);
var div=document.createElement(“div”);
div.innerHTML=“”;
变量isIe6=(div.getElementsByTagName(“i”).length==1);
警报(“Is IE 6:+isIe6”);


if(一切都坏了)IE6=true;@woot4moo好吧,这是IE6,所以没关系anyway@womp1:永远不要使用用户代理来识别浏览器。使用基于功能的检测。为什么呢?这在IE、FF和chrome上都很好!为什么你对这个答案投反对票?是的,功能检测是可以的,但他是一个正确地回答OP的问题。非常确定OP没有要求在某些情况下就功能检测>浏览器检测如何进行分析宣传。最后给出了对实际问题的答案。但是,它不是很简洁。正则表达式会更好。@Andrew,没有人问到如何检测not IE6,但哪些确实使用了Trident。问题是关于IE6应该是什么。条件注释是Microsoft引入的一种方式,用于仅在(特定版本的)中运行某些代码IE。因为它们在HTML注释中,其他浏览器将忽略它。条件注释不是可行的替代方法。虽然它们直接在IE中工作,但在使用WebBrowser控件时,可以在其他类似浏览器中禁用它们。在这种情况下,您的条件注释将变得无用。大多数使用Trident4引擎的第三方浏览器都有附加注释已关闭。这是什么其他浏览器?如果您打算支持使用Trident4的第三方浏览器,您将遇到更多问题,而不仅仅是条件注释不起作用…您还可以支持W3.org的Amaya。忽略Andrew的注释,条件注释始终适用于“下层”浏览器。还有,条件评论是微软推荐的针对IE6的方法。@apphacker:InternetExplorer6使用Trident4引擎,但我想这不是重点……这似乎不像你在对这个问题的其他答案的评论中推荐的功能检测。@TimDown:我说的是基于功能的检测,不是fea真实检测。基于功能的检测尝试根据特定呈现引擎的JavaScript引擎中实现的功能来识别引擎。功能检测允许您根据是否检测到支持的功能来打开或关闭功能。了解用于呈现页面的引擎允许您修复呈现页面时出现的问题该页面上的动态元素。此方法也称为基于对象的检测。这是功能推断,而且是不可靠的。如果要使用这些来改变行为,您会/应该根据
文档.getBoxObjectFor
窗口.mozInnerScreenX
导航器.taintEnabled
的存在做出什么推断t与这些对象无关
if (/\bMSIE 6/.test(navigator.userAgent) && !window.opera) {
  // yep, browser claims to be IE6
}
<script type="text/javascript">
    var isIE6 = /*@cc_on/*@if(@_jscript_version<=5.6)1@else@*/0/*@end@*/;

    if (isIE6) {
        alert("You're screwed");
    }
</script>
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);
<!--[if (IE 6)|(IE 7)]>
<script>
    alert("Lesser browser detected!");
</script>
<![endif]-->