Вопрос по javascript, internet-explorer, browser-detection, conditional-comments – IE 11 по-прежнему ломается, когда другие браузеры работают нормально. Сегодня я делал несколько jQuery-фейдов и обмен контента, и IE 11 был единственным, кто решил не работать.

46

бнаружения IE большинство библиотек Javascript выполняют всевозможные трюки.

JQuery, кажется, добавляет временный объект в DOM ваших страниц, чтобы обнаружить некоторые функции,YUI2 выполняет регулярное выражение для агента пользователя в своемYAHOO.env.ua = function() (файлyahoo.js)

После прочтенияэтот ответ мне пришло в голову, что это правда, чтобы просто определить IE в Javascript, мы могли бы просто добавить его на наши страницы:

<!--[if IE]><script type="text/javascript">window['isIE'] = true;</script><![endif]-->

<script type="text/javascript" src="all-your-other-scripts-here.js"></script>

Теперьwindow.isIE Переменная устанавливается для всего нашего кода Javascript, просто выполнив:

if(window.isIE)
   ...

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

К вашему сведению: я знаю, что лучше использоватьобнаружение объекта, а не обнаружение в браузере, но есть случаи, когда вам все равно придется использовать обнаружение браузера.

Одна из основных причин того, что библиотеки JS будут пытаться обнаружить IE с помощью JavaScript вместо условных комментариев, заключается в том, что с условными комментариями вам нужно добавить другой скрипт на свою страницу (и этот даже выглядит странно). Это может запутать некоторых людей (новых программистов) или раздражать других. jhartz
В идеальном мире у вас будет всего два набора движков JavaScript для IE, и все остальные. Мы не живем в этом мире. Черт, неважно, в идеальном мире у тебя был бы только один двигатель, и все это было бы койкой. (Моя точка зрения в том, что вам часто нужно больше, чем просто если! Т.е.) Jason Benson
Вы забыли закрыть свой элемент SCRIPT внутри условного комментария ... Šime Vidas
Это больше не работает. Условные комментарии больше не поддерживаются в IE10 axelvnk
Созданный div не добавляется в DOM, только создается с использованиемdocument.createElement и выбрасывается после возврата функции (потому что она присваивается только локальной переменной). Я только что проверилdocument.getElementsByTagName('div').length после выполнения функции (как в IE, так и в Firefox), и она возвращает правильное количество делений в моем документе. Marcel Korpel

Ваш Ответ

15   ответов
4

Я думаю, что вы ответили на свой собственный вопрос: во-первых, он обнаруживает только IE, поэтому скрипт по сути делит мир браузеров на 2 части: IE и <everythingelse>.

Во-вторых, вам нужно будет добавить дурацкий комментарий к каждой HTML-странице. Принимая во внимание, что широкие библиотеки JavaScript, такие как jQuery и YUI, должны быть «простыми» для вставки / использования для широкого спектра сайтов, вы автоматически усложняете их использование вне ворот.

11

IE 11 сильно изменился, и теперь многие прошлые методы обнаружения браузеров не работают. Приведенный ниже код работает для IE 11 и более ранних версий.

function isIE()
{
    var isIE11 = navigator.userAgent.indexOf(".NET CLR") > -1;      
    var isIE11orLess = isIE11 || navigator.appVersion.indexOf("MSIE") != -1;
    return isIE11orLess;
}
Спасибо, я использую это для alert (), а затем перенаправить пользователей IE наbrowsehappy.com :) Для личного веб-приложения, альтернативная библиотека Steam:sam.nipl.net/free-games.html Я не хочу проходить через боль в том, чтобы заставить это работать в IE в настоящее время! Sam Watkins
Это, безусловно, мой любимый ответ. Это работает и это сжато. Спасибо @ webber55 Trev14
@Ligntningsoul: поиск «.NET CLR» подчеркивает, что это технология Microsoft, и вряд ли она изменится в ближайшем будущем. webber55
Это кажется действительно хорошим, но почему вы используете «.NET CLR» вместо «Trident»? Lightningsoul
2
var version = navigator.userAgent.match(/(msie) (\d+)/i);
console.log(version);

что-то быстрое, я написал быстро, посмотрев на этот вопрос на случай, если кто-то захочет

** РЕДАКТИРОВАТЬ **

вДжонни Дарвалла комментарий ниже, я добавляю ссылку для тех, кто пытается вынюхиватьInternet Explorer 11:

http://blogs.msdn.com/b/ieinternals/archive/2013/09/21/internet-explorer-11-user-agent-string-ua-string-sniffing-compatibility-with-gecko-webkit.aspx

У меня тоже сработало. Спасибо Sergio
не будет работать в то есть 11 Johnny Darvall
1

Проверка на браузеры - плохая идея - лучше проверить на браузерфункции вместо. Например, обычно вы проверяете, использует ли пользователь IE, потому что вы хотите использовать некоторые функции, не поддерживаемые в IE. Однако знаете ли вы, что ВСЕ текущие и будущие браузеры не IE будут поддерживать эту функцию? Нет. Так, например, лучше использовать jQuery: он создает и выполняет небольшие тестовые сценарии, проверяя определенные ошибки / функции, и вы можете просто проверить такие вещи, как if (browser_supports_XYZ) вместо проверки, использует ли пользователь определенный браузер.

В любом случае, всегда есть случаи, когда необходимо проверить браузер, потому что это визуальная ошибка, которую вы не можете проверить на наличие скрипта. В этом случае лучше использовать javascript вместо условных комментариев, потому что браузер проверяет прямо в том месте, где он вам нужен, а не в каком-то другом месте (представьте себе файл .js, где вы проверяете isIE, который никогда не определяется в этом файле )

Есть некоторые вещи, которые вы не можете обнаружить, например, как браузер обрабатывает несколько загрузок файлов при нажатии кнопки. Для всего остального есть функция обнаружения Smegger
Я не дал тебе -1, но я не мог улыбнуться тому, кто дал это тебе. Читайте в нижней части моего вопроса. Marco Demaio
какой тест вы предлагаете запустить для определения, поддерживает ли браузер альфа в .png и даже лучше в .gifs. Marius Bughiu
Похоже, "Goto считается вредным". Мне нужно проверить IE, чтобы я мог перенаправить этих людей, чтобы получить лучший браузер;) Sam Watkins
6

Я думаю, у меня есть то, что вы ищете. Вы можете получить полную версию Internet Explorer в виде строки «AA.BB.CCCC.DDDD», используя Javascript и clientCaps.

http://www.pinlady.net/PluginDetect/IE/

Похоже, работает для IE 5.5 и выше (включая IE 10). Он невосприимчив к навигатору.userAgent / режиму документа / режиму браузера. Нет необходимости в условных комментариях или каких-либо дополнительных элементах HTML. Это чисто решение Javascript.

Я не уверен в настоящее время, как ведет себя IE Mobile, но вы всегда можете использовать метод обнаружения резервного копирования в случае сбоя этого метода clientCaps.

До сих пор, я должен сказать, это работает довольно хорошо.

58

Джеймс Падолси положилмаленький фрагмент на GitHub что я процитирую здесь:

// ----------------------------------------------------------
// A short snippet for detecting versions of IE in JavaScript
// without resorting to user-agent sniffing
// ----------------------------------------------------------
// If you're not in IE (or IE version is less than 5) then:
// ie === undefined
// If you're in IE (>=5) then you can determine which version:
// ie === 7; // IE7
// Thus, to detect IE:
// if (ie) {}
// And to detect the version:
// ie === 6 // IE6
// ie > 7 // IE8, IE9 ...
// ie < 9 // Anything less than IE9
// ----------------------------------------------------------

// UPDATE: Now using Live NodeList idea from @jdalton

var ie = (function(){

    var undef,
        v = 3,
        div = document.createElement('div'),
        all = div.getElementsByTagName('i');

    while (
        div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
        all[0]
    );

    return v > 4 ? v : undef;

}());

Конечно, все кредиты должны быть отправлены Джеймсу, я всего лишь посланник (но, пожалуйста, стреляйте в посланника, если мое действие копирования-вставки было ошибочным).

Также посмотрите на вилки, которые были созданы. Пол Ирландский объяснил внутреннюю работу вкомментарий.

Только условные комментарии в HTML больше не поддерживаются (например,<!--[if IE]><![endif]-->), не условные высказывания в IE10. Qantas 94 Heavy
Условные заявлениябольше не поддерживается в IE10. rds
Мне нравится эта функция, поэтому я создал нижеприведенную версию, которая работает в IE10 и называется так же, так что любой, кто ее использует, может просто отказаться от замены. Sean Colombo
26

Ответ Марселя Корпеля больше не работает (в IE 10 он возвращает undef, поэтому IE 10 выглядит как не IE). ПРИМЕЧАНИЕ: теперь обновлено для работы с IE 11 также.

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

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

// ----------------------------------------------------------
// If you're not in IE (or IE version is less than 5) then:
// ie === undefined
// If you're in IE (>=5) then you can determine which version:
// ie === 7; // IE7
// Thus, to detect IE:
// if (ie) {}
// And to detect the version:
// ie === 6 // IE6
// ie > 7 // IE8, IE9, IE10 ...
// ie < 9 // Anything less than IE9
// ----------------------------------------------------------
var ie = (function(){
    var undef,rv = -1; // Return value assumes failure.
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf('MSIE ');
    var trident = ua.indexOf('Trident/');

    if (msie > 0) {
        // IE 10 or older => return version number
        rv = parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
    } else if (trident > 0) {
        // IE 11 (or newer) => return version number
        var rvNum = ua.indexOf('rv:');
        rv = parseInt(ua.substring(rvNum + 3, ua.indexOf('.', rvNum)), 10);
    }

    return ((rv > -1) ? rv : undef);
}());

обновлен для работы с IE11. Спасибо 'acarlon' за то, что он указал, что он не работает, и 'mario' за код, на котором я основал исправление!

Это помогло мне, потому что мне специально нужно было обнаружить IE 10. user396070
Это больше не работает в IE11, так как navigator.appName не является M $. Этот ответ работает, хотя:stackoverflow.com/a/21712356/746754 acarlon
@MarcelKorpel: «если (то есть) {}» очень неправильно вводить false в IE 10, учитывая, чтоявляется IE. Что касается подмены, это правда. Я думаю, что в большинстве случаев (во всех случаях, кроме вопросов, связанных с безопасностью), если пользователь хочет подделать пользовательский агент, то можно ответить на UA, который он выберет для себя. В моем конкретном случае использования я взаимодействую с API Trello, чья «всплывающая» аутентификация в настоящее время не работает ни в одной версии IE (включая IE10), поэтому, если (то есть), я предпочитаю использовать другой метод (с менее оптимальный интерфейс, но, по крайней мере, он работает в IE). Sean Colombo
Но это работает с анализом строк User-Agent; Строка UA может быть легко подделана, а условные комментарии - нет. В любом случае, кому нужно обнаруживать IE 10? В настоящее время вы можете протестировать все с обнаружением функций, что гораздо предпочтительнее, чем обнаружение в браузере (которое было необходимо только для обнаружения вещей, которые невозможно обнаружить с помощью обнаружения функций). Marcel Korpel
@Marcel Если вы хотите притвориться кем-то другим, не стесняйтесь. Это должно помочь среднестатистическому идиоту IE (который не будет подделывать). Если вы хотите притворяться, это не повредит никому, кроме (возможно), вам самим. bjb568
-1

Почему бы вам просто не программировать на HTML5 и не проверять

if ( window.navigator.product !== "Gecko" )

?? Да, это будет включать IE11 в группу «Gecko», но разве он не должен быть достаточно хорошим сейчас?

Примечание: спецификация HTML5. говорит, что navigator.product должен возвращать "Gecko" ... и IE10 и ранее все возвращают что-то еще.

developer.mozilla.org/en-US/docs/Web/API/NavigatorID.product Устаревшая функция, которая также никогда не использовалась для обнаружения функции / браузера. Tristan
IE 11 по-прежнему ломается, когда другие браузеры работают нормально. Сегодня я делал несколько jQuery-фейдов и обмен контента, и IE 11 был единственным, кто решил не работать. Trev14
-1
Это загрязняет глобальное пространство именТребуются изменения в двух файлах.Работает только в IEТехнически, условный комментарий остается комментарием
@Sime Vidas: круто +1, не знал этого. Спасибо! Marco Demaio
1) «окно» - это глобальный объект. 3) Верно. Я хотел сказать, что условные комментарии работают только в IE. user123444555621
Ну, это то, что хочет ОП. Он хочет, чтобы они выполнялись в IE и игнорировались в других браузерах. Šime Vidas
@Marcowindow['isIE'] = true; в основном так же, какvar isIE = true; (в глобальном коде), так какwindow указывает на глобальный объект. Тем не менее, использование одного глобального свойства для обнаружения IE не представляет особой проблемы. Šime Vidas
Пункт 1) Он не загрязняет пространство имен GLOBAL, я использую его в объекте окна. Пункт 3) обратите внимание, что он работает на любом браузере, если условие возвращает false в другом браузере, оно не нарушается, я просто проверяю свойство объекта. Marco Demaio
2

Здесь вы можете найти несколько действительно простых хаков для обнаружения в браузере:http://www.thespanner.co.uk/2009/01/29/detecting-browsers-javascript-hacks/

var isIE = IE='\v'=='v';
40

Если вы хотите сделать это таким образом, я думаю, что вместо этого лучше использовать условную компиляцию, поскольку вы можете сделать это внутри javascript без необходимости изменять html:

var isIE = /*@[email protected]*/false;
@AlfonsoML В течение многих лет я читал об условных комментариях и строке userAgent, и СЕЙЧАС вы говорите мне, что вы можете обнаружить IE с помощью этой одной строки? :п Šime Vidas
Пожалуйста, имейте в виду, что министры не любят такие мысли; YUI Compressor злится, Google Closure Compiler задыхается от этого. Marcel Korpel
@AlfonsoML Что за странный хак это? :) Šime Vidas
Я попробовал это на IE10 на Windows 7 и 8, и это не сработало. Ritesh
Это работает. Однако, в отличие от условных комментариев, при условной компиляции невозможно различить версии IE, только разные версии движка JScript (которые можно менять и заменять независимо от версии IE). Tim Down
3

navigator.userAgent существует, если действительно необходимо обнаружение браузера (а не обнаружение функций), и jQuery использует его для получения информации для$.browser объект. Это гораздо приятнее, чем включать условный комментарий для IE вкаждый стр.

@ Шиме Видас: Правда, хотя мне интересно: сколько пользователей подделывают свои строки user-agent? PleaseStand
@ Marco Пользователи тоже. Например, я подделываю строку iPhone, чтобы иметь возможность просматривать версии веб-страниц iPhone в моем браузере на рабочем столе :) Šime Vidas
Браузеры могут подделывать свои строки userAgent, но условные комментарии выполняются только в IE без исключения. Šime Vidas
@ ŠimeVidas Разве это не повод использовать user-agent? Если пользователь хочет, чтобы страница выглядела как IE, тогда позвольте ему установить User-Agent на что-то IE. Если вы хотите протестировать мобильный сайт, он должен ответить агенту пользователя iPhone. Cobby
@Sime Vidas: не пользователи, а Trident (механизм IE) могут быть использованы во многих браузерах, которые не совсем IE (возможно, для мобильных браузеров), и браузеры много раз подделывают строку userAgent, притворяясь IE или подобным, поэтому объектное определение лучше, чем обнаружение браузера, когда это возможно. Marco Demaio
2

Я использую этот код

var isIE = navigator.userAgent.indexOf ('MSIE')> -1;

Это прекрасно работает для меня. Спасибо! Branislav
0

Для моего случая использования мне просто нужно определить, если ниже, чем IE9, поэтому я использую

if (document.body.style.backgroundSize === undefined && navigator.userAgent.indexOf('MSIE') > -1)
{
//IE8- stuff
}
-1

Это работает довольно хорошо,
var isIe = !!window.ActiveXObject;

Я не знаю, работает ли он в IE9. Цитата MSDN: «В версиях Internet Explorer, более ранних, чем Internet Explorer 9, некоторые веб-авторы использовали window.ActiveXObject для обслуживания содержимого, специфичного для Internet Explorer. Эта практика настоятельно не рекомендуется». [См.msdn.microsoft.com/en-us/library/ff974676(v=VS.85).aspx] Marco Demaio

Похожие вопросы