在没有使用jQuery或任何附加库的情况下,您最快、最简短(最佳)的方法是如何检测JavaScript中的IE浏览器版本小于9?
在没有使用jQuery或任何附加库的情况下,您最快、最简短(最佳)的方法是如何检测JavaScript中的IE浏览器版本小于9?
Javascript
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;
}());
你可以这样做:
ie < 9
来源于James Panolsey的这里:http://james.padolsey.com/javascript/detect-ie-in-js-using-conditional-comments
while
语法吗?还是某种特殊的技巧? - Tim Bütheall[0]
(即div中第一个<i>
元素)。只要结果为“真值”(找到了<i>),它就会升级IE版本并继续执行。 - Brad Christie就算价值不高:
if( document.addEventListener ){
alert("you got IE9 or greater");
}
这样可以成功地针对 IE 9+,因为 addEventListener
方法在几乎所有主流浏览器(Chrome、Firefox、Opera 和 Safari)早期就被支持了,但不包括 IE。MDN 参考文献。目前在 IE9 中得到支持,并且我们可以期望它继续得到支持。
document.addEventListener
的 polyfill,那么这种方法就会失效。在这方面上,IE 条件注释是绝对可靠的。 - Daniel Weinerif(!document.attachEvent){ // IE8+ }
- Jesper Jensen通过条件注释,你可以创建一个只会在IE9及以下版本中执行的脚本块。
<!--[if lt IE 9 ]>
<script>
var is_ie_lt9 = true;
</script>
<![endif]-->
当然,你可以在此代码块之前加上一个通用块,声明var is_ie_lt9=false
,这将覆盖IE 9以下的值。(在这种情况下,您需要删除var
声明,因为它是重复的)。
编辑:这是一个不依赖于内联脚本块(可以从外部文件运行),但不使用用户代理嗅探的版本:with(document.createElement("b")){id=4;while(innerHTML="<!--[if gt IE "+ ++id+"]>1<![endif]-->",innerHTML>0);var ie=id>5?+id:0}
去你的条件注释!全程使用条件代码!!!(IE太傻了)
<script type="text/javascript">
/*@cc_on
var IE_LT_9 = (@_jscript_version < 9);
@*/
</script>
说真的,只是想提供一个更好的选择...它们是同样的东西,这可以放在.js文件中而不是内联HTML中
注意:这里jscript_version检查到“9”完全是巧合。将其设置为8、7等不会检查“是否为IE8”,您需要查找这些浏览器的jscript版本。
IE_LT_9 == false
,在IE8中则为true
。我现在正在使用Mac,这里没有PC,所以无法测试它,但我从我编写的代码中提取了这个,我知道它是有效的。如果由于某种原因它不能正常工作,请使用alert(@_jscript_version)
查看您得到的内容并进行调整。 - user578895以下是对James Padolsey的解决方案的改进:
1) 它不会污染内存(例如,当检测到IE11时,James的代码会创建7个未删除的文档片段)。
2) 它更快,因为它在生成标记之前检查documentMode值。
3) 它更易于阅读,特别是对于初学JavaScript的程序员。
Gist链接:https://gist.github.com/julianshapiro/9098609
/*
- Behavior: For IE8+, we detect the documentMode value provided by Microsoft.
- Behavior: For <IE8, we inject conditional comments until we detect a match.
- Results: In IE, the version is returned. In other browsers, false is returned.
- Tip: To check for a range of IE versions, use if (!IE || IE < MAX_VERSION)...
*/
var IE = (function() {
if (document.documentMode) {
return document.documentMode;
} else {
for (var i = 7; i > 0; i--) {
var div = document.createElement("div");
div.innerHTML = "<!--[if IE " + i + "]><span></span><![endif]-->";
if (div.getElementsByTagName("span").length) {
return i;
}
}
}
return undefined;
})();
var ie = !-[1,]; // true if IE less than 9
这个技巧在ie5、6、7、8中得到支持。它已在ie9+中修复(因此适合这个问题的需求)。这个技巧在所有IE兼容模式下都有效。
原理:ie引擎将带有空元素的数组(如[,1])视为具有两个元素的数组,而其他浏览器则认为只有一个元素。因此,当我们使用+运算符将该数组转换为数字时,我们做了类似于这样的事情:(',1'在ie / '1'在其他浏览器中)* 1,我们在ie中得到NaN,在其他浏览器中得到1。然后我们将其转换为布尔值,并使用!翻转值。简单明了。顺便说一句,我们可以使用更短的版本,不需要!符号,但是值将被反转。
这是迄今为止最短的技巧。我是作者;)
if(!!document.createElement('canvas').getContext) alert('what is needed, supported');
if (document.all && !document.addEventListener) {
alert('IE8 or older.');
}
您可以使用正则表达式和.match()
方法来快速粗略地完成此操作:
if (navigator.userAgent.match(/MSIE\s(?!9.0)/)) {
// ie less than version 9
}
如果我是你,我会使用条件编译或特性检测。
这里还有另一种选择:
<!--[if lt IE 9]><!-->
<script>
var LTEIE8 = true;
</script>
<!--<![endif]-->