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


76

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


我完全了解DOM中的条件。只对性能最佳的小型JavaScript解决方案感兴趣。
bcm

5
当您要使用特定于版本的功能时,请不要忘记功能检测是最可靠的事情(但是,该功能可以存在,但在某些版本中存在错误,请记住这一点)。如果要在页面上显示浏览器版本,请使用浏览器检测

3
我同意Dan,但实际上,对于每个人来说,将特定的差异与特征(检测)联系起来通常并不简单明了。即使是这样,如提供的答案一样(例如:<9),代码也可能更易于阅读。
bcm

Answers:


117

Java脚本

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


2
只是想知道...所有这些(div,全部)是仅在内存中还是为了访问版本而实际访问了DOM多次?
bcm

它只是在内存中,它创建的div实际上并没有添加到DOM中。
Mike Lewis,

5
嗯,这是常规while语法吗?还是某种骇客?
TimBüthe2013年

13
@TimBüthe:逗号运算符。本质上,它是添加内部HTML并返回all[0](这是<i>div中的第一个)。只要结果是“真实的”(<i>找到了),它就会在IE版本中继续运行。
布拉德·克里斯蒂

1
值得注意的是IE不再支持条件注释IE10 +
daviestar

99

物有所值:

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

这成功针对IE 9+,因为该addEventListener方法在IE以外的所有主要浏览器中都得到了很早的支持。(Chrome,Firefox,Opera和Safari)MDN参考。IE9当前支持它,我们可以期望它继续得到支持。


3
我认为这是最好的答案,应该通过检测特定功能来实现浏览器检测/
7dr3am7 2013年

4
我喜欢这个答案。这不是浏览器版本检测,而是浏览器功能检测-通常更有用。检测“ addEventListener”之类的功能不仅将IE8与IE9分开,而且还将旧的浏览器与具有HTML5功能的浏览器分开。
garyv 2014年

8
var ltIE9 = !document.addEventListener;
josephrace 2014年

6
不幸的是,如果您已进行polyfilled,则此操作将失败document.addEventListener。IE条件注释在这方面是防故障的。
Daniel Weiner

2
为了防止方法失败。只需将其旋转并检查:if( !document.attachEvent){ // IE8+ }
杰斯珀·詹森

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}

2
使用条件标签创建全局变量...有趣。
bcm

它的优点是不涉及任何RegEx,并且大概不会被欺骗。IE将变量解析为空。(对于IE,这是在说些什么。)
Yahel 2011年

这非常好,我可以使用if(window.ielt9)。我想知道是否有比这更好的非内联脚本解决方案?(那是豪华的...)
bcm

@cwolves的解决方案似乎允许您在外部脚本中运行它(我从未尝试过。)
Yahel 2011年

10

h有条件评论!始终有条件的代码!!!(傻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-您应该进入IE_LT_9 == falseIE9和trueIE8。我现在使用的是Mac,并且这里没有PC,因此无法测试,但是我从编写的代码中撤出了我知道的代码。如果由于某种原因它不起作用,alert(@_jscript_version)请查看您得到的内容并从那里进行调整。
马克·卡恩

2
感叹代码工作,IE9不实际运行IE7当它在“兼容模式”,它仍然使用IE9的JS引擎。 jsfiddle.net/aNGXS 据IETester称:IE9说“ 9”,IE8说“ 5.6”
Mark Kahn

1
无论哪种方式,使用独立版本的IE8都不会在该警报中显示“ 9”。您将得到'5.8'或类似的信息(不确定他们是否曾经更新过JScript引擎,但是不是9)
Mark Kahn

1
OMFG,我刚刚通过RDC在五台计算机上对此进行了测试,并且它可以在每台计算机上使用。IE8说“ 5.8”,IE9说“ 9”。您做错了什么,或者假设您不在使用IE9引擎。就像我说的那样,处于“兼容模式”或具有不同用户代理的IE9仍然是IE9。运行独立版本的IE8,IE7或任何以前的版本,代码即可正常工作。
马克·卡恩

3
您仍然在运行IE9!这将检测到-THAT-。如果您运行的是IE8的独立副本,则会显示出来。不要怪我Microsoft开发工具一文不值。
马克·卡恩

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;
})();

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

ie5,6,7,8支持此hack。它在ie9 +中是固定的(因此适合此问题的要求)。该技巧适用于所有IE兼容模式。

工作原理:即引擎将具有空元素(例如[,1])的数组视为具有两个元素的数组,相反,其他浏览器认为只有一个元素。因此,当我们使用+运算符将此数组转换为数字时,我们将执行以下操作:(',1'在ie中/其他在'1')* 1,在Na中获得NaN,在其他情况下获得1。然后我们将其转换为布尔值并使用!反转值。简单。顺便说一句,我们可以使用较短的版本而无需!符号,但值将相反。

到目前为止,这是最短的hack。我是作者;)


你能解释为什么/为什么吗?看起来有点讨厌:您依赖JavaScript引擎的怪癖,并且JavaScript引擎的特定版本对应于特定的IE版本。在调试工具中设置为向后兼容或兼容模式的较新IE中,这仍然有效吗?
Rup 2015年

ie5,6,7,8支持此hack。它在ie9 +中是固定的(因此适合此问题的要求)。工作原理:即引擎将具有空元素的数组(如[,1])视为具有两个元素的数组,而其他浏览器则认为只有一个元素。因此,当我们使用+运算符将此数组转换为数字时,我们将执行以下操作:(',1'在ie中/其他在'1')* 1,在Na中获得NaN,在其他情况下获得1。然后我们将其转换为布尔值并使用!反转值。简单。顺便说一句,我们可以使用较短的版本而无需!符号,但值将相反。
Aleko 2015年

好的,但是如果我将IE 9设置为IE 7兼容模式,它将检测到IE 7吗?不过,感谢您的解释-最好将其编辑成答案,而不要留作评论。
Rup 2015年



4

您可以使用正则表达式和.match()

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

8
不幸的是,除IE 9.其他仅检测的IE例如它也将用于IE 10.真
添詹森

4

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

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

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);
    }
}());

1
因为jquery 2.x不支持ie <9,所以这段代码将导致错误,崩溃,恐惧和厄运。

1

是否需要用JavaScript完成?

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

<!--[if lt IE 9]><h1>Using IE 8 or lower</h1><![endif]-->

1
JavaScript解决方案,而不是在DOM
BCM

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

0

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

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

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

基本上,然后上面的代码将IE_version的值设置为您正在使用的IE版本,或者将-1f设置为不使用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>");
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.