Как мне определить браузер IE?

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

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

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

Подход, который у меня есть до сих пор, таков:

var isIE = (document.body.attachEvent && window.ActiveXObject);

Это проверяет, присутствует ли метод attachEvent() и присутствует ли поддержка ActiveXObject. Мне пришлось сделать больше, чем просто проверка attachEvent, потому что Opera поддерживает attachEvent.

Является ли это надежным способом обнаружения IE? Есть ли лучшие способы?

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

Если вы хотите узнать больше о конкретной ситуации, в которой это используется, это описано в другой вопрос.


person jfriend00    schedule 29.08.2012    source источник
comment
Я понимаю, что вы говорите о том, что обнаружение функций не работает, но на самом деле вы просто обнаруживаете неправильную функцию. В долгосрочной перспективе, вероятно, было бы более устойчиво тестировать любой аспект этой функции, который ломается в IE; другими словами, сделайте это, посмотрите, не испортится ли это так, как это обычно делает IE, и если да, то сделайте свой специальный код IE. Если вы будете поступать таким образом, то всякий раз, когда будущая версия IE будет исправлять ошибку, ваш код будет автоматически выполнять правильные действия; с обнаружением браузера вам придется снова обновить код в будущем.   -  person machineghost    schedule 26.04.2013
comment
@machineghost - иногда невозможно измерить, работает ли поведение правильно или содержит ошибки. Конкретный случай, с которым я столкнулся здесь, связан с как IE обрабатывает определенные события ввода, как указано в моем вопросе. Я бы с радостью использовал тест функций, если бы его можно было придумать, но я не смог разработать тот, который работал, и я задал вопрос здесь, на SO, и не получил помощи в его разработке, и поэтому чувствовал, что у меня нет другого выбора, кроме как обнаружить глючный браузер вместо.   -  person jfriend00    schedule 26.04.2013


Ответы (3)


Условная компиляция условных комментариев, описанная здесь:

http://www.quirksmode.org/css/condcom.html

Или родственный двоюродный брат, найденный здесь:

http://www.javascriptkit.com/javatutors/conditionalcompile.shtml

Оба являются эксклюзивными для Internet Explorer, поэтому они позволят вам прослушивать IE.

<script type="text/javascript">

/*@cc_on
document.write("JScript version: " + @_jscript_version + ".<br>");
   /*@if (@_jscript_version >= 5)
      document.write("JScript Version 5.0 or better.<br \/>");
      document.write("This text is only seen by Internet Explorer browsers that support JScript 5+<br>");
   @else @*/
      document.write("This text is seen by all other browsers (ie: Firefox, IE 4.x etc)<br>");
   /*@end
@*/

</script>
person Jeremy J Starcher    schedule 29.08.2012
comment
Похоже, что он будет включать версии IE, которые утверждают, что поддерживают эту версию JavaScript. Есть ли способ указать версию IE с помощью условной компиляции? Тогда это было бы идеально. - person S. Albano; 30.08.2012
comment
Это выглядит многообещающе, потому что, в отличие от схемы <!--[if lt IE 9]>, это происходит в файле сценария, который мне и нужен. Я это попробую. - person jfriend00; 30.08.2012
comment
Вот однострочная версия этой идеи: dean.edwards.name/weblog/2007/ 03/нюхать - person jfriend00; 30.08.2012
comment
@jfriend00 Небольшое улучшение этого однострочника, чтобы обойти минимизацию JS, удалив комментарий: var isMSIE = eval("/*@cc_on!@*/false"); - person Ates Goral; 24.02.2013

В связанном посте было дано предложение условных комментариев. Это позволит вам определить даже версию IE.

Добавьте что-то вроде этого в своей голове:

<!--[if lt IE 9]>
  <script type="text/javascript">
    var lt9=true;
  </script>
<![endif]-->

Это специфично для IE и будет игнорироваться как комментарий в других браузерах.

Для простого обнаружения используйте что-то вроде этого:

<!--[if gte IE 6]>
  <script type="text/javascript">
    // this is IE greater than or equal to 6
    var isIE=true;
  </script>
<![endif]-->
person S. Albano    schedule 29.08.2012
comment
Хотя он вставляет глобальный, это лучший ответ (пока) - person gion_13; 30.08.2012
comment
Вам не нужно использовать глобальный, это был самый простой случай. Было бы лучше прикрепить его к объекту, которым вы владеете. - person S. Albano; 30.08.2012
comment
Вы можете сделать что-то вроде захвата элемента <body> и добавления к нему класса. - person Pointy; 30.08.2012
comment
Решение Pointy является распространенным; Я считаю, что Modernizr делает это, например. Это также упрощает настройку CSS для IE; вы просто делаете .ie9 x { }. - person technophile; 30.08.2012
comment
Есть ли способ использовать эту технику исключительно из файла сценария? Это библиотечная функция, у которой нет доступа к HTML. - person jfriend00; 30.08.2012
comment
@jfriend00 -- Смотрите мой комментарий ниже. Условная компиляция может полностью выполняться в файле Javascript. - person Jeremy J Starcher; 30.08.2012
comment
Я нашел способ использовать этот метод в файле .js: james.padolsey.com/javascript/. Выглядит не так просто, как метод /*@cc_on в ответе @JeremyJStarcher, но я подумал, что упомяну об этом. - person jfriend00; 30.08.2012
comment
Исправленная ссылка: james.padolsey.com/javascript/ за использование этого метода в файле .js. - person jfriend00; 30.08.2012

Использование условных комментариев вместо условной компиляции имеет то преимущество, что позволяет определить версию IE (в отличие от версии JScript, которая является лучшей, которую можно получить с помощью условной компиляции). Вы можете сделать это из скрипта, используя innerHTML следующим образом. В следующем примере показано, как определить IE 8 или более раннюю версию:

var div = document.createElement("div");
div.innerHTML = "<!--[if lte IE 8]><i></i><![endif]-->";
var isIe8orLower = (div.getElementsByTagName("i").length == 1);

alert("Is IE 8 or lower: " + isIe8orLower);

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

person Tim Down    schedule 03.10.2012