JavaScript: Чи можу я виявити IE9, якщо він перебуває в режимі сумісності IE7 або IE8?


87

Мені потрібно знати, чи браузер, який ідентифікує себе за допомогою рядка агента користувача як IE7 або IE8, насправді є тими браузерами, чи це IE9 у режимі сумісності 7 або 8.

З того, що я бачу в рядку агента користувача, IE9 у режимі сумісності IE7 забезпечує ідентичний рядок справжньому IE7. Чи є якась додаткова властивість / елемент / об’єкт, який я можу протестувати, щоб перевірити, чи це "дійсно" маскується IE9?

Я припускаю, що режим документа не допоможе, оскільки сторінка, на яку завантажується мій сценарій, може або примушувати дивацтва, або примушувати певне налаштування.

Я сподіваюся, що IE9 матиме якесь властивість, яке існує та перевіряється, незалежно від того, в режимі 7, 8 чи 9.


Відредаговано, щоб додати…

Добре, я бачу, де я зараз помилявся. Я використовував спадне меню "Режим браузера" і перемикав його на IE8 та IE7 і думав, що це "Режим сумісності IE8" та "Режим сумісності IE7" відповідно. Це, звичайно, неправда. Режим браузера інструментів розробника насправді переключає його на "схожий" на ті старі браузери, тому цілком правильно повідомляти про оригінальні рядки useragent.

Якщо я залишу режим браузера в сумісності з IE9 або IE9 і замість цього спробую варіанти випадаючого режиму документа, то я фактично отримую "Trident / 5.0", присутній у всіх 8 комбінаціях (два режими браузера та 4 режими документа). Мені просто потрібно уникати вибору режиму браузера IE7 та IE8, оскільки вони насправді є (змодельовані) IE7 та IE8.

Отже, немає можливості, щоб сторінка, користувач, який не є розробником, метатег або список сумісності Microsoft, змогли перевести IE9 у цей неідентифікований стан.

Достатньо if(navigator.userAgent.indexOf("Trident/5")>-1)буде лише використання .

Не хвилюйтеся, це не стосується стилів, форматування, логіки чи вмісту сторінки. Я використовую виявлення функцій для цих речей. Мені просто потрібно виявити IE9 (незалежно від того, в якому режимі він перебуває) і прийняти рішення, яке не стосується сторінки.

Дякуємо, що направили мене до відповіді своїми пропозиціями та посиланнями.


1
Ніколи не довіряйте користувальницькому агенту ... він може чудово брехати, і немає жодної можливості бути впевненим, чи правду він говорить чи ні ... замість цього слід перевірити наявність певних функцій або функцій
JCOC611,

2
@ JCOC611 Так і ні. Це конкретне питання, як дізнатись, чи це IE9 у поданні сумісності, що є обґрунтованим питанням. Взагалі, не слід покладатися на рядки агента користувача для функціонування сайту, оскільки це можна легко підробити, правда.
Dennis G

1
Навіть якщо користувальницький агент точний, переважно використовувати виявлення функцій, якщо це можливо. Тоді вам не потрібно знати, перебуває IE в режимі сумісності чи ні.
Dave Ward

1
Я просто хочу додати, що це дуже корисно, якщо ви хочете надати швидкий підручник користувачам, які використовують неправильний режим браузера.
Joost

1
@ JCOC611, який підробляв би їх користувач і сподівався, що все працюватиме правильно - чи справді нам потрібно піклуватися про цю справу?
JohnnyFaldo

Відповіді:


67

Насправді рядок агента користувача відрізняється для IE9, коли він працює в режимі сумісності IE7, тому це був би один із найкращих способів розрізнити різні версії IE.

Представляємо рядок агента користувача IE9 :

Подібно до IE8, подання сумісності IE9 відображатиметься у стандартному режимі IE7, а рядок UA IE9 у режимі перегляду сумісності буде:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)

У режимі сумісності IE9 повідомляє про себе як IE7 через номер версії програми (Mozilla / 4.0) та маркер версії (MSIE 7.0). Це робиться для сумісності. Збільшений маркер Trident, починаючи з 'Trident / 4.0' і закінчуючи 'Trident / 5.0', дозволяє веб-сайтам розрізняти IE9, що працює в Compat View, і IE8, що працює в Compat View .

(підкреслення додано мною). Отже, рядок агента користувача такий самий, що і сам повідомляє, що він "Mozilla / 4.0" та MSIE 7.0, але IE9 завжди буде Trident / 5.0 - незалежно від того, чи вказується MSIE 7.0, MSIE 8.0 або MSIE 9.0.

Насправді ви повинні перевірити цю чудову компіляцію: рядки ідентифікатора браузера (User-Agent) або навіть краще useragentstrings.com


1
Привіт moontear. Я також побачив, що "Trident / 5.0" повинен бути присутній, коли IE9 перебуває в режимі IE7, але це не те, що я бачу на своєму (остаточному) IE9 на Win7 Pro x64. Він не показує жодного тризуба в режимі IE7 (як виглядає справжній IE7), а показує тризуб 4 в режимі IE8 (знову ж таки, як виглядає справжній IE8). Я використовую інструменти розробника IE9 спочатку для вибору режиму браузера, а потім у адресному рядку попередження javascript: alert (navigator.userAgent)
Dee2000,

1
"Trident / 5.0" присутній у рядку агента користувача IE9 у всіх режимах.
EricLaw

Як каже EricLaw, Ді. У режимі сумісності повинен бути присутній Trident / 5.0 (може бути іншим для режиму браузера?). Як перевірити рядок агента користувача? Спробуйте перевірити через whatsmyuseragent.com і повідомити про це.
Dennis G

Дивіться мою відповідь нижче (мені довелося використовувати інший ідентифікатор Dee2001 через правило переповненості стека 8 годин про додавання відповіді до вашого власного повідомлення). Так Ерік і Moontear обидва правильні, Trident / 5.0 є присутній у всіх режимах в IE9. Моєю великою помилкою було змінити "Режим браузера" на IE7 або IE8 в інструментах розробника, але це не "режим", який може застосувати сторінка / мета-тег / список сумісності. Натомість це насправді імітує самі браузери, тому, природно, рядок useragent справді схожий на IE7 / 8.
Dee2000

1
Це прекрасно! Дуже дякую. Я не створюю стиль на основі повідомленого браузера, але я встановлюю рядок попередження у верхній частині сайту, над яким я працюю, який говорить, що користувачеві потрібно оновити (якщо умовні теги говорять, що це менше або дорівнює ie7) - Я не хочу, щоб у цьому повідомленні говорилося про оновлення, а скоріше вимкнути режим сумісності
Челсі Уркварт,

47

document.documentMode - найкращий спосіб для режиму документа.


17
Будь ласка, трохи розширте відповідь. Більше контексту.
random_user_name

3
Чому люди не псують це, саме те, що потрібно
Джеймі Хатбер

5
Це справді найкращий спосіб. Ви можете використовувати його таким чином: <script> if (document.documentMode == 7) alert("Yo, put it in its normal mode, will ya?") </script>. Справжній (!) IE7 та всі не-IE повертають "невизначено", лише IE8 / 9 у Comp. повернення режиму 7. Я не можу протестувати IE10, але це повинно бути однаковим.
Frank Conijn

2
Щойно спробував це в IE10 на стороні з крайовим тегом META; як правило, він повертає "10". Примусово ввімкніть режим сумісності для всіх сайтів, і він все одно повертає "10".
Whelkaholism

Працює для мене в IE10 та IE11 Preview
Simon Keep

20

IE7 не містить жодної інформації про Trident

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0)

IE8 містить такий рядок: "Trident / 4.0"

User-Agent : Mozilla/4.0 (compatible; MSIE 8.0; Trident/4.0)

IE9 містить такий рядок: "Trident / 5.0"

IE9 в режимі сумісності:

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0; Trident/5.0)

IE9 у звичайному режимі:

User-Agent : Mozilla/5.0 (compatible; MSIE 9.0; Trident/5.0)

1
Це чудово, чи збільшує IE10 Trident також?
slotishtype

3
Користувачі Internet Explorer 10 Trident / 6.0 .... див. Blogs.msdn.com/b/ie/archive/2012/07/12/…
slotishtype

1
і IE11 використовує Trident / 7.0
Dee2000


11

Я сподіваюся, що IE9 матиме якесь властивість, яке існує та перевіряється, незалежно від того, в режимі 7, 8 чи 9.

Перевірте, наприклад, наявність style.opacity , він був введений в IE9 і доступний незалежно від режиму сумісності:

<![if IE]> 
<script>
if(typeof document.documentElement.style.opacity!='undefined')
{
  //this must be at least IE9 
}
</script>
<![endif]>

1
Дякую доктору Молле, я спробую спробувати повідомити.
Dee2000

На жаль, це працює лише в режимі браузера (спадне меню ліворуч в інструментах розробника IE9). Це не працює для режиму Документ (спадне меню праворуч). У режимі документа він працює лише в режимі документа IE9. Якщо це в режимах IE8, IE7 або Quirks, ця логіка не вдається.
Dee2000

7
Блін, ваше право. Я знайшов іншу властивість, працює для мене в кожному режимі: window.performance
Dr.Molle

@ Dee2000: Це працює у мене і з DocumentMode. Тобто ТІЛЬКИ якщо DocumentMode = "Internet Explorer 9 стандарт", цей тест вдається.
Ніклас Бекман

@ Dr.Molle дякую за це, window.performance добре виконує роботу.
lewsid

3

Іноді доводиться читати рядок агента користувача із змінної сервера, а не з об'єкта навігатора javascript.

Порівняйте відмінності:

  • Класичний ASP, IE11

    • клієнтський javascript, navigator.userAgent: " Mozilla / 5.0 (сумісний; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS) "

    • сервер ASP, Request.ServerVariables ("HTTP_USER_AGENT"): " Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; BOIE9; ENUS; rv: 11.0), як Gecko "

  • Класичний ASP, режим сумісності IE11 :

    • клієнтський javascript, navigator.userAgent: " Mozilla / 5.0 (сумісний; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS)) "

    • сервер ASP, Request.ServerVariables ("HTTP_USER_AGENT"): " Mozilla / 4.0 (сумісний; MSIE 7.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS) "


0

З https://stackoverflow.com/a/29288153/2879498

Якщо припустити, що у вас є прихований елемент із попередженням ID comp:

Javascript w / jQuery:

$(function(){
    function showCompatWarning() {
        $('#compat-warning')
            .css('display','block')
            .css('height','auto')
            .show();
    }
    var tridentOffset = navigator.appVersion.indexOf('Trident/');
    if ( tridentOffset === -1 ) return;
    var jscriptVersion = 0;
    /*@cc_on @*/
    /*@if (@_jscript) jscriptVersion = @_jscript_version ; @*/;
    /*@end @*/
    var tridentVersion = parseInt(navigator.appVersion.substr(tridentOffset+8),10);
    var guessIEVersion = tridentVersion + 4;
    if (( document.documentMode && jscriptVersion && jscriptVersion < 10 && jscriptVersion !== document.documentMode ) ||
        ( document.compatMode && document.compatMode === 'BackCompat') ||
        ( document.documentMode && document.documentMode < 10 && document.documentMode != guessIEVersion ))
        showCompatWarning();
});

Виявлення та попередження, ваша перша та остання лінії захисту від пекла сумісності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.