Как обнаружить IE 11 с javascript в Asp.net

Здравствуйте, я хочу обнаружить браузер, IE 8 или более подходит для меня. Для этого я использовал следующий код, но он не работает для IE 11. Для других его обнаружение должным образом.

function getInternetExplorerVersion()
{
    var rv = -1; // Return value assumes failure.
    if (navigator.appName == 'Microsoft Internet Explorer') {
        var ua = navigator.userAgent;
        var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
        if (re.exec(ua) != null)
            rv = parseFloat(RegExp.$1);
    }
    return rv;
}

Ниже приведена ссылка, которую я также пробовал, но не смог добиться успеха.

Ответ 1

НЕ ДЕЛАЙТЕ ОБНАРУЖЕНИЕ БРАУЗЕРА! Он сломается, и это вызовет проблемы.

IE11 имеет совершенно другую строку User Agent для предыдущих версий IE; он больше не включает текст "MSIE". Вот почему ваш код обнаружения не работает.

Важно отметить, что причина, по которой они это делали, была преднамеренной. Они хотели нарушить сценарии обнаружения браузера, как это.

Вы можете изменить свой код для работы с IE11, но я настоятельно рекомендую не делать этого, так как вы, вероятно, снова будете иметь такую ​​же проблему, когда выйдет IE12.

Так почему же они хотят нарушить сценарии обнаружения браузера? Простой: поскольку IE11 не имеет ошибок предыдущих версий и имеет много новых функций. Поэтому, если вы выполняете обнаружение браузера, потому что у IE есть определенные ошибки или отсутствующие функции, и у вас есть код для исправления этих проблем на основе обнаружения браузера, тогда этот код может действительно вызвать худшие проблемы в IE11, где исправления не нужны.

IE11 сломал ваш script, но та же логика применяется ко всем браузерам и всем версиям; обнаружение браузера и версии почти всегда не так.

Если есть определенные функции, которые вы хотите поддерживать, но они отсутствуют в более старых версиях IE (или других старых браузерах), не используйте функцию обнаружения браузера для ее работы; вы должны использовать функцию обнаружения.

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

Есть несколько ошибок в старых версиях IE, которые трудно обнаружить, и для этих немногих случаев действительно использовать обнаружение браузера в качестве последнего средства, но эти случаи действительно только для IE6 и ранее. Может быть, иногда для IE7. Но вы заявили в вопросе, что вы смотрите только на IE8 и более поздние версии, поэтому это не должно применяться.

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

Ответ 2

Вы можете явно определить IE11 со следующей проверкой (используя обнаружение функции):

if (Object.hasOwnProperty.call(window, "ActiveXObject") && !window.ActiveXObject) {
    // is IE11
}

Объяснение: Все версии IE (кроме действительно старых) имеют свойство window.ActiveXObject. IE11, однако скрывает это свойство от DOM, и это свойство теперь undefined. Но само свойство присутствует внутри объекта, поэтому проверка наличия свойства возвращает true во всех версиях IE, но в IE11 он также возвращает false для второй проверки. И, наконец, hasOwnProperty вызывается через Object, потому что в IE8 (и, я полагаю, ранее) window не является instanceof Object и не имеет метода hasOwnProperty.

Другой метод с использованием строки userAgent:

var ua = window.navigator.userAgent;
var versionSplit = /[\/\.]/i;
var versionRe = /(Version)\/([\w.\/]+)/i; // match for browser version
var operaRe = /(Opera|OPR)[\/ ]([\w.\/]+)/i;
var ieRe = /(?:(MSIE) |(Trident)\/.+rv:)([\w.]+)/i; // must not contain 'Opera'
var match = ua.match(operaRe) || ua.match(ieRe);
if (!match) {
    return false;
}
if (Array.prototype.filter) {
    match = match.filter(function(item) {
        return (item != null);
    });
} else {
    // Hello, IE8!
    for (var j = 0; j < match.length; j++) {
        var matchGroup = match[j];
        if (matchGroup == null || matchGroup == '') {
            match.splice(j, 1);
            j--;
        }
    }
}
var name = match[1].replace('Trident', 'MSIE').replace('OPR', 'Opera');
var versionMatch = ua.match(versionRe) || match;
var version = versionMatch[2].split(versionSplit);

Это обнаружит любую версию IE, если ее строка userAgent не была подделана.

Очень редкие случаи, когда вам действительно нужно использовать обнаружение браузера, как описано выше. В большинстве случаев предпочтительным является метод обнаружения признаков.

Ответ 3

 isIE11 = !!window.MSStream;

 if(isIE11){
   /* Something */
 }

Ответ 4

Используйте !(window.ActiveXObject) && "ActiveXObject" in window для явного обнаружения IE11.

Чтобы обнаружить любую версию IE, используйте window.ActiveXObject || "ActiveXObject" in window.

Ответ 5

Как уже было сказано, не обнаруживайте браузер, а обнаруживайте функцию. Однако, как я вижу, ваш script является более старой версией script, здесь циркулирует. Это обновленная версия, которая определяет IE 11 как:

function getInternetExplorerVersion()
                            {
                                var rv = -1;
                                if (navigator.appName == 'Microsoft Internet Explorer')
                                {
                                    var ua = navigator.userAgent;
                                    var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
                                    if (re.exec(ua) != null)
                                        rv = parseFloat( RegExp.$1 );
                                }
                                else if (navigator.appName == 'Netscape')
                                {
                                    var ua = navigator.userAgent;
                                    var re  = new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})");
                                    if (re.exec(ua) != null)
                                        rv = parseFloat( RegExp.$1 );
                                }
                                return rv;
                            }

Ответ 6

Лучше для вас, если вы избегаете обнаружения браузера; если вам это нужно, это хорошее объяснение от команды MS:

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

Изменение строки пользовательского агента

Для многих устаревших веб-сайтов некоторые из самых видимые обновления для IE11 Preview включают строку user-agent. Вот что было сообщено для предварительного просмотра IE11 в Windows 8.1 Preview: JavaScript

Mozilla/5.0 (Windows NT 6.3, Trident/7.0; rv: 11.0), как Gecko

Как и в предыдущих версиях Internet Explorer, части пользовательского агента строка зависит от среды. Здесь строка для IE11 Предварительный просмотр в Windows 7: JavaScript

Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv: 11.0), как Gecko

Если вы сравните эти строки с теми, которые были указаны в предыдущих версиях Internet Explorer, вы найдете следующие изменения: совместимые ( "совместимые" ) и браузерные ( "MSIE" ) токены удален. Добавлен токен "как Gecko" (для согласованности с другие браузеры). Версия браузера теперь сообщается новым ( "rv" ). Эти изменения помогают предотвратить просмотр IE11 из (неправильно), идентифицированный как более ранняя версия. В общем, вы следует избегать обнаружения определенных браузеров или версий браузера. предположения, лежащие в основе таких тестов, как правило, приводят к ложноположительным результаты при обновлении браузеров. Вместо этого обнаруживайте функции как вы нуждаются в них и используют прогрессивное совершенствование для упрощения опыт для браузеров или устройств, которые не поддерживают функции тебе нужно. В редких случаях может потребоваться однозначная идентификация IE11 Предварительный просмотр. Используйте токен Trident, чтобы сделать это

Ссылка: http://msdn.microsoft.com/en-us/library/ie/bg182625(v=vs.85).aspx

Ответ 7

Более простой и эффективный код и обнаружение всех версий IE/Edge:

if(navigator.appVersion.indexOf("MSIE") != -1 || navigator.appVersion.indexOf("Trident") != -1 || navigator.appVersion.indexOf("Edge") != -1){
// is IE
}

Ответ 8

Недавно я использовал следующий код для обнаружения IE в целом, и он отлично работал для IE 11, а также

var bs = document.body.style, isIE=false;
if ('msTransition' in bs) {
        isIE = true;
}

Идея состоит в том, чтобы искать предикс vedor.

Ответ 9

Мантра "использование функции обнаружения" мистифицирует меня. Когда вы нажмете ошибку, как вы можете определить, что "функция" является виновником? Возьмем, к примеру, этот бит кода:

        $('input[name^=qty]').keyup(function(e) {
            if (this.value.match(/[^0-9\/]*/g)) {
                this.value = this.value.replace(/[^0-9\/]/g, '')
            }
        });

Он удаляет нечисловые символы из поля ввода в качестве типов пользователей. Работает в FF, Chrome и Safari. Не работает в ЛЮБОЙ версии IE (по крайней мере до 11): любые последующие привязки в поле ввода не будут выполняться.

Ответ 10

обнаружение функции, обнаружение функции, обнаружение функции

        <script>

    if (!('querySelector' in document)  //this should work in ie 9+
         || !('localStorage' in window)  //ie 8+
         || !('addEventListener' in window)  //ie 8 + (I think)
        || !('matchMedia' in window)) {//ie 10+

        //do your redirect here
    }

</script>