Javascript IE检测,为什么不使用简单的条件注释?

为了检测IE大多数JavaScript libaries做各种技巧。

  • jQuery似乎添加一个临时对象到你的页面的DOM来检测一些function,
  • YUI2在用户代理上执行YAHOO.env.ua = function() (文件yahoo.js

在阅读这个答案后,我想起它是真的,为了简单地检测IE中的IE我们可以简单地添加到我们的页面:

 <!--[if IE]><script type="text/javascript">window['isIE'] = true;</script><![endif]--> <script type="text/javascript" src="all-your-other-scripts-here.js"></script> 

现在, window.isIEvariables被设置为我们所有的Javascript代码,只需要做:

 if(window.isIE) ... 

除了这可能导致一个痛苦,因为它必须被添加到所有页面, 有没有我可能不知道的任何问题/考虑因素?


仅供参考:我知道最好使用对象检测而不是浏览器检测 ,但有些情况下您仍然需要使用浏览器检测。

James Padolsey 在GitHub上写了一小段代码 ,我将在这里引用:

 // ---------------------------------------------------------- // A short snippet for detecting versions of IE in JavaScript // without resorting to user-agent sniffing // ---------------------------------------------------------- // If you're not in IE (or IE version is less than 5) then: // ie === undefined // If you're in IE (>=5) then you can determine which version: // ie === 7; // IE7 // Thus, to detect IE: // if (ie) {} // And to detect the version: // ie === 6 // IE6 // ie > 7 // IE8, IE9 ... // ie < 9 // Anything less than IE9 // ---------------------------------------------------------- // UPDATE: Now using Live NodeList idea from @jdalton var ie = (function(){ var undef, v = 3, div = document.createElement('div'), all = div.getElementsByTagName('i'); while ( div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->', all[0] ); return v > 4 ? v : undef; }()); 

当然,所有的学分都应该发给詹姆斯,我只是信使(但是如果我的复制粘贴操作发生错误,请拍摄信使)。

也看看创build的叉子。 保罗·爱尔兰在评论中解释了内部运作。

如果你想这样做,我认为使用条件编译更好些,因为你可以在javascript里面做,而不需要改变html:

 var isIE = /*@cc_on!@*/false; 

Marcel Korpel的答案不再有效(在IE 10中它返回undef,所以IE 10看起来不是IE)。 注:现在更新与IE 11的工作也。

这是该代码的一个变体,但是来自微软的build议 。 如果你使用的是以前的代码,你可以放在这个替代品中,因为它的构build方式完全相同。

不像条件注释/编译,它应该也适用于最小化。

 // ---------------------------------------------------------- // If you're not in IE (or IE version is less than 5) then: // ie === undefined // If you're in IE (>=5) then you can determine which version: // ie === 7; // IE7 // Thus, to detect IE: // if (ie) {} // And to detect the version: // ie === 6 // IE6 // ie > 7 // IE8, IE9, IE10 ... // ie < 9 // Anything less than IE9 // ---------------------------------------------------------- var ie = (function(){ var undef,rv = -1; // Return value assumes failure. var ua = window.navigator.userAgent; var msie = ua.indexOf('MSIE '); var trident = ua.indexOf('Trident/'); if (msie > 0) { // IE 10 or older => return version number rv = parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10); } else if (trident > 0) { // IE 11 (or newer) => return version number var rvNum = ua.indexOf('rv:'); rv = parseInt(ua.substring(rvNum + 3, ua.indexOf('.', rvNum)), 10); } return ((rv > -1) ? rv : undef); }()); 

更新与IE11一起工作。 感谢'acarlon'指出这是行不通的,'mario'是我修复的代码!

IE 11已经改变了很多,现在很多浏览器检测的方法都不起作用。 下面的代码适用于IE 11及更早版本。

 function isIE() { var isIE11 = navigator.userAgent.indexOf(".NET CLR") > -1; var isIE11orLess = isIE11 || navigator.appVersion.indexOf("MSIE") != -1; return isIE11orLess; } 

我想我有你在找什么。 您可以使用Javascript和clientCaps将string“AA.BB.CCCC.DDDD”作为Internet Explorer的完整版本。

http://www.pinlady.net/PluginDetect/IE/

它似乎适用于IE 5.5及更高版本(包括IE 10)。 它对navigator.userAgent /文档模式/浏览器模式是免疫的。 不需要条件注释或任何额外的HTML元素。 这是一个纯粹的Javascript解决scheme。

目前我还不确定IE Mobile的行为,但是如果这个clientCaps方法失败的话,你总是可以使用备份检测方法。

到目前为止,我必须说,它工作得很好。

我认为你回答了你自己的问题:首先,它只能检测到IE,所以脚本本质上是将浏览器分成两部分:IE和<everythingelse>。

其次,你必须在每个HTML页面添加一个古怪的评论。 鉴于像jQuery和YUI这样的广泛的JavaScript库必须“容易”插入/利用广泛的网站,你会自动使他们更难以脱身。

navigator.userAgent存在,如果真的需要浏览器检测(而不是function检测),jQuery使用它来获取$.browser对象的信息。 这比在每个页面中包含一个特定于IE的条件注释要好得多。

在这里你可以find一些真正简单的黑客浏览器检测: http : //www.thespanner.co.uk/2009/01/29/detecting-browsers-javascript-hacks/

 var isIE = IE='\v'=='v'; 

我正在使用该代码

var isIE = navigator.userAgent.indexOf('MSIE')> -1;

检查浏览器是一个坏主意 – 最好是检查浏览器function 。 例如,您通常会检查用户是否使用IE,因为您想使用IE中不支持的某些function。 但是,您知道所有当前和未来的非IE浏览器将支持该function吗? 不,所以jQuery使用的方式更好:它创build并执行小testing用例,检查某些错误/function,并且可以简单地检查诸如(browser_supports_XYZ)之类的内容,而不是检查用户是否正在使用特定的浏览器。

无论如何,总是有必要检查浏览器是必要的,因为它是一个你无法testing使用脚本的视觉错误。 在这种情况下,最好使用JavaScript而不是条件注释,因为你有浏览器检查权限在你需要的地方,而不是在其他地方(想象一个.js文件,你检查isIE,这个文件从来没有在那个文件中定义)

 var version = navigator.userAgent.match(/(msie) (\d+)/i); console.log(version); 

看到这个问题后,我写了一个快速的东西,万一有人愿意的话。

**编辑**

根据下面的Johnny Darvall的评论,我正在为任何试图嗅探Internet Explorer 11的人添加一个链接:

http://blogs.msdn.com/b/ieinternals/archive/2013/09/21/internet-explorer-11-user-agent-string-ua-string-sniffing-compatibility-with-gecko-webkit.aspx

对于我的用例,我真的只需要检测是否低于IE9,所以我使用

 if (document.body.style.backgroundSize === undefined && navigator.userAgent.indexOf('MSIE') > -1) { //IE8- stuff } 

你为什么不用HTML5编程,并检查

 if ( window.navigator.product !== "Gecko" ) 

?? 诚然,这将包括IE11在“壁虎”一堆,但现在不应该是够好的?

注意:HTML5规范。 说navigator.product必须返回“壁虎”…和IE10和更早的所有返回的东西。

  • 它污染了全局命名空间
  • 它需要在两个文件中进行更改。
  • 它只适用于IE
  • 从技术上讲,有条件的评论仍然是一个评论

这工作得很好,
var isIe = !!window.ActiveXObject;