当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用JavaScript检测InternetExplorer6的最佳方法是什么?》经验,为你挑选了4个好方法。

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

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

Bjorn.. 32

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


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



1> Bjorn..:

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


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


应该.条件注释是Microsoft引入的一种方法,只是在IE的特定版本中运行某些代码.因为它们在HTML注释中,所以其他浏览器会忽略它.
那是什么其他浏览器?如果您打算使用Trident4支持第三方浏览器,那么您将遇到更多问题,而不仅仅是条件评论不起作用......您可能也支持W3.org的Amaya.忽略安德鲁的评论,条件评论总是适用于"低级"浏览器.
此外,条件评论是微软推荐的IE6定位方式.
@apphacker:Internet Explorer 6使用了Trident 4引擎,但我猜这不是重点......
有条件的评论不是一个可行的选择.虽然它们直接在IE中工作,但在使用WebBrowser控件时可以在其他类似的浏览器中禁用它们.在这种情况下,您的条件评论变得无用.大多数使用Trident4引擎的第三方浏览器都关闭了条件注释.
仅仅因为原始问题包含术语"使用Javascript"而被投票.HTML条件注释不是Javascript解决方案.当你编写可移植的Javascript时,就像Javascript库一样,你需要一个Javascript解决方案.

2> thomasrutter..:

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

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


+1感谢您实际回答问题并且没有对为什么应该使用特征检测进行咆哮,浏览器检测在某些情况下仍然完全有效.
当特征检测实际上是您想要做的事情时(特别是当人们询问有关浏览器检测的情况时),特征检测是首选.但是,当您需要针对特定​​浏览器版本中的错误应用解决方法时,通常无法进行特征检测(例如,可能是渲染错误,因此无法"检测").如果您确实使用基于用户代理的浏览器检测,则需要确保正则表达式仅针对特定的错误版本,而不是未来版本 - 或者当未来版本的浏览器"修复"该错误时,您的代码将会中断.

3> Hannoun Yass..:
  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


你为什么贬低这个答案?是的,功能检测还可以,但他正在回答OP的问题.很确定OP在某些情况下没有要求关于特征检测>浏览器检测的肛门传福音.
@Andrew,没有人问过如何检测不是IE6但使用Trident的浏览器.问题是*具体*关于IE6

4> Andrew Moore..:

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


这是特征推断和片状.根据`document.getBoxObjectFor`或`window.mozInnerScreenX`或`navigator.taintEnabled`的存在,你会做出什么推论?如果您打算使用这些来改变与这些测试对象无关的行为,那么从检查userAgent字符串到我只需要一小步.这些对象可以由JavaScript覆盖,并且通常非标准和因此受到浏览器manaufacturers率性:MooTools的被这个最近相当刺痛(http://ajaxian.com/archives/mootools-call-to-upgrade).
不想单独列出这个答案,但总的来说,我很厌倦看到Stackoverflow上的问题的答案基本上说"不要那样做".难道我们不能相信问题提问者有充分的理由专门检测IE6,而不是基于特征的检测吗?例如,问题提示者可能希望向用户说"您的Internet Explorer版本已过期".
这似乎不是您在评论中建议的功能检测,而是对此问题的其他答案.
推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有