Best way to check for IE less than 9 in JavaScript without library

前端 未结 14 1630
失恋的感觉
失恋的感觉 2020-11-28 21:10

What would be your fastest, shortest (best) way to detect browser which is IE and version less than 9 in JavaScript, without using jQuery or any add-on libraries?

相关标签:
14条回答
  • 2020-11-28 21:28

    You could do it in a quick and dirty fashion with a regular expression and .match():

    if (navigator.userAgent.match(/MSIE\s(?!9.0)/)) {
        // ie less than version 9
    }
    
    0 讨论(0)
  • 2020-11-28 21:30

    Using conditional comments, you can create a script block that will only get executed in IE less than 9.

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

    Of course, you could precede this block with a universal block that declares var is_ie_lt9=false, which this would override for IE less than 9. (In that case, you'd want to remove the var declaration, as it would be repetitive).

    EDIT: Here's a version that doesn't rely on in-line script blocks (can be run from an external file), but doesn't use user agent sniffing:

    Via @cowboy:

    with(document.createElement("b")){id=4;while(innerHTML="<!--[if gt IE "+ ++id+"]>1<![endif]-->",innerHTML>0);var ie=id>5?+id:0}
    
    0 讨论(0)
  • 2020-11-28 21:40

    If I were you I would use conditional compilation or feature detection.
    Here's another alternative:

    <!--[if lt IE 9]><!-->
    <script>
        var LTEIE8 = true;
    </script>
    <!--<![endif]-->
    
    0 讨论(0)
  • 2020-11-28 21:41

    Below is an improvement over James Padolsey's solution:

    1) It doesn't pollute memory (James' snippet creates 7 unremoved document fragments when detecting IE11, for example).
    2) It's faster since it checks for a documentMode value before generating markup.
    3) It's far more legible, especially to beginning JavaScript programmers.

    Gist link: 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;
    })();
    
    0 讨论(0)
  • 2020-11-28 21:41

    I liked Mike Lewis' answer but the code did not pass jslint and I could not understand the funky while loop. My use case is to put up a browser not supported message if less than or equal to IE8.

    Here is a jslint free version based on Mike Lewis':

    /*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);
        }
    }());
    
    0 讨论(0)
  • 2020-11-28 21:44

    Does it need to be done in JavaScript?

    If not then you can use the IE-specific conditional comment syntax:

    <!--[if lt IE 9]><h1>Using IE 8 or lower</h1><![endif]-->
    
    0 讨论(0)
提交回复
热议问题