在JavaScript中,没有使用库检查IE版本小于9的最佳方法是什么?

77

在没有使用jQuery或任何附加库的情况下,您最快、最简短(最佳)的方法是如何检测JavaScript中的IE浏览器版本小于9?


我对DOM中的条件语句非常了解,只对最佳且高效的JavaScript解决方案感兴趣。 - bcm
5
不要忘记在想使用特定版本的功能时,特性检测 是最可靠的选择(但是要记住,该功能可能存在于某些版本中但有缺陷)。如果你想在页面上显示浏览器版本,请使用浏览器检测 - Dan
3
我同意,但实际上,并不是每个人都能轻松地将某个差异联系到一个特定的功能(检测)。即使可以,当代码像所提供的答案(例如:ie < 9)时,阅读代码可能会更容易。 - bcm
14个回答

117

2
只是想知道...所有这些(div, all)是在内存中还是实际上多次访问DOM来获取版本? - bcm
5
这是常规的 while 语法吗?还是某种特殊的技巧? - Tim Büthe
13
@TimBüthe: 逗号运算符。本质上它是将内部HTML添加起来并返回all[0](即div中第一个<i>元素)。只要结果为“真值”(找到了<i>),它就会升级IE版本并继续执行。 - Brad Christie
@BradChristie 哦,逗号运算符。没想到它存在,非常感谢。 - Tim Büthe
1
值得注意的是,IE浏览器不再支持条件注释,仅适用于IE10及以上版本。 - daviestar
显示剩余3条评论

99

就算价值不高:

    if(  document.addEventListener  ){
        alert("you got IE9 or greater");
    }

这样可以成功地针对 IE 9+,因为 addEventListener 方法在几乎所有主流浏览器(Chrome、Firefox、Opera 和 Safari)早期就被支持了,但不包括 IE。MDN 参考文献。目前在 IE9 中得到支持,并且我们可以期望它继续得到支持。


3
在我看来,这是最好的答案。浏览器检测应该通过检测特定的函数/特征来实现。 - 7dr3am7
4
我喜欢这个答案。它不是浏览器版本检测,而是浏览器能力检测-通常更有用。检测像'addEventListener'这样的特性不仅会将IE8与IE9分开,还会将旧的浏览器与HTML5兼容的浏览器总体分开。 - garyv
8
var ltIE9 = !document.addEventListener; 这段代码的意思是:判断当前浏览器是否为IE9及以下版本,如果是则变量ltIE9的值为true,否则为false。 - Joseph Race
6
如果你使用了 document.addEventListener 的 polyfill,那么这种方法就会失效。在这方面上,IE 条件注释是绝对可靠的。 - Daniel Weiner
2
为了防止填充方法失败,只需将其反转并检查: if(!document.attachEvent){ // IE8+ } - Jesper Jensen
显示剩余4条评论

27

通过条件注释,你可以创建一个只会在IE9及以下版本中执行的脚本块。

<!--[if lt IE 9 ]>
<script>
var is_ie_lt9 = true;
</script>
<![endif]--> 
当然,你可以在此代码块之前加上一个通用块,声明var is_ie_lt9=false,这将覆盖IE 9以下的值。(在这种情况下,您需要删除var声明,因为它是重复的)。 编辑:这是一个不依赖于内联脚本块(可以从外部文件运行),但不使用用户代理嗅探的版本:
通过@cowboy
with(document.createElement("b")){id=4;while(innerHTML="<!--[if gt IE "+ ++id+"]>1<![endif]-->",innerHTML>0);var ie=id>5?+id:0}

2
使用条件标签创建全局变量...有趣。 - bcm
它的优点是不涉及任何正则表达式,而且据说不可欺骗。IE解析变量就像什么都没有一样。(对于IE来说,这是很了不起的事情。) - Yahel
这很不错,我可以使用 if(window.ielt9)。我想知道是否有比这更好的非内联脚本解决方案?(这将是时髦的...) - bcm
看起来 @cwolves 的解决方案可以让你在外部脚本中运行它(我从未尝试过)。 - Yahel

10

去你的条件注释!全程使用条件代码!!!(IE太傻了)

<script type="text/javascript">
/*@cc_on
   var IE_LT_9 = (@_jscript_version < 9);
@*/
</script>

说真的,只是想提供一个更好的选择...它们是同样的东西,这可以放在.js文件中而不是内联HTML中

注意:这里jscript_version检查到“9”完全是巧合。将其设置为8、7等不会检查“是否为IE8”,您需要查找这些浏览器的jscript版本。


1
@bcm - 在IE9中,您应该得到IE_LT_9 == false,在IE8中则为true。我现在正在使用Mac,这里没有PC,所以无法测试它,但我从我编写的代码中提取了这个,我知道它是有效的。如果由于某种原因它不能正常工作,请使用alert(@_jscript_version)查看您得到的内容并进行调整。 - user578895
2
代码可以运行,但IE9在“兼容模式”下实际上并不运行IE7,它仍然使用IE9的JS引擎。http://jsfiddle.net/aNGXS/根据IETester:IE9显示“9”,IE8显示“5.6”。 - user578895
1
无论如何,使用独立版本的IE8,您将不会在警告中得到“9”。您将获得“5.8”或类似的内容(不确定是否有更新JScript引擎,但它不是9)。 - user578895
1
天啊,我刚刚通过RDC在五台机器上测试了这个,它在每一台机器上都能正常工作。IE8显示“5.8”,IE9显示“9”。你可能做错了什么或者认为你没有使用IE9引擎,但事实并非如此。就像我说的,即使是IE9在“兼容模式”下或使用不同的用户代理,它仍然是IE9。运行独立版本的IE8、IE7或任何早期版本,代码都可以正常工作。 - user578895
3
你仍在使用IE9!这会检测到那个问题。如果你运行一个独立的IE8副本,它会显示出来。不要因为微软的开发工具毫无用处而责怪我。 - user578895
显示剩余4条评论

9

以下是对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;
})();

8
var ie = !-[1,]; // true if IE less than 9

这个技巧在ie5、6、7、8中得到支持。它已在ie9+中修复(因此适合这个问题的需求)。这个技巧在所有IE兼容模式下都有效。

原理:ie引擎将带有空元素的数组(如[,1])视为具有两个元素的数组,而其他浏览器则认为只有一个元素。因此,当我们使用+运算符将该数组转换为数字时,我们做了类似于这样的事情:(',1'在ie / '1'在其他浏览器中)* 1,我们在ie中得到NaN,在其他浏览器中得到1。然后我们将其转换为布尔值,并使用!翻转值。简单明了。顺便说一句,我们可以使用更短的版本,不需要!符号,但是值将被反转。

这是迄今为止最短的技巧。我是作者;)


你能解释一下那是如何/为什么起作用的吗?看起来有点像一个恶意的黑客攻击:你依赖于JavaScript引擎的怪异行为,以及特定版本的JavaScript引擎对应于特定版本的IE。在调试工具中设置为向后兼容或兼容模式的新版IE中,这种方法仍然有效吗? - Rup
此黑客技巧支持ie5,6,7,8。它在ie9+中已被修复(因此适合此问题的要求)。它的工作原理是:ie引擎将带有空元素的数组(如此[,1])视为具有两个元素的数组,而其他浏览器则认为只有一个元素。因此,当我们使用+运算符将此数组转换为数字时,我们会做出类似于这样的操作:(',1'在ie / '1'在其他浏览器中)*1,我们在ie中得到NaN,在其他浏览器中得到1。然后我们将其转换为布尔值,并使用!来反转值。简单。顺便说一句,我们可以使用没有!符号的更短版本,但值将被反转。 - Aleko
好的,但如果我将IE 9放入IE 7兼容模式中,它会检测到IE 7吗?不过还是谢谢你的解释 - 最好将其编辑到答案中,而不是留在评论中。 - Rup

6

5

我最喜欢你的回答。简单、代码行数不多且灵活。 - user2662680

4

您可以使用正则表达式和.match()方法来快速粗略地完成此操作:

if (navigator.userAgent.match(/MSIE\s(?!9.0)/)) {
    // ie less than version 9
}

8
很遗憾,它只能检测IE 9以外的IE版本。例如,它也适用于IE 10。 - Tim Jansen

4

如果我是你,我会使用条件编译或特性检测。
这里还有另一种选择:

<!--[if lt IE 9]><!-->
<script>
    var LTEIE8 = true;
</script>
<!--<![endif]-->

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接