Самое короткое определение IE

javascript, 08.01.2010 Пятница, 00:54
Теги: javascript, studioad, полезное
      Изучая листинги ошибок и несоответствий браузеров Internet Explorer, я наткнулся на один интересный баг, который позволил написать самый короткий из известных мне способов определения этого браузера на javascript. До сих пор самым коротким из существующих способов считалось выражение, предложенное Дином Эдвардсом в своем блоге.

     Я предлагаю ещё более короткий вариант (на 3 символа короче чем самый короткий вариант из блога Эдвардса - 6 символов). Переменная возвращает true в internet explorer и false во всех остальных браузерах.
Code
<script type='text/javascript'>
var ie = !-[1,];
alert(ie);
</script>
    Этот вариант не зависит от режима отображения страниц в браузере. Так же он протестирован во всех версиях IE и в других распространенных браузерах. Основывается на баге, признанном Microsoft достаточно давно, но так и не исправленном.

    Вот несколько других кратчайших методов определения IE.
Code
<script type='text/javascript'>
// Вариант от Дина Эдвардса:
var ie = /*@cc_on!@*/false;

// Использования закомментированной строки:
var ie//@cc_on=1;

// Вариация (более короткая переменная):
var ie = '\v'=='v';

// Вариант от Гарета Хэйеса (бывший рекордсмен):
var ie = !+"\v1";
</script>
UPD
     Возможно так же обратное использование функции - true в нормальных браузерах и false в IE. В таком случае переменная займет 5 символов:
Code
<script type='text/javascript'>
notIe = -[1,];

/* в таком случае становится
доступным написание вида */

if(-[1,]){
// код для нормальных браузеров
}else{
// код для IE
}
   
</script>
Ie detection in 5 bytes!
Как это работает?
    Мой способ определения IE основан на документированной ошибке. Ошибка заключается в том что Internet Explorer прибавляет пустой элемент массива к общему числу элементов. То есть
Code
[1,].length
вернет 1 во всех нормальных браузерах (По стандарту ECMAscript, одна запятая в конце массива игнорируется - это сделано для удобства записи в столбик, автогенерации и прочего), ie же вернет 2. Это же произойдет и при распечатывании массива: ie вернет '1,' так как он видит 2 элемента и следовательно разделяет их запятой а все остальные браузеры вернут '1'. Это легко проверить вот этим кодом поочередно выполнив его сначала, к примеру, в FF а потом в IE:
Code
<script type='text/javascript'>
alert([,]==',');
// это кстати 8-символьная проверка на IE =)
</script>
     Далее мы переводим полученную строку в число. Для этого я использовал знак вычитания. Переводя '1,' в число эксплорер получит NaN, то есть Not a Number - не число, так как в выражении присутствует запятая. Обычные же браузеры получат -1, число не равное нулю.

     Так, при переведении NaN в булевное значение мы получаем false а при переведении любого ненулевого числового значения (в данном случае -1) в булевное значение мы получаем true. На этом основывается принцип определения браузера.

     Восклицательный знак в начале выражения переводит результат в булевное значение и зеркально его изменяет. В итоге мы получаем true в IE и false во всех остальных браузерах.
Видеодесерт
Teh Third & the Seventh by Alex Roman. Неповторимо. Пожалуйста не смотрите здесь, откройте vimeo и посмотрите в HD на весь экран.

Жми на пятую!
42, 24, 16485
№23
[sayto]Aleko[/sayto], хотя бы ссылки оставили)))
№21
Ещё один способ выявить IE. Не короткий, но интересный:

[sayto]var IE = ''.replace('','$$')>'$'[/sayto],

№20
[sayto]Aleko[/sayto], теперь испанцы ;)
№19
Хех. Andrea Giammarchi таки признал мой вариант:
http://twitter.com/WebReflection/status/7515524075
№18
[sayto]i17, pochemuby.net[/sayto], да, вы правы, пятисимвольных похоже маловато, хотя безусловно есть ещё, в прошлом комментарии я перепутал с шестисимвольными. Виноват. Но в вашем способе есть один очень существенный минус, который и делает мой способ лучше.

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

Вот ещё пример пятисимвольника возвращающего булевные значения:

[,]<1

№17
[sayto]i17, pochemuby.net[/sayto], да, вариантов с использованием этого хака очень много. Я привел несколько в статье. Пожалуйста)
№16
[sayto]USF[/sayto], нет, всё верно. [1,] - IE считает за 2 элемента, а все остальные браузеры - за один!
№15
[sayto]USF[/sayto], читайте внимательно и тестируйте код. Ошибок нет.
№14
Кстати вот что, на хабре отметили что при подобном написании выводится ворнинг в Опере, но у меня ни в 10 ни в 9 версиях не выводится ни предупреждений ни ошибок, как и в других браузерах.
№13
Хм.. В любом случае на мой взгляд мое решение будет распространено. Не думаю что в каждом скрипте будут заменятся функции обработки массивов, да и профессионалы врятли воспользуются определением браузера по багу, а для рядовых пользователей решение окажется полезным.
№12
[sayto]ecma[/sayto], в каком смысле? Оно использует ошибку, как и другие варианты подобных хаков.
№11
[sayto]bolk[/sayto], да, описа'лся, спасибо.
№10
[,]>''

Шестисимвольный вариант возвращающий true в IE и false в других браузерах.

№9
[1,]^1

шестисимвольный вариант, возвращающий 1 в IE и 0 в других браузерах.

№8
[sayto]Aleko[/sayto], красавчик :))) И комменты одобрительные ;)
№7
Есть! Моё решение признали на webreflection.blogspot.com !
№6
[sayto]Aleko[/sayto], жалко, не видел :( Да в прочем, все равно, здесь главное полученный личный опыт :)
№5
Гений нашего времени :D
Где-же "Гиннес"? :D
№4
Журналисты "Книги рекордов Гинеса" уже в пути :D
А так, занятно...
Ответ: Спасибо
№3
И вновь, на один символ меньше, Эйнштейн.
№2
Хех, молодец.
№1
Это сенсация, однозначно :) Простой русский парень из Питера написал такой хак, перещеголяв самого Дина Эдвардса :)
SinuS
    © Блог StudioAD.ru 2024 год нашей эры. Не все права защищены... Копирование любой информации и материалов с обратной ссылкой приветствуется! Хостинг от uCoz.

    Если вам пришлись по душе материалы моего блога - подпишитесь на RSS дабы получать обновления незамедлительно! Я рад что вы читаете и комментируете мои экзерсисы, приятного времяпрепровождения.