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.isIE
variables被设置为我们所有的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的人添加一个链接:
对于我的用例,我真的只需要检测是否低于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;