smourph
3/24/2016 - 5:23 PM

IE version detector

IE version detector

/**
 * IE version detector
 */
var ieVersion = detectIEVersion();
if (ieVersion !== false) {
    detectIEAddClass(document.body, 'IE');
    if (ieVersion > 7) {
        detectIEAddClass(document.body, 'IE' + ieVersion);
    }
}
/**
 * return IE version number
 * return false if the browser is not IE
 * @returns integer|false
 */
function detectIEVersion() {
    var userAgent = navigator.userAgent;
    var regex;

    // IE 10 or older
    regex = new RegExp("MSIE ([0-9]{1,}[\\.0-9]{0,})");
    if (regex.exec(userAgent) !== null) {
        return parseInt(RegExp.$1);
    }

    // IE 11
    regex = new RegExp("Trident/.*rv:([0-9]{1,}[\\.0-9]{0,})");
    if (regex.exec(userAgent) !== null) {
        return parseInt(RegExp.$1);
    }

    // IE 12
    regex = new RegExp("Edge/([0-9]{1,}[\\.0-9]{0,})");
    if (regex.exec(userAgent) !== null) {
        return parseInt(RegExp.$1);
    }
    return false;
}

/**
 * add a class to a DOM element (for env without jQuery installed)
 */
function detectIEAddClass(element, classname) {
    var list = element.className.split(" ");
    if (list.indexOf(classname) == -1) {
        list[list.length] = classname;
    }
    element.className = list.join(" ");
}
/**
 * add ECMA262-5 indexOf method if not supported natively
 */
if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(searchElement, fromIndex) {
        var k;
        // 1. Let O be the result of calling ToObject passing
        //    the this value as the argument.
        if (null === this || undefined === this) {
            throw new TypeError('"this" is null or not defined');
        }
        var O = Object(this);
        // 2. Let lenValue be the result of calling the Get
        //    internal method of O with the argument "length".
        // 3. Let len be ToUint32(lenValue).
        var len = O.length >>> 0;
        // 4. If len is 0, return -1.
        if (len === 0) {
            return -1;
        }
        // 5. If argument fromIndex was passed let n be
        //    ToInteger(fromIndex); else let n be 0.
        var n = +fromIndex || 0;
        if (Math.abs(n) === Infinity) {
            n = 0;
        }
        // 6. If n >= len, return -1.
        if (n >= len) {
            return -1;
        }
        // 7. If n >= 0, then Let k be n.
        // 8. Else, n<0, Let k be len - abs(n).
        //    If k is less than 0, then let k be 0.
        k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
        // 9. Repeat, while k < len
        while (k < len) {
            // a. Let Pk be ToString(k).
            //   This is implicit for LHS operands of the in operator
            // b. Let kPresent be the result of calling the
            //    HasProperty internal method of O with argument Pk.
            //   This step can be combined with c
            // c. If kPresent is true, then
            //    i.  Let elementK be the result of calling the Get
            //        internal method of O with the argument ToString(k).
            //   ii.  Let same be the result of applying the
            //        Strict Equality Comparison Algorithm to
            //        searchElement and elementK.
            //  iii.  If same is true, return k.
            if (k in O && O[k] === searchElement) {
                return k;
            }
            k++;
        }
        return -1;
    };
}