使用JavaScript检测Internet Explorer 6的最佳方法是什么?
If browser == IE6 {
alert('hi');
}
使用JavaScript检测Internet Explorer 6的最佳方法是什么?
If browser == IE6 {
alert('hi');
}
条件注释是一个不错的替代方案:
<!--[if IE 6]>
<script>
var everythingIsBroken = true;
</script>
<![endif]-->
编辑:如果你仍然在2017年或之后寻求支持IE6......好吧,我很同情你。在2017年回答这个问题的答案是真的不用担心IE6了。它不再是一个得到支持的浏览器。任何能够运行该浏览器的操作系统和浏览器本身都不再获得安全更新。这意味着使用此软件的用户面临极大的被攻击风险。这对于那些无法承担升级费用的人来说是一个大问题。
冒着真正回答问题的风险(并假设问者有一个好的理由来特别检测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;
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类,您就可以通过以下方式检测IE6和使用Trident4引擎的任何其他浏览器:
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覆盖,并且通常是非标准的,因此受浏览器制造商的影响:MooTools最近就因此受到了打击(http://ajaxian.com/archives/mootools-call-to-upgrade)。 - Tim Down最可靠的方法是使用条件注释,如@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条件注释外,微软的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>的最佳方法?
不用。
正如安德鲁·摩尔在本帖的评论中提到的,您应该使用功能检测。这将使您的代码更具“未来性”。如果另一个浏览器在未来包含或不再支持某个功能,则您的代码将是安全的。有许多网站解释如何处理此问题。概念是巨大的,涵盖了很多概念,因此,而不是在此写一篇文章/书籍,以下是一些可用的资源:
<!--[if (IE 6)|(IE 7)]>
<script>
alert("Lesser browser detected!");
</script>
<![endif]-->
我不确定你是否有特殊原因想要检测IE 6,但通常最好尝试检测浏览器的功能而不是检测浏览器本身。您可以使用jQuery.support轻松实现此操作,具体请参考http://api.jquery.com/jQuery.support/。