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

IT技术 javascript internet-explorer browser browser-detection
2021-03-03 00:38:35

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

6个回答

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

它只是在内存中,它创建的 div 实际上并没有被添加到 DOM 中。
2021-04-24 00:38:35
只是想知道......所有这些(div,all)都只是在内存中,还是 DOM 实际上被多次访问以获取版本?
2021-04-30 00:38:35
嗯,这是常规while语法吗?或者某种黑客攻击?
2021-05-08 00:38:35
@TimBüthe:逗号运算符本质上它是添加内部 HTML 并返回all[0](这是<i>div 中的第一个)。只要结果是“真实的”(<i>找到了),它就会上升到 IE 版本并继续。
2021-05-09 00:38:35
值得注意的是 IE不再支持条件注释IE10+
2021-05-16 00:38:35

物有所值:

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

这成功地针对 IE 9+,因为该addEventListener方法很早就被除 IE 之外的每个主要浏览器支持。(Chrome、Firefox、Opera 和 Safari)MDN 参考它目前在 IE9 中得到支持,我们可以期待它在这里继续得到支持。

var ltIE9 = !document.addEventListener;
2021-04-17 00:38:35
防止方法因 polifill 失败。只需转动它并检查:if( !document.attachEvent){ // IE8+ }
2021-04-19 00:38:35
我喜欢这个答案。这不是浏览器版本检测,而是浏览器功能检测——这通常更有用。检测像“addEventListener”这样的功能不仅可以将 IE8 与 IE9 分开,还可以将旧浏览器与一般支持 HTML5 的浏览器分开。
2021-04-26 00:38:35
不幸的是,如果你有 polyfill,这会失败document.addEventListenerIE 条件注释在这方面是万无一失的。
2021-05-06 00:38:35
这是我认为最好的答案,浏览器检测应该通过检测特定功能/
2021-05-10 00:38:35

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

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

当然,您可以在此块之前添加一个通用块声明var is_ie_lt9=false,这将覆盖小于 9 的 IE。(在这种情况下,您需要删除var声明,因为它会重复)。

编辑:这是一个不依赖于内嵌脚本块的版本(可以从外部文件运行),但不使用用户代理嗅探:

通过@cowboy :

with(document.createElement("b")){id=4;while(innerHTML="<!--[if gt IE "+ ++id+"]>1<![endif]-->",innerHTML>0);var ie=id>5?+id:0}
它的优点是不涉及任何 RegEx,并且大概不会被欺骗。IE 解析变量就像它什么都没有。(对于 IE 来说,这是在说些什么。)
2021-05-08 00:38:35
@cwolves 的解决方案似乎允许您在外部脚本中运行它(我从未尝试过。)
2021-05-09 00:38:35
使用条件标签创建一个全局变量......很有趣。
2021-05-12 00:38:35
这很好,我可以使用 if(window.ielt9)。我想知道是否有比这更好的非内联脚本解决方案?(这将是豪华的......)
2021-05-16 00:38:35

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

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

说真的,只是把它扔在那里,以防它更适合你……它们是一样的,这可以放在 .js 文件中,而不是内联 HTML

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

OMFG,我刚刚通过 RDC 在五台机器上测试了这个,它适用于每一台机器。IE8 说“5.8”,IE9 说“9”。您做错了什么或假设您当时没有使用 IE9 引擎。正如我所说,处于“兼容模式”或具有不同用户代理的 IE9 仍然是 IE9。运行独立版本的 IE8、IE7 或任何以前的版本,代码就可以工作了。
2021-04-21 00:38:35
无论哪种方式,使用 IE8 的独立版本,您都不会在该警报中得到“9”。你会得到 '5.8' 或类似的东西(不确定他们是否更新过 JScript 引擎,但不是 9)
2021-04-22 00:38:35
@bcm - 你应该进入IE_LT_9 == falseIE9 和trueIE8。我现在使用的是 mac,这里没有 PC,所以我无法测试它,但我从我编写的我知道有效的代码中提取了它。如果由于某种原因它不起作用,alert(@_jscript_version)看看你得到了什么并从那里调整。
2021-04-29 00:38:35
感叹代码有效,IE9 在“兼容模式”下实际上并没有运行 IE7,它仍然使用 IE9 的 JS 引擎。 jsfiddle.net/aNGXS 根据 IETester:IE9 说“9”,IE8 说“5.6”
2021-05-09 00:38:35
不过,您仍在运行 IE9!这会检测到 -THAT-。如果您在 IE8 中运行独立副本,它会显示这一点。不要因为 Microsoft 开发工具一文不值而责怪我。
2021-05-13 00:38:35

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

1)它不会污染内存(例如,James 的代码片段在检测 IE11 时创建了 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;
})();