Как определить IE 8 с помощью jQuery?

102

Мне нужно определить не только тип браузера, но и версию с помощью jQuery. В основном мне нужно узнать, IE 8 это или нет.

Не уверен, правильно ли я это делаю.

Если я сделаю :

if (jQuery.browser.version >= 8.0) {
dosomething}

Не уверен, что подойдет версия 8.123.45.6 или будет?

Изменить: обратите внимание, что JQuery 2+ отказался от поддержки IE8 и ниже и, следовательно, больше не может использоваться для обнаружения IE8. При использовании текущей версии JQuery необходимо использовать решение, отличное от JQuery.

салман
источник
11
Предлагаемые ниже ответы предполагают, что вы используете jQuery.browser. Однако в документации jQuery не рекомендуется использование jQuery.browser. Вместо этого они предлагают вам использовать jQuery.support и указать на функцию, которая не поддерживается, чтобы отметить браузер. Например, вы можете использовать if (jQuery.support.opacity == false) {ваш код IE8 и IE7}
IberoMedia
Это jquery.support.opacityпросто сделало то, что я хотел. Спасибо ...
nrod
Если вы все делаете правильно, вам вряд ли когда-нибудь понадобится определять версию браузера. Есть причина, по которой эта функция была удалена из jQuery, и эта причина в том, что определение версии браузера - плохая практика. Использование функции обнаружения вместо этого решит проблему почти во всех случаях.
Spudley
2
Мне нужно обнаружить IE8, потому что это единственный браузер, в котором движок javascript настолько медленный, что на этой странице появляется диалоговое окно с сообщением «хотите ли вы остановить выполнение скрипта», а значение по умолчанию - «да». Если для этого есть механизм обнаружения функций, я воспользуюсь им. В противном случае это если браузер == IE8. Я не могу оптимизировать javascript, потому что его вызывает собственный код древовидного представления Кендо
PandaWood

Ответы:

79

Это задокументировано в документации API jQuery . Проверьте Internet Explorer с помощью, $.browser.msieа затем проверьте его версию с помощью $.browser.version.

ОБНОВЛЕНИЕ: $ .browser удален в jQuery 1.9

Метод jQuery.browser () устарел с jQuery 1.3 и удален в 1.9. При необходимости он доступен как часть плагина jQuery Migrate. Мы рекомендуем использовать обнаружение функций с такой библиотекой, как Modernizr.

AndiDog
источник
если я это сделаю: if (jQuery.browser.version> = 8.0) {dosomething} Я не уверен, что он будет работать с версией 8.123.45.6 или будет?
Salmane
13
Это строка, так что вы должны это сделать if(jQuery.browser.version.substring(0, 2) == "8.") { ... }. Таким образом, он будет работать со всеми версиями IE8.
AndiDog
13
jQuery.browserустарела в версии 1.3 и в будущем может быть перенесена в плагин. См. Документацию jQuery.browser
bendytree
К счастью, он все еще существует, и нет никаких упоминаний об устаревании, @bendytree
Алистер
47
jquery.browser удален в 1.9
Mandeep Jain
173

Думаю, лучше всего было бы так:

Из шаблона HTML5:

<!--[if lt IE 7]> <html lang="en-us" class="no-js ie6 oldie"> <![endif]-->
<!--[if IE 7]>    <html lang="en-us" class="no-js ie7 oldie"> <![endif]-->
<!--[if IE 8]>    <html lang="en-us" class="no-js ie8 oldie"> <![endif]-->
<!--[if gt IE 8]><!--> <html lang="en-us" class="no-js"> <!--<![endif]-->

в JS:

if( $("html").hasClass("ie8") ) { /* do your things */ };

тем более $.browserчто был удален из jQuery 1.9+.

Мео
источник
11
Это очень умный способ определения версий IE. Мне очень нравится!
Грег,
но не работает, если ваш веб-сайт поставляется с заголовком Content-type: application / xhtml + xml, чем эти условные комментарии игнорируются,
Филипп
1
Очень умно ... но стоит отметить, что вам нужно проверить текущие классы, добавленные условными операторами в HTML5BP. На данный момент я думаю, что это lt-ie9AOTie8
byronyasgur
2
@meo Мне тоже нравится эта реализация. Но есть ли причина, по которой класс прикреплен <html>вместо <body>?
отдыхает
@meo Интересно. Спасибо.
отдыхает
89

Это должно работать для всех минорных версий IE8.

if ($.browser.msie  && parseInt($.browser.version, 10) === 8) {
  alert('IE8'); 
} else {
  alert('Non IE8');
}

-- Обновить

Обратите внимание , что $ .browser будет удален из JQuery 1.9

Митхун Сридхаран
источник
56

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

<!--[if IE 8]>
<script type="text/javascript">
    ie = 8;
</script>
<![endif]-->

Имея это перед всеми вашими скриптами, вы можете просто проверить переменную "ie" или что-то еще.

TheBuzzSaw
источник
4
Этот синтаксис также поддерживает компараторы «меньше чем» («[если lt IE 7]») и «больше чем» («[if gt IE 8]»).
spiffytech 05
1
<! - [if lte IE 8]> для включения IE8
user227353
1
Это лучший способ сделать это, просто перенаправьте на другую страницу, которая говорит: «Почему вы используете IE8?» ОБНОВИ СЕЙЧАС!
Леон Габан
2
По сегодняшним стандартам я бы спросил их, почему они вообще используют IE.
TheBuzzSaw 09
Сейчас это кажется лучшим решением, поскольку JQuery 2.1.1 не работает с IE8 и, следовательно, не может использоваться для обнаружения IE8!
Дэйв
27

document.documentMode не определен, если браузер не IE8,

он возвращает 8 для стандартного режима и 7 для «совместимости с IE7»

Если он работает как IE7, многие функции css и dom не будут поддерживаться.

Kennebec
источник
9
Обратите внимание, что IE9 возвращает 9. Это должен быть более высокий ответ, поскольку теперь $ .browser больше не является хорошим решением. Попробуйте:if ((document.documentMode || 100) < 9) { // IE8
Дон МакКерди
if (document.documentMode! == undefined && document.documentMode == 8) {...}
jpprade
Для некоторых приложений, в которых IE8 все еще широко используется, а именно для школ США, подход @Don McCurdy прост и эффективен. В тандеме с Modernizr работает нормально.
cbmtrx
Отличный ответ! Это возвращает номера версий от IE8 до IE11 (по сравнению с IE5 до IE9 для условных комментариев - если кому-то еще нужно обнаружить подлинный IE7 или IE6, вам нужно будет использовать условные комментарии). Обратите внимание, что в соответствии с документами он может возвращаться 0во время загрузки страницы - «попробуйте определить режим совместимости документа позже» (т.е. после того, как документ будет готов).
user56reinstatemonica8
15

Предполагая ...

  • ... что вы заинтересованы в том, чтобы обнаружить хрустящий механизм рендеринга старых версий IE, чтобы стиль выглядел правильно в старом IE (в противном случае используйте обнаружение функций)
  • ... что вы не можете просто добавить условные комментарии к HTML - например, для плагинов JS, которые могут быть применены к любой странице (в противном случае просто проделайте трюк с условными классами на <body>или <html>)

... тогда это, вероятно, лучший трюк (основанный на этом не-jQuery, чуть менее гибком варианте ). Затем он создает тесты, а затем удаляет соответствующий условный комментарий.

(Условные комментарии игнорируются в «стандартном режиме» IE10 + - но это должно быть нормально, поскольку в «стандартном режиме» IE10 + нет сумасшедшего движка рендеринга!)

Добавьте эту функцию:

function isIE( version, comparison ){
    var $div = $('<div style="display:none;"/>');

    // Don't chain these, in IE8 chaining stops some versions of jQuery writing the conditional comment properly
    $div.appendTo($('body'));
    $div.html('<!--[if '+(comparison||'')+' IE '+(version||'')+']><a>&nbsp;</a><![endif]-->');

    var ieTest = $div.find('a').length;
    $div.remove();
    return ieTest;
}

Тогда используйте это так:

if(isIE()){ /* runs in all versions of IE after 4 before standards-mode 10 */ }

if(isIE(8)){ /* runs in IE8 */ }

if(isIE(9)){ /* runs in IE9 */ }

if(isIE(8,'lte')){ /* runs in IE8 or below */ }

if(isIE(6,'lte')){ /* if you need this, I pity you... */ }

Я также предлагаю кешировать результаты этой функции, чтобы вам не приходилось ее повторять. Например, вы можете использовать строку (comparison||'')+' IE '+(version||'')в качестве ключа для хранения и проверки результата этого теста в каком-либо объекте.

user56reinstatemonica8
источник
9

Примечание:

1) $ .browser, похоже, отсутствует в jQuery 1.9+ (как отметил Мандип Джайн). Он рекомендуется использовать .поддержку вместо.

2) $ .browser.version может возвращать «7» в IE> 7, когда браузер находится в режиме «совместимости».

3) Начиная с IE 10, условные комментарии больше не работают.

4) jQuery 2.0+ откажется от поддержки IE 6/7/8

5) document.documentMode определяется только в браузерах Internet Explorer 8+. Возвращенное значение сообщит вам, в каком режиме «совместимости» работает Internet Explorer. Тем не менее, это не лучшее решение.

Я пробовал множество вариантов .support (), но оказалось, что когда браузер IE (9+) находится в режиме совместимости, он просто ведет себя как IE 7 ... :(

Пока что я нашел, что это работает (вид-а):

(если documentMode не определен, а htmlSerialize и opacity не поддерживаются, тогда вы, скорее всего, смотрите на IE <8 ...)

if(!document.documentMode && !$.support.htmlSerialize && !$.support.opacity) 
{
    // IE 6/7 code
}
Hanzaplastique
источник
5

Если вы возитесь с версиями браузера, это очень часто приводит к плохим результатам. Вы не хотите реализовывать это самостоятельно. Но вы можете Modernizr, сделанный Полом Айришем и другими умными людьми. Он определит, что на самом деле может делать браузер , и поместит в <html>элемент соответствующие классы . Однако с помощью Modernizr вы можете протестировать версию IE следующим образом:

$('html.lt-ie9').each() {
    // this will execute if browser is IE 8 or less
}

Аналогично, вы можете использовать .lt-ie8и .lt-ie7.

Koubic
источник
3

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

Jkyle
источник
3
как бы вы использовали jQuery.support для обнаружения IE8?
BishopZ 06
если AJAX - это то, что вы ищете, вы можете использовать jQuery.support.ajax, который возвращает true, если браузер поддерживает AJAX
Джонатан Лин
Этот ответ должен помочь: stackoverflow.com/questions/1944169/…
helgatheviking
3

Вы можете легко определить тип и версию браузера, используя этот jquery

$(document).ready(function()
{
 if ( $.browser.msie ){
    if($.browser.version == '6.0')
    {   $('html').addClass('ie6');
    }
    else if($.browser.version == '7.0')
    {   $('html').addClass('ie7');
    }
    else if($.browser.version == '8.0')
    {   $('html').addClass('ie8');
    }
    else if($.browser.version == '9.0')
    {   $('html').addClass('ie9');
    }
 }
 else if ( $.browser.webkit )
 { $('html').addClass('webkit');
 }
 else if ( $.browser.mozilla )
 { $('html').addClass('mozilla');
 }
 else if ( $.browser.opera )
 { $('html').addClass('opera');
 }
});
Санудж
источник
1

Вот плагин обнаружения браузера Jquery для определения обнаружения браузера / ОС.

Вы можете использовать это для стилизации после включения плагина.

$("html").addClass($.os.name);
$("body").addClass($.browser.className);
$("body").addClass($.browser.name);
Аравинд Вел
источник
0

Вы можете использовать $ .browser для определения имени браузера. возможные значения:

  • webkit (начиная с jQuery 1.4)
  • сафари (не рекомендуется)
  • опера
  • мси
  • мозилла

или получите логический флаг: $ .browser.msie будет истинным, если браузер - MSIE.

Что касается номера версии, если вас интересует только основной номер версии - вы можете использовать parseInt ($. browser.version, 10). нет необходимости самостоятельно разбирать строку $ .browser.version.

В любом случае свойство $ .support доступно для обнаружения поддержки определенных функций, а не для использования $ .browser.

Йонатан Бетцер
источник