Microsoft User Group Винница feedback Как определить тип браузера? - Alex Krakovetskiy blog - Microsoft User Group Винница

Планируемые события:

Запуск Internet Explorer 9 в Виннице - сентябрь

 

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

Многие наверное скажут, что, мол, это тема банальна и JavaScript для проверки любого браузера можно найти за считанные секунды. Я тоже так думал...

Но, совершенно случайно, я наткнулся на поразительный пост, который описывает элегантные (!) способы определения типа браузера.

Итак,

Firefox 2, 3

// Firefox 2, 3
FF=/a/[-1]=='a'

// Firefox 3
FF3=(function x(){})[-5]=='x'

// Firefox 2
FF2=(function x(){})[-6]=='x'

Internet Explorer 6, 7, 8

IE='\v'=='v'

Safari

Saf=/a/.__proto__=='//'

Google Chrome

Chr=/source/.test((/a/.toString+''))

Opera

Op=/^function \(/.test([].sort)

Проверка типа браузера одной строкой

B=(function x(){})[-5]=='x'?'FF3':(function x(){})[-6]=='x'?'FF2':/a/[-1]=='a'?'FF':'\v'=='v'?'IE':/a/.__proto__=='//'?'Saf':/s/.test(/a/.toString)?'Chr':/^function \(/.test([].sort)?'Op':'Unknown'

Используйте функцию alert() для вывода сообщения с информацией о типе браузера.

Не красота ли?


Related Posts with Thumbnails Posted янв 31 2009, 12:47 by Краковецкий А. View 1 195 8

Comments

Можешь объяснить как это работает? Что такое:

/a/

/source/

(function x(){})

Краковецкий А. on 01-31-2009 11:55

Дело в том, что JavaScript имеет много скрытых функций.

Например, Firefox 2 держит текстовое название метода в элементе с индексом -6 массива. Другими словами, если мы хотим получить строку из названия функции, нужно написать что то на подобии этого:

function Anything(){}

alert(Anything[-6]); // покажет строку "Anything"

(function x(){}) - это динамически созданная функция x(), поэтому Firefox 2 вернет "x" для выражения function x(){})[-6].

Используя скрытые функции и объекты DOM-модели конкретного браузера (как известно, они во многом отличаются), можно писать такие проверки.

Хотя хочу добавить, что это не единственные варианты "элегантных" проверок и разобравшись с тонкостями DOM-моделей, можно написать пару своих...

Еще можно посмотреть sla.ckers.org/.../read.php и www.thespanner.co.uk/.../hidden-javascript-properties

Спасибо. Это я еще догадался. Но что такое /a/ или

/source/. Такое ощущение, что эти сущности дают какое-то значение только в момент выполнения операций.

Краковецкий А. on 01-31-2009 20:24

/a/ - это создание нового объекта, __proto__- прототип объекта.

Что касается /source/, то, думаю, нужно смотреть в сторону V8 - фреймфорка, на котором работает Chrome.

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

Краковецкий А. on 02-19-2009 13:39

Еще несколько моментов.

Для определения разных версий IE можно воспользоваться условными комментариями (сonditional comments). Они работают только в IE под Windows начиная с версии 5.0:

<!--[if IE 6]>

Special instructions for IE 6 here

<![endif]-->

Таким образом можно влиять на css, javascript логику в зависимости от типа браузера.

Также возможны такие записи:

<!--[if gte IE 5]>

According to the conditional comment this is Internet Explorer 5 and up<br />

<![endif]-->

<!--[if lt IE 6]>

According to the conditional comment this is Internet Explorer lower than 6<br />

<![endif]-->

где gt - больше чем, lte - меньше или равно.

Кроме того, IE поддерживает не стандартизированный тэг <comment>:

This is <comment>not</comment> Internet Explorer.

Т.е. в IE вы увидете: "This is Internet Explorer." В остальных браузерах: "This is not Internet Explorer."

Больше об этих возможностях можно почитать здесь - www.quirksmode.org/.../condcom.html.

Ну и в завершении несколько "умных" определений IE в зависимости от версии (спасибо www.thefutureoftheweb.com/.../detect-ie6-in-javascript):

// exactly Internet Explorer 6

var IE6 = false /*@cc_on || @_jscript_version < 5.7 @*/;

// exactly Internet Explorer 7

var IE7 = false /*@cc_on || @_jscript_version == 5.7 @*/;

// at least Internet Explorer 7

var gteIE7 = false /*@cc_on || @_jscript_version >= 5.7 @*/;

// any Internet Explorer

var isMSIE = /*@cc_on!@*/false;

Краковецкий А. on 01-09-2010 16:05

Некто Алеко нашел самый короткий на данный момент способ определения IE:

-[1,]

Всего 5 байт. Пример использования:

if(-[1,]) {

   alert("Not IE!");

}

Подробнее по ссылке: studioad.ru/.../2010-01-08-103

Источник: habrahabr.ru/.../80333

alex on 05-07-2010 18:58

не работает в опере 10.5 и хроме

Краковецкий А. on 05-07-2010 20:02

alex, когда писалась эта статья таких браузеров еще не было :)

Add a Comment

(required)  
(optional)
(required)  
Remember Me?
Please add 8 and 7 and type the answer here:

Enter captcha:

Информация

О нас
Timeline
Партнеры
Инфопартнерство
Реклама на сайте
Поддержать сайт

Разделы

Блоги
Медиа
Форумы
Вики
Презентации

Работа

Вакансии
Компании

Контакты

msugvn@gmail.com
krakovetsky.alex
@msugvnua
ВКонтакте
LinkedIn
Facebook
INETA

Разработка логотипа: Helen

RSS подписка - Microsoft User Group Винница  Twitter - Microsoft User Group Винница

Статистика

Powered by Community Server (Non-Commercial Edition), by Telligent Systems