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

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

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

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

  

编辑 :如果你仍然希望在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以作为另一个浏览器传递,function不能)。

以下脚本使用浏览器function来检测引擎。 感谢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 = ""; var isIe6 = (div.getElementsByTagName("i").length == 1); alert("Is IE 6: " + isIe6); 

很晚才加入。

除了apphacker的答案中使用的HTML条件注释之外 ,Microsoft的JScript实现还为JavaScript提供了条件注释 :

  

好处是它也可以用在外部JavaScript文件( .js )中。

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

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

不是。

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

  • 物体检测 (从这里开始)
  • 特征检测 (或从此处开始)
  • 浏览器检测与对象检测
  • jQuery.support – 如果您已经在页面上包含jQuery,那么检查function的好方法。

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