Как определить 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's IE10 here.
        parentContainer.style.overflow = 'visible'; 
    }
}
dynamicEle ? dynamicEle.style.display = '' : '';
if(dynamicEle && staticEle)
    gui_positionBelow(dynamicEle, staticEle);
}

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

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

6 ответов


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

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, но и не в более ранних версиях.


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

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

демо: http://jsfiddle.net/X3Rvz/1/

вы можете поставить это перед всем вашим кодом JavaScript, и с тех пор просто ссылка isIE10.

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

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

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

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

демо: http://jsfiddle.net/wauGa/2/


обновление:

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

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).


jQuery.браузер.версия все еще работает, но вы должны включить плагин jQuery-migrate.

http://api.jquery.com/jQuery.browser/ https://github.com/jquery/jquery-migrate/#readme


юзер-агент в 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.]+)/

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

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

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


У меня возникла проблема (радиус границы на наборе фреймов с легендой) с IE 9 по 11 (не проверял IE 12)
MSIE не является длинным агентом пользователя в IE 11, а имя приложения-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';
}