繁体   English   中英

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

[英]What is the best way to detect Internet Explorer 6 using JavaScript?

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

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

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

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

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

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

if (/\bMSIE 6/.test(navigator.userAgent) && !window.opera) {
  // yep, browser claims to be IE6
}
  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

不要将检测基于用户代理。 还有很多其他浏览器使用不是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);
}

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

很晚才加入。

除了在apphacker的答案中使用的HTML条件注释之外 ,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 )中。

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

使用JavaScript检测<browser_x>的最佳方法是什么?

不是。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM