Как определить IE10 с помощью javascript?

Как уже отмечалось в других вопросах (также в документации jQuery), старый jQuery.browser.version устарел и работает только в jquery1.3.

Знаете ли вы еще один простой способ его обнаружить, который я могу включить в свой код раньше:

function handleInfoDivPopupVisibility(dynamicEleId, staticEleId){
var parentContainer = $('headerSummaryContainer');
var dynamicEle = $(dynamicEleId);
var staticEle = $(staticEleId);

if(isIE() && parentContainer){
    if (jQuery.browser.version != 10) { // I need to find a way to detect if it IE10 here.
        parentContainer.style.overflow = 'visible'; 
    }
}
dynamicEle ? dynamicEle.style.display = '' : '';
if(dynamicEle && staticEle)
    gui_positionBelow(dynamicEle, staticEle);
}

Прежде чем говорить о дублированном вопросе this или , я бы хотел что я не хочу использовать css-хаки. Есть ли способ обнаружить его так же просто, как я мог сделать раньше?

if (jQuery.browser.version != 10) {...

Ответ 1

В общем, это плохая идея проверить версию браузера, лучше рассмотреть функции браузера. Но если вы уверены, что делаете:

function getIEVersion(){
    var agent = navigator.userAgent;
    var reg = /MSIE\s?(\d+)(?:\.(\d+))?/i;
    var matches = agent.match(reg);
    if (matches != null) {
        return { major: matches[1], minor: matches[2] };
    }
    return { major: "-1", minor: "-1" };
}

var ie_version =  getIEVersion();
var is_ie10 = ie_version.major == 10;

У нас есть следующий код в производстве, поэтому он работает и проверен.

И да, нам нужно было обнаружить IE10, а не только определенную функцию, которая существует в IE10, но не в более ранних версиях.

Ответ 2

В Internet Explorer есть функция условной компиляции (http://www.javascriptkit.com/javatutors/conditionalcompile.shtml). Вы можете использовать это:

var isIE10 = false;
/*@cc_on
    if (/^10/.test(@_jscript_version)) {
        isIE10 = true;
    }
@*/
alert(isIE10);

DEMO: http://jsfiddle.net/X3Rvz/1/

Вы можете поместить это перед всем кодом JavaScript, а затем просто указать isIE10.

Условная компиляция не будет выполняться в не-IE, поэтому isIE10 по-прежнему будет false. И @_jscript_version начнется только с 10 в IE 10.

Условные комментарии не поддерживаются в IE 10, а строка User-Agent может быть подделана.

Так как минимизация обычно удаляет комментарии, вы можете использовать eval или Function для поиска аналогичным образом:

var isIE10 = false;
if (Function('/*@cc_on return /^10/.test(@_jscript_version) @*/')()) {
    isIE10 = true;
}

DEMO: http://jsfiddle.net/wauGa/2/


UPDATE:

Чтобы избежать минимизации комментариев, но также объединить обнаружение любой версии, вы можете использовать что-то вроде:

var IE = (function () {
    "use strict";

    var ret, isTheBrowser,
        actualVersion,
        jscriptMap, jscriptVersion;

    isTheBrowser = false;
    jscriptMap = {
        "5.5": "5.5",
        "5.6": "6",
        "5.7": "7",
        "5.8": "8",
        "9": "9",
        "10": "10"
    };
    jscriptVersion = new Function("/*@cc_on return @_jscript_version; @*/")();

    if (jscriptVersion !== undefined) {
        isTheBrowser = true;
        actualVersion = jscriptMap[jscriptVersion];
    }

    ret = {
        isTheBrowser: isTheBrowser,
        actualVersion: actualVersion
    };

    return ret;
}());

И получить доступ к свойствам типа IE.isTheBrowser и IE.actualVersion (который переводится из внутренних значений версий JScript).

Ответ 4

Строка User-Agent IE10 сообщает

Однако, если ваш сайт все еще использует нюанс пользователя-агента, то особенно важно отметить токен "MSIE" до "10.0". Зачем? Потому что он добавляет дополнительную цифру в строковое значение токена. Большинство сайтов будут обрабатывать это без особых усилий, но некоторые будут обрабатывать лишнюю цифру неправильно, заставляя их идентифицировать IE10 как IE1.

Чтобы помочь проиллюстрировать, существует регулярное выражение, которое только фиксирует первую цифру знака токенов "MSIE" :

// INCORRECT: will report IE10 version in capture 1 as "1"
var matchIE = /MSIE\s(\d)/;

И есть тот, который фиксирует полное значение токена "MSIE" :

// Correct: will report IE10 version in capture 1 as "10.0"
var matchIE = /MSIE\s([\d.]+)/

Ответ 5

Вот однострочное решение для обнаружения IE 10

var IE10 = navigator.userAgent.toString().toLowerCase().indexOf("trident/6")>-1;

и для получения дополнительной информации о другой версии и браузерах, пожалуйста, обратитесь к Ссылка обнаружения браузера

Ответ 6

Я нашел себя с проблемой (радиус границы на наборе фреймов с легендой) с IE с 9 по 11 (не проверял IE 12)
MSIE не является длинным агентом пользователя в IE 11, а appName - Mozilla, однако трезубец находится там Мне удалось извлечь версию trident # и обнаружить ее

if(navigator.appVersion.indexOf('Trident/')>-1){// Begin stupid IE crap
    var IE=navigator.appVersion;
    IE=IE.slice(IE.indexOf('Trident/')+8);
    IE=IE.slice(0,IE.indexOf(';'));
    IE=Number(IE);
    if(IE>=5&&IE<=7) // IE 9 through IE 11
        document.body.className='ie';
}