Как обнаружить 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;
}

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


person Abhinash Mohanty    schedule 18.09.2013    source источник
comment
НЕ ВЫПОЛНЯЙТЕ ОБНАРУЖЕНИЕ БРАУЗЕРА! Он сломается и вызовет у вас проблемы.   -  person Spudley    schedule 18.09.2013
comment
Кроме того, чтобы избежать обнаружения браузером, проверьте этот msdn .microsoft.com/en-us/library/ie/bg182625(v=vs.85).aspx   -  person Irvin Dominin    schedule 18.09.2013
comment
Как насчет того, чтобы вы позволили нам обнаружить дефектные версии IE, если мы этого захотим? Это реальный мир, просто ответьте на вопрос.   -  person mpowered    schedule 28.02.2014
comment
Иногда нам НУЖНО СДЕЛАТЬ ОБНАРУЖЕНИЕ БРАУЗЕРА :-) : Я знаю, что мой веб-сайт интрасети не совместим ни с режимом совместимости IE6, ни с IE11. И я хочу отображать предупреждающее сообщение в этих случаях. Это сложно, потому что, когда включен режим совместимости, совместимый с IE11 режим может быть обнаружен как IE7...   -  person Elo    schedule 10.12.2014


Ответы (10)


НЕ ВЫПОЛНЯЙТЕ ОБНАРУЖЕНИЕ БРАУЗЕРА! Он сломается и вызовет у вас проблемы.

IE11 имеет совершенно другую строку агента пользователя по сравнению с предыдущими версиями IE; он больше не включает текст «MSIE». Вот почему ваш код обнаружения не работает.

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

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

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

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

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

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

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

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

person Spudley    schedule 18.09.2013
comment
Здравствуйте, Spudley, спасибо за ваше время. Вы правы, что мы должны использовать определение функции, а не определение версии браузера. Я столкнулся с проблемой, потому что наше приложение использует элемент управления ActiveX, присутствующий в IE, для установления RDP-соединения в нашем веб-приложении. Теперь, поскольку это существующее приложение, мне говорят просто проверить версию IE, которая не работает в IE 11. Могу ли я получить фрагмент кода для проверки этой функции (RDP-подключение) в IE или каким-либо образом проверить версию браузера? Поскольку я не хочу вносить больше изменений в существующее приложение. Спасибо. - person Abhinash Mohanty; 19.09.2013
comment
В большинстве случаев вы можете определить, доступна ли функция в браузере, сказав if(window.feature) или что-то подобное. Например, чтобы определить, доступен ли ActiveX, используйте if(window.activeX). Надеюсь, это поможет. - person Spudley; 19.09.2013
comment
Здравствуйте, спасибо за предложение. К сожалению, проверка функций также не работает для IE 11. Ниже приведен мой код. if (typeof (window.ActiveXObject) == undefined) { предупреждение (не проверено); Проверено = Ложь; } еще { оповещение (проверено); Проверено = Истина; } Это прекрасно работает для всех других браузеров, но для IE 11 это не работает. Любое предложение будет действительно оценено. ?? - person Abhinash Mohanty; 19.09.2013
comment
Когда вы говорите, что это не работает в IE11, вы имеете в виду, что он дает «Не проверено»? Может быть, это правильно; может быть, в вашем IE11 отключен ActiveX? (Я думаю, что стандартная конфигурация для отключения ActiveX) - person Spudley; 19.09.2013
comment
Спасибо за ответ. Теперь я могу избавиться от проблемы. - person Abhinash Mohanty; 19.09.2013
comment
Вся ваша речь не имеет смысла и выходит за рамки этого вопроса. Я хочу проверить, какой пользователь браузера запускает. Период. -1 - person Szymon Toda; 07.12.2013
comment
Да, в IE11 нет ошибок предыдущих версий, у infect есть своя новая коллекция ошибок. В основном, когда вы используете библиотеку javascript, такую ​​​​как ExtJS и т. Д. :) Я застрял за последние четыре дня, пытаясь их решить. - person Raza Ahmed; 20.12.2013
comment
@Ultra Хороший, дельный совет › слепо отвечая на вопросы. Зачем позволять кому-то создавать проблему для себя или кого-то еще в будущем, когда вы можете предложить им лучший способ сделать это? - person Micah Henning; 05.01.2014
comment
ЭЙ, УГАДАЙ ЧТО?!? В IE10/11 все еще есть ошибки. У нас все еще есть способы их обойти. Я думаю, что это невероятно высокомерно с их стороны говорить, что их браузер идеален и что никто не должен использовать обнаружение браузера, когда некоторые ОЧЕНЬ основные функции все еще просто не работают. Мой вариант использования - сломанная реализация заполнения ввода - IE просто игнорирует его, пока вы не установите для ввода значение '' и не вернетесь к своему значению. Не моя вина, что они не могут сделать нормальный браузер. Пожалуйста, пожалуйста, ПОЖАЛУЙСТА, просто ответьте на вопрос, не вставляя свое ненужное мнение. - person mpowered; 07.01.2014
comment
-1, потому что этот пост не пытается ответить на вопрос. ОП спрашивал, как чего-то добиться, а не о том, было ли это правильным шагом. - person Kevin Laity; 01.02.2014
comment
Проверка ActiveXObject теперь скрыта — msdn. microsoft.com/en-us/library/ie/dn423948(v=vs.85).aspx. - person Jarrod; 17.02.2014
comment
Цените контекст, но, пожалуйста, ответьте на вопрос. - person U007D; 25.02.2014
comment
Абсолютно позиционированные элементы будут перекрываться плагином IE pdf и требуют прокладки iframe. Для этого нет функции обнаружения. ActiveXObject в окне делает свое дело с 8-11. - person ptrc; 13.03.2014
comment
@Spudley - я не хочу обидеть, но это плохой совет. В IE11 столько же ошибок (если не больше), сколько и в IE10, просто они другие. Мы не можем обнаружить ошибки с помощью обнаружения функций, так что угадайте, какое есть единственное другое решение? Скажите нашим клиентам, чтобы они переключились на Chrome. У нас около 20 000 пользователей нашего продукта. В IE9 и IE10 мы смогли обойти ошибки, обнаружив браузер. В IE11 такой возможности нет... так что теперь представители нашего колл-центра переключают всех пользователей IE11 на Chrome (более 5000 миграций с момента выпуска IE11). Я не думаю, что Microsoft продумала это до конца. - person Beep beep; 23.04.2014
comment
@MicahHenning Если бы нам не нужны были эти хаки, никто бы их не просил. У меня есть ошибка, которую я пытаюсь обойти прямо сейчас, когда IE11, и только IE11 дает сбой, если я пытаюсь прочитать innerText динамически созданного элемента span после добавления, а затем удаляю его со страницы. Я не хотел менять рабочее поведение во всех других браузерах только потому, что IE не работает, но, по-видимому, это мой совет: переписать рабочий код, потому что IE глючит, но пытается притвориться, что это настоящий браузер. Притворяться, что IE11 совершенен, не значит, что это оправдание для браузера с ошибками. - person scragar; 10.07.2014
comment
Вопрос был ясен, как обнаружить IE11. Я нахожусь в ситуации, когда IE11 ведет себя иначе, чем в Chrome, и код необходимо разветвить, чтобы сделать допуски, требующие обнаружения браузера. -1 - person Kywillis; 15.07.2014
comment
@Kywillis: я не согласен. Несмотря на то, что ОП принял ответ (так это ему явно помогло?), в этом вопросе ОП хочет обнаружения для IE8 и выше, включая IE11. Не только IE11. Очень важно понимать, что между IE8 и IE11 практически нет ничего общего с точки зрения ошибок браузера. Да, в IE11 есть ошибки, но они не те, что были в IE8. Использование для них общего кода обнаружения бесполезно и приведет к ошибкам в вашем собственном коде. - person Spudley; 16.07.2014
comment
@Kywillis: Кроме того, пожалуйста, не используйте Chrome в качестве основы, которой должны соответствовать все браузеры: в Chrome есть множество собственных ошибок и особенностей. Использование его в качестве безошибочного эталона — это та же ошибка, которую мы совершили с IE6 десять лет назад. - person Spudley; 16.07.2014
comment
Это высокомерный и бесполезный ответ и менталитет. IE11 не является надежным браузером, как утверждают люди, и, как и все предыдущие версии IE, его недостатки заключаются не в полном отсутствии поддержки современных функций (которые можно легко обойти с помощью прогрессивного улучшения), а в неправильной поддержке функции, с которыми другие браузеры прекрасно справляются (в моем случае SVG). И для людей, жалующихся на то, что Chrome является неточным эталоном поведения: Chrome, Firefox, Safari и Opera более или менее одинаковы по поведению и производительности с небольшими отклонениями в рендеринге. - person cmal; 08.08.2014
comment
Привет @Spudley, боюсь, я тоже должен навалиться. Мой веб-сайт должен отображать подсказку, чтобы проинструктировать пользователя, как установить страницу в качестве стартовой страницы браузера. Эти инструкции, очевидно, будут разными для каждого браузера. Так что у меня есть законный вариант использования. - person WolfRevokCats; 26.08.2014
comment
@scragar То, чего ты пытаешься добиться, немного необычно. Поведение, выходящее за рамки спецификации ECMAScript, полностью зависит от браузера. Возможно, вам придется обойти свою реализацию, что, на мой взгляд, лучше, чем ориентироваться на браузер. Вы пробовали .textContent? Если я правильно помню, это правильный способ получить внутренний текст элемента. Я думаю, что атрибут .innerText был специфичной для IE реализацией, которая противоречит спецификации. Некоторые другие браузеры реализовали его исключительно из соображений совместимости. В противном случае попробуйте получить содержимое перед удалением элемента из DOM. - person Micah Henning; 16.09.2014
comment
Хотя это может быть правильным ответом на проблему X, когда пользователь спрашивал Y, это не ответ на Y, и это неприятно. Дайте больше контекста тому, как они могут выполнить Y, а также почему они должны выполнить X. - person Shotgun Ninja; 14.05.2015
comment
Я не буду голосовать против этого поста, но обнаружение функций бесполезно. Если они не предоставят API для обнаружения ошибок, что обычно требуется разработчикам (поскольку все существующие дерьмовые браузеры заполнены ошибками), людям по-прежнему будет необходимо получать семейство и версию браузера. И это вполне разумно и меня устраивает. Когда ты в дерьме, ты пытаешься выбраться из него любыми способами... - person user2173353; 12.10.2015
comment
Мы не обнаруживаем IE, чтобы исправить их ошибки. Мы обнаруживаем, что IE реагирует соответствующим образом. Например, загрузка файлов в IE отличается от других браузеров. - person Marble Daemon; 30.06.2016
comment
@Spudley Много раз я сталкивался с различиями в рендеринге, когда мне приходилось использовать обнаружение браузера, чтобы исправить это. В этом случае вы не можете использовать обнаружение признаков! - person TheStoryCoder; 19.03.2019
comment
@TheStoryCoder (и всем, кто все еще читает / голосует за этот пост): имейте в виду, что этот ответ был опубликован более полувека назад. Состояние Интернета, разработка браузеров и преимущества (и необходимость) обнаружения функций по сравнению с обнаружением браузера сегодня полностью отличаются от того, что было тогда. Когда я ответил на этот вопрос, многие сайты были сломаны в Firefox и Chrome, когда в этом не было необходимости, из-за плохого использования обнаружения браузера, где, если бы они использовали обнаружение функций, они работали бы во всех браузерах. - person Spudley; 19.03.2019
comment
@Spudley, забавно то, что 6 лет спустя IE11 по-прежнему остается основным браузером для внутренних приложений на многих предприятиях. Как уже отмечалось, обнаружение функций отлично работает для обнаружения функций, но не при работе с ошибками. В моем случае это была бы странная реализация обработки z-порядка с iFrames, которая позволяет iFrames появляться поверх другого контента в IE. - person AnthonyVO; 10.07.2019

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

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

Объяснение: Все версии IE (кроме очень старых) имеют свойство window.ActiveXObject. Однако IE11 скрывает это свойство от DOM, и теперь это свойство не определено. Но само свойство присутствует внутри объекта, поэтому проверка на наличие свойства возвращает 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 не была подделана.

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

person Mesqalito    schedule 25.11.2013
comment
ваше первое решение отлично работает для меня - person Raza Ahmed; 20.12.2013
comment
Очень креативное решение! +1 - person Micah Henning; 05.01.2014
comment
что с краем? а не ie11? - person SuperUberDuper; 13.02.2016

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

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

person mcw    schedule 08.11.2013
comment
Я использую (navigator.userAgent.search("MSIE") >= 0) || (!(window.ActiveXObject) && "ActiveXObject" in window), спасибо за помощь - person Szymon Toda; 07.12.2013
comment
Как упоминалось в принятом ответе, обнаружение браузера путем чтения строки userAgent является хрупким и не рекомендуется. Microsoft специально изменила строку UA в IE11, чтобы сломать это. Кроме того, в IE есть функции, позволяющие изменять передаваемую строку UA. Итак, еще раз — вместо этого используйте обнаружение функций. - person mcw; 10.12.2013
comment
во второй строке window.ActiveXObject || "ActiveXObject" in window первая часть избыточна. - person Royi Namir; 16.12.2013
comment
Спасибо за это. Именно то, что мне было нужно. Также, кажется, справляется с эмуляцией более низких браузеров с помощью инструментов разработчика F12. Например, строка пользовательского агента не изменилась при эмуляции IE8 из IE11... - person El Ronnoco; 05.12.2014

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

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;
                            }
person Tsonev    schedule 15.11.2013

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

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

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

Для многих устаревших веб-сайтов некоторые из наиболее заметных обновлений IE11 Preview включают строку пользовательского агента. Вот что сообщается о предварительной версии IE11 в предварительной версии Windows 8.1: 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 Preview как более ранней версии. Как правило, вам следует избегать определения конкретных браузеров или версий браузеров. Предположения, лежащие в основе таких тестов, имеют тенденцию приводить к ложноположительным результатам при обновлении браузеров. Вместо этого определяйте функции по мере необходимости и используйте прогрессивное улучшение, чтобы обеспечить упрощенный интерфейс для браузеров или устройств, которые не поддерживают нужные вам функции. В редких случаях может потребоваться уникальная идентификация IE11 Preview. Используйте для этого жетон Trident.

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

person Irvin Dominin    schedule 18.09.2013

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

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

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

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

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

person Dhananjay Tomar    schedule 05.01.2014

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

        $('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): любые последующие привязки к полю ввода не сработают.

person Jeff Lowery    schedule 21.08.2014

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

        <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>
person Chris Love    schedule 14.12.2013
comment
Это не то, что подразумевается под мантрой обнаружения функций использования. Это просто другой путь к обнаружению пользовательского агента... функции на самом деле являются псевдонимом того, чем является пользовательский агент. Использование обнаружения функций означает, что если вам нужна определенная функция, выявляйте ее... и предоставляйте запасные варианты, когда этого требуют требования. - person Greg Pettit; 21.04.2014
comment
Я не согласен. Комментарии предназначены только как мысленные заполнители. Это обнаружение функций, которое я использую либо для создания современного клиентского интерфейса SPA, либо для перенаправления на «основной» сайт, который представляет собой просто базовый CSS с классической разметкой, отображаемой сервером. - person Chris Love; 22.04.2014

person    schedule
comment
Это обнаружит IE10 или IE11. Если вам явно нужен IE11, смотрите мой ответ. - person mcw; 09.11.2013
comment
Работает для меня ... коротко, просто и, надеюсь, будет работать для 12 и выше, когда придет время, лол ... - person Robert Petz; 24.01.2014