平常一般判断IE版本号多数都是使用正则去匹配USER_AGENT
,总觉得这个麻烦且有时不太好使,今天在Github Gist上看到一段优雅简短的JavaScript代码,用于判断IE版本号,向后兼容,调用方便。该JS使用到了IE条件注释,对IE条件注释还混淆不清的童鞋可前往这里看看:《IE浏览器条件注释if IE详解》。
- // ----------------------------------------------------------
- // 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:
- // ieVersion === false
- // If you're in IE (>=5) then you can determine which version:
- // ieVersion === 7; // IE7
- // Thus, to detect IE:
- // if (ieVersion) {}
- // And to detect the version:
- // ieVersion === 6 // IE6
- // ieVersion > 7 // IE8, IE9 ...
- // ieVersion < 9 // Anything less than IE9
- // ----------------------------------------------------------
- // UPDATE: Now using Live NodeList idea from @jdalton
- var ieVersion = (function() {
- var 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 : false;
- })();
思路很好,新增一个div
元素,然后通过使用while
循环判断使用IE条件注释的div
标签中是否含有i
标签,如果含有,v
则自增1,直到浏览器无法读取到i
标签为止。此时的v
值如果大于4则为IE的实际版本号,否则v
就是小于IE5的IE浏览器或者非IE浏览器,返回false
。
另外,此中的while
循环使用的也非常巧妙,说实话,我以前没见过这种用法。查了一下书本,实际上这是一个逗号操作符,逗号操作符多用于声明多个变量。但除此之外,逗号操作符还可以用于赋值,返回的是表达式最后一个值,举个例子:
- var num = (0,5,6,7,2,9);
- console.log(num); // 此时num返回的是最后一个值,即是9
实际上,代码中的while循环可以理解为do-while循环,效果是一样的:
- do {
- div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->';
- } while (all[0]);
参考资源:
- A short snippet for detecting versions of IE in JavaScript
- 《JavaScript高级程序设计(第3版)》