76

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

4

14 回答 14

117

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

于 2011-04-07T01:22:16.790 回答
99

物有所值:

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

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

于 2013-02-12T15:14:36.453 回答
27

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

<!--[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}
于 2011-04-07T01:23:14.080 回答
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 版本。

于 2011-04-07T01:36:11.400 回答
9

以下是对 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;
})();
于 2014-02-19T20:19:15.077 回答
8
var ie = !-[1,]; // true if IE less than 9

ie5、6、7、8 支持此 hack。它在 ie9+ 中是固定的(所以它适合这个问题的要求)。此 hack 适用于所有 IE 兼容模式。

它是如何工作的:即引擎将具有空元素的数组(如[,1])视为具有两个元素的数组,而不是其他浏览器认为只有一个元素。因此,当我们使用 + 运算符将此数组转换为数字时,我们会执行以下操作: (',1' in ie / '1' in others)*1 并且我们在 ie 中得到 NaN,在其他中得到 1。然后我们用 ! 将其转换为布尔值和反向值。简单的。顺便说一句,我们可以使用更短的版本而不使用 ! 符号,但值将反转。

这是目前最短的 hack。我是作者;)

于 2015-06-03T10:30:11.127 回答
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');
于 2011-04-07T02:25:04.603 回答
5

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

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

例子:

if (document.all && !document.addEventListener) {
    alert('IE8 or older.');
}
于 2013-04-19T17:40:18.010 回答
4

您可以使用正则表达式和快速而肮脏的方式来完成它.match()

if (navigator.userAgent.match(/MSIE\s(?!9.0)/)) {
    // ie less than version 9
}
于 2011-04-07T01:22:51.153 回答
4

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

<!--[if lt IE 9]><!-->
<script>
    var LTEIE8 = true;
</script>
<!--<![endif]-->
于 2011-04-07T07:45:56.463 回答
2

我喜欢 Mike Lewis 的回答,但代码没有通过 jslint,我无法理解时髦的 while 循环。如果小于或等于 IE8,我的用例是显示不支持浏览器的消息。

这是一个基于 Mike Lewis 的 jslint 免费版本:

/*jslint browser: true */
/*global jQuery */
(function () {
    "use strict";
    var browserNotSupported = (function () {
        var div = document.createElement('DIV');
        // http://msdn.microsoft.com/en-us/library/ms537512(v=vs.85).aspx
        div.innerHTML = '<!--[if lte IE 8]><I></I><![endif]-->';
        return div.getElementsByTagName('I').length > 0;
    }());
    if (browserNotSupported) {
        jQuery("html").addClass("browserNotSupported").data("browserNotSupported", browserNotSupported);
    }
}());
于 2013-08-25T22:48:03.253 回答
1

是否需要在 JavaScript 中完成?

如果没有,那么您可以使用特定于 IE 的条件注释语法:

<!--[if lt IE 9]><h1>Using IE 8 or lower</h1><![endif]-->
于 2011-04-07T01:23:02.503 回答
1
if (+(/MSIE\s(\d+)/.exec(navigator.userAgent)||0)[1] < 9) {
    // IE8 or less
}
  • 提取 IE 版本:/MSIE\s(\d+)/.exec(navigator.userAgent)
  • 如果它是非 IE 浏览器,这将返回null,所以在这种情况下||0将切换null0
  • [1]将获得 IE 的主要版本,或者undefined如果它不是 IE 浏览器
  • 前导+将其转换为数字,undefined将转换为NaN
  • 与数字比较NaN总是会返回false
于 2016-09-08T17:51:59.823 回答
0

你们都试图把这些简单的事情复杂化。只需使用简单的 JScript 条件注释即可。它是最快的,因为它向非 IE 浏览器添加了零代码进行检测,并且它的兼容性可以追溯到支持 HTML 条件注释之前的 IE 版本。简而言之,

var IE_version=(-1/*@cc_on,@_jscript_version@*/);

当心缩小器:大多数(如果不是全部)会将特殊条件注释误认为是常规注释,并将其删除

基本上,上面的代码将 IE_version 的值设置为您正在使用的 IE 版本,或者 -1 如果您不使用 IE。现场演示:

var IE_version=(-1/*@cc_on,@_jscript_version@*/);
if (IE_version!==-1){
    document.write("<h1>You are using Internet Explorer " + IE_version + "</h1>");
} else {
    document.write("<h1>You are not using a version of Internet Explorer less than 11</h1>");
}

于 2017-04-22T23:38:35.883 回答