Як можна визначити IE7 чи IE8, використовуючи CSS-хакі? Визначення версії браузера – PHP або javascript

Я вже якось писав статтю про , але сьогодні я зіткнувся з іншою проблемою - як визначити конкретну версію Internet Explorer. Як усім відомо цей браузер постійно підносить нам сюрпризи, і кожна його версія практично живе своїм життям. Бувають такі ситуації, що код адекватно працює у 9-й версії, але не працює у 8-ій, і навпаки. І такі моменти зустрічаються під час роботи з кожною версією. Тому рано чи пізно доведеться зіштовхнутися з проблемою визначення конкретної версії IE.

Як виявилося визначити версію IE не складає особливих труднощів. При визначенні версії можна скористатися цікавою особливістю Internet Explorer — кожна версія цього «браузера» має унікальні глобальні об'єкти. Наприклад, у IE9 існує глобальний об'єкт document.addEventListener, і такий об'єкт використовується тільки у версіях старших за IE9 (включно). Або об'єкт document.querySelector — він з'явився лише у версії IE8 і використовується у новіших версіях. Такі об'єкти є в кожній версії, спираючись на них (перевіряючи їх існування), можна легко складати умови для конкретних версій Internet Explorer.
Які об'єкти присутні в різних версіяхя наведу в нижче:
IE10+ - window.atob
IE9+ - document.addEventListener
IE8+ - document.querySelector
IE7+ - window.XMLHttpRequest
IE6+ - document.compatMode
Ще один глобальний об'єкт document.all існує у всіх версіях IE, але не використовується у жодних інших браузерах, ґрунтуючись на ньому можна відрізнити IE від інших браузерів.

Як визначити версію Internet Explorer у javascript. Код

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

If(document.all)( // код для всіх версій IE. В інших браузерах виконуватись не буде) if(document.all && !window.atob)( // код для IE9 і нижче) if(document.all && !document .addEventListener)( // код для IE8 і нижче) if(document.all && !document.querySelector)( // код для IE7 і нижче ) if(document.all && !window.XMLHttpRequest)( // код для IE6 і нижче ) if(document.all && window.atob)( // код для IE10 і вище ) if(document.all && document.addEventListener)( // код для IE9 і вище ) if(document.all && document.querySelector) ( // код для IE8 і вище ) if(document.all && window.XMLHttpRequest)( // код для IE7 і вище ) if(document.all && document.querySelector && !document.addEventListener)( // код тільки для IE8 )

Добре якщо ваш сайт працює у всіх, або майже у всіх браузерах так, як ви хочете. Все змінюється, виходять нові версії, з'являються нові можливості, і безглуздо їх не використовувати, щоб «старим». Року 1,5 тому IE 6.0 (судячи зі статистики відвідувань одного з моїх сайтів) був на кожному третьому комп'ютері, що використовує IE. Доводилося з ним зважати, т.к. IE домінував на комп'ютерах – понад 40% відвідувачів користувалися IE. Я пов'язую таке поширення IE 6.0 (не дивлячись на те, що вже вийшла 8-я версія), в першу чергу, з широким поширенням старих піратських версій Windows XP у Росії, які не підключаються до сервера оновлень.

Зараз активно встановлюють і більше свіжі версії XP (теж майже всюди піратські), де вже в комплекті йде 7-а версія IE, і Windows 7, що поставляється з MSIE 8.0. Крім того, IE довелося потіснитися, а на перше місце вийшла Opera (29,8% відвідувачів), а IE, втративши більше 10%, посідає 2-е місце, набравши 28.8% загального обсягу відвідувачів. При цьому частка IE 6.0 у загальному обсязі користувачів IE скоротилася з 34 до 15%. Замикає трійку лідерів – FireFox.

Таким чином, IE 6.0 зараз користується кожен 20-й користувач (близько 5%). З ними все ще доводиться рахуватися.

Цей довгий вступ покликаний показати, що питання про те підтримувати якісь версії браузерів чи ні — серйозне, потребує періодичних досліджень, щоб розуміти, яка поточна ситуація. Вона буде різною для різних регіонів, можливо, навіть залежатиме від тематики сайту. Рано чи пізно виникає ідея повідомити користувача, що мовляв, є вже нові браузери (пора ними почати користуватися, друже!).

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

... //після завантаження документа, буде виконано перевірку версії браузера //і вжито якісь дії ...

. . .

< / head >

//після завантаження документа, буде виконано перевірку версії браузера

//і вжиті якісь дії

< body onload = "check_version();" >

. . .

У PHPможна звернутися до заголовків, що передаються браузером, за допомогою ф-ції getallheaders(), вона поверне асоціативний масив, де елемент міститиме інформацію про браузер.

Тож ми з'ясували, що шляхів як мінімум — 2. Який краще? Я прихильник того, щоб вся робота, яка не пов'язана з безпекою, яка досить легко реалізується на стороні клієнта, - виконувалася на клієнтській машині. В наш час найчастіше виходить так, що ресурси клієнтських машин значно перевищують можливості віртуальних виділених веб-серверів. Ось нехай вони і працюють у міру можливості:).

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

Є тут і «підводне каміння». Адже якщо не брати до уваги мої особисті переваги, то виконати перевірку на стороні сервера буде важливо більш вірним підходом. Хоча б тому, що визначити версію браузера на деяких старих клієнтах, не можна буде так, як я це показав у прикладі. І скрипт буде складнішим. Одним з підводного каміння може виявитися система кешування сторінок сайту (як, наприклад, у drupal). Один раз визначивши на стороні сервера, що клієнт підходить або, навпаки, не підходить для відображення сайту, сторінка з цим результатом відображатиметься всім іншим анонімним клієнтам, доки не скінчиться час життя кеша. У таких випадках javasctipt є єдиним підходящим варіантом.

Зіткнувся з такою поведінкою плагіну fancybox. При відкритті модального вікна відбувається прокручування в основному вікні до самого верху. Як із цим боротися? Це відбувається не завжди, а за деяких випадків верстки. Верстку вже міняти проблематично.

Схоже, що майже весь світ відмовився від IE6. Ну, може, якісь 5% користувачів ще використовують його, але ж не веб-розробники винні в тому, що вони використовують застаріле ПЗ.

Якщо ви займаєтеся розробкою веб-сайтів і програм, то, напевно, знаєте, що відсоток користувачів IE6 вже дуже малий. Наприклад, якщо судити зі статистики нашого веб-сайту, то лише 0.5% наших відвідувачів використовують IE6 (статистика за останні 30 днів). Ймовірно, ваша статистика показує приблизно такі самі дані.

З цієї причини, веб-дизайнерам та розробникам тепер залишилося приділяти час лише хакам для IE7 та IE8. Спочатку важливо відзначити той факт, що якщо ви дотримуєтеся певних принципів розробки CSS-коду, то вам взагалі не знадобляться хакі.

Тим не менш, багатьом розробникам-початківцям часто потрібно визначати IE7 або IE8. Давайте ознайомимося з найкращими способамирозв'язання цієї задачі.

Умовні класи від Пола Айріша

Найкращий метод полягає у вказівці, і він був розроблений Полом Айрішем. Робимо так:




Цей кодвикористовує визначення конкретних версій IE, а HTML-елемент отримує окреме ім'я класу кожної версії IE, і отримує класу взагалі, якщо браузер користувача не IE.

Element (
margin-bottom: 20px;
}

Ie7 .element (
margin-bottom: 10px;
}

Ie8.
margin-bottom: 15px;
}
У кожному браузері буде нижнє поле 20 пікселів, але в браузерах IE7 і 8 вона становитиме 10 і 15 пікселів відповідно.

Тут важливо відзначити те, що визначення IE часом дуже важливе, але я б рекомендував вам максимально постаратися знайти краще рішеннящодо обходу невідповідності між браузерами. Намагайтеся уникати використання умовних класів та наступних хаків, про які далі йтиметься. Іноді легше і правильніше буде по-іншому структурувати код CSS.

CSS-хакі

Тепер розглянемо способи визначення IE7-8 за допомогою хаків. Спочатку ми навчимося визначати лише IE7. Тут, мабуть, існує більше 2-х методів, але ми розповімо вам лише про 2 (більше яких вам нічого і не знадобиться):

* + html .element (
margin-bottom: 10px;
}
Хак - це частина селектора, яка розташована перед елементом. Жоден інший браузер не розпізнає цей селектор, тому 10-піксельне поле буде існувати тільки в браузері IE7.

І ще один менш зрозумілий спосіб:

*:first-child+html .element (
margin-bottom: 10px;
}
Далі можна визначити IE7 наступним чином:

Element (
margin-bottom: 20px;
* margin-bottom: 10px;
}
«Хак» є зірочкою ( * ) на початку рядка коду CSS, який ми хочемо застосувати до браузера IE7. Єдина проблема полягає в тому, що це також поширюється на 6 версію браузера. Отже, вам слід використати даний методтільки якщо ви впевнені у важливості застосування цього коду в обох версіях браузера. Або якщо вас зовсім не хвилює те, як це буде відображено в IE6.

За моїми особистими спостереженнями, цей метод не підходить для того, щоб визначати лише IE8 (і при цьому не охоплювати IE6-7, 9 тощо). Залишається лише використати умовний коментар.

Тим не менш, якщо ви відмовилися від підтримки IE7, то ви можете використати наступний варіант:

Element (
margin-bottom: 20px;
margin-bottom: 10px9;
}
«Хак» полягає у вказівці « \9 » в кінці значення, перед заключною точкою з комою. Це дозволить вам визначити IE8 і нижче, так що ви можете використовувати цей хак для визначення лише 8 версії браузера, якщо ви вже відмовилися від підтримки 7 та 6 версій.

Умовні коментарі

Нарешті, ми можете розділити ваш CSS-код для IE7 та IE8 в окремі файли. Це можна зробити, скориставшись умовними коментарями:






Але особисто я не рекомендую вам використати цей метод. Тут є 2 основні проблеми: перша - це розділяє ваш CSS-файл на 3 окремих файлівщо призводить до складності синхронізації. А друга – ви створюєте додаткові запити HTTPу двох найповільніших браузерах, що значно розтягує процес завантаження вашого веб-сайту.

Особисто я раджу вам використовувати або умовні класи або прості хакі для визначення IE7-8.

Запитання?

Цей посібник не претендує на звання кращої допомоги з даного предмета. Це швидше підказка для новачків.