在没有库的情况下在JavaScript中检查IE小于9的最佳方法

bcm*_*bcm 77 javascript browser internet-explorer browser-detection

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

Mik*_*wis 118

使用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;

}());
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

ie < 9
Run Code Online (Sandbox Code Playgroud)

来自这里的James Panolsey:http://james.padolsey.com/javascript/detect-ie-in-js-using-conditional-comments

  • @TimBüthe:[逗号运算符](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator).本质上它是添加内部HTML并返回`all [0]`(这是div中的第一个`<i>`).只要结果是"truthy"(发现`<i>`),它就会上升到IE版本并继续. (13认同)
  • 嗯,这是常规`while`语法吗?还是某种黑客攻击? (5认同)
  • 只是想知道......所有这些(div,all)只是在内存中还是DOM实际被多次访问以获得版本? (2认同)

vec*_*tor 99

物有所值:

    if(  document.addEventListener  ){
        alert("you got IE9 or greater");
    }
Run Code Online (Sandbox Code Playgroud)

这成功地针对IE 9+,因为该addEventListener方法很早就支持每个主流浏览器,但IE.(Chrome,Firefox,Opera和Safari)MDN参考.它目前在IE9中得到支持,我们可以预期它将继续得到支持.

  • `var ltIE9 =!document.addEventListener;` (8认同)
  • 不幸的是,如果您已经填充了`document.addEventListener`,则会失败.IE条件评论在这方面是不可靠的. (6认同)
  • 我喜欢这个答案.这不是浏览器版本检测,它是浏览器功能检测 - 通常更有用.检测像'addEventListener'这样的功能不仅会将IE8与IE9分开,而且会将旧浏览器与支持HTML5的浏览器分开. (4认同)
  • 在我看来,这是最好的答案,应该通过检测特定功能来接近浏览器检测/ (3认同)
  • 防止方法失败polifill.只需转动它并检查:`if(!document.attachEvent){// IE8 +}` (2认同)

Yah*_*hel 27

使用条件注释,您可以创建一个仅在小于9的IE中执行的脚本块.

<!--[if lt IE 9 ]>
<script>
var is_ie_lt9 = true;
</script>
<![endif]--> 
Run Code Online (Sandbox Code Playgroud)

当然,你可以在这个块之前加上一个声明的通用块,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}
Run Code Online (Sandbox Code Playgroud)

  • 使用条件标签创建全局变量...有趣. (2认同)

Mar*_*ahn 10

bah有条件的评论!条件代码一路!!! (愚蠢的IE)

<script type="text/javascript">
/*@cc_on
   var IE_LT_9 = (@_jscript_version < 9);
@*/
</script>
Run Code Online (Sandbox Code Playgroud)

但是说真的,只要把它扔到那里以防它更适合你...它们是同一个东西,这可以只是在.js文件而不是内联HTML

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

  • 你还在运行IE9!这检测到-THAT-.如果你运行IE8的独立副本,它会显示出来.不要因为微软开发工具毫无价值而责备我. (3认同)
  • _sigh_代码有效,IE9在'兼容模式'时实际上并没有运行IE7,它仍然使用IE9的JS引擎.http://jsfiddle.net/aNGXS/据IETester称:IE9表示"9",IE8表示"5.6" (2认同)

exe*_*ion 9

以下是对James Padolsey解决方案的改进:

1)它不会污染内存(例如,当检测到IE11时,James的代码片段会创建7个未删除的文档片段).
2)它更快,因为它在生成标记之前检查documentMode值.
3)它更易读,特别是对于初学JavaScript程序员.

要点链接: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;
})();
Run Code Online (Sandbox Code Playgroud)


Ale*_*eko 8

var ie = !-[1,]; // true if IE less than 9
Run Code Online (Sandbox Code Playgroud)

ie5,6,7,8支持这种黑客攻击.它固定在ie9 +(所以它适合这个问题的要求).此hack适用于所有IE兼容模式.

它是如何工作的:即引擎处理带有空元素的数组(如此[,1])作为带有两个元素的数组,而其他浏览器则认为只有一个元素.因此,当我们使用+运算符将此数组转换为数字时,我们会执行以下操作:(',1'在ie /'1'在其他情况下)*1,我们在ie中获得NaN,在其他中获得1.然后用!将它转换为布尔值和反向值.简单.顺便说一句,我们可以使用更短的版本!标志,但价值将被逆转.

这是目前最短的黑客攻击.我是作者;)


bcm*_*bcm 6

我决定改用对象检测.

阅读本文后: http ://www.quirksmode.org/js/support.html和此:http: //diveintohtml5.ep.io/detect.html#canvas

我会用类似的东西

if(!!document.createElement('canvas').getContext) alert('what is needed, supported');
Run Code Online (Sandbox Code Playgroud)


Mic*_*nin 5

此链接包含有关检测Internet Explorer版本的相关信息:

http://tanalin.com/en/articles/ie-version-js/

例:

if (document.all && !document.addEventListener) {
    alert('IE8 or older.');
}
Run Code Online (Sandbox Code Playgroud)