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

      Изучая листинги ошибок и несоответствий браузеров 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 на весь экран.

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

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

№36
[sayto]Анонимус[/sayto], латиница (точнее, символы с кодами до 127) действительно занимает 1 байт/символ. Можешь проверить, сохранив чисто английский текст в двух кодировках и сравнив размер.

А распознаёт благодаря свойству префиксности. Читаем вот тут:
http://ru.wikipedia.org/wiki/UTF-8

№35
ЖЫВОТНЕ ЧОЧО УПЯЧКА, лолщито? Его код можно закодировать одним байтом, но он занимает не один байт.
Как интерпретатор распознает, является ли текущий байт продолжением предыдущего или дискретным? Включите голову!
№34
[sayto]Аноним[/sayto], в юникоде латинский символ занимает 1 байт
№33
[sayto]Aleko[/sayto], теперь испанцы ;)
№32
В эру юникода пора бы уже символы двумя байтами кодировать.
№31
Хех. Andrea Giammarchi таки признал мой вариант:
http://twitter.com/WebReflection/status/7515524075
№30
[sayto]i17, pochemuby.net[/sayto], да, вы правы, пятисимвольных похоже маловато, хотя безусловно есть ещё, в прошлом комментарии я перепутал с шестисимвольными. Виноват. Но в вашем способе есть один очень существенный минус, который и делает мой способ лучше.

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

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

[,]<1

Введите ваше имя или станьте Анонимусом:
Вы не робот? Вводите код капчи:
    © Блог StudioAD.ru 2010 год нашей эры. Не все права защищены... Копирование любой информации и материалов с обратной ссылкой приветствуется! Хостинг от uCoz.

    Если вам пришлись по душе материалы моего блога - подпишитесь на RSS дабы получать обновления незамедлительно! Я рад что вы читаете и комментируете мои экзерсисы, приятного времяпрепровождения.
Таможенные курсы, курсы менеджера вэд. Курсы специалиста по вэд.
Обучение парикмахерское дело. Все об обучении парикмахерского дела.
1 2 3 4 »