Самое короткое определение IE
Изучая листинги ошибок и несоответствий браузеров Internet Explorer, я наткнулся на один интересный баг, который позволил написать самый короткий из известных мне способов определения этого браузера на javascript. До сих пор самым коротким из существующих способов считалось выражение, предложенное Дином Эдвардсом в своем блоге.
Я предлагаю ещё более короткий вариант (на 3 символа короче чем самый короткий вариант из блога Эдвардса - 6 символов). Переменная возвращает true в internet explorer и false во всех остальных браузерах.
Code
<script type='text/javascript'>
var ie = !-[1,];
alert(ie);
</script>
var ie = !-[1,];
alert(ie);
</script>
Этот вариант не зависит от режима отображения страниц в браузере. Так же он протестирован во всех версиях IE и в других распространенных браузерах. Основывается на баге, признанном Microsoft достаточно давно, но так и не исправленном.
Ie detection in 5 bytes!вернет 1 во всех нормальных браузерах (По стандарту ECMAscript, одна запятая в конце массива игнорируется - это сделано для удобства записи в столбик, автогенерации и прочего), ie же вернет 2. Это же произойдет и при распечатывании массива: ie вернет '1,' так как он видит 2 элемента и следовательно разделяет их запятой а все остальные браузеры вернут '1'. Это легко проверить вот этим кодом поочередно выполнив его сначала, к примеру, в FF а потом в IE:
Вот несколько других кратчайших методов определения IE.
Code
<script type='text/javascript'>
// Вариант от Дина Эдвардса:
var ie = /*@cc_on!@*/false;
// Использования закомментированной строки:
var ie//@cc_on=1;
// Вариация (более короткая переменная):
var ie = '\v'=='v';
// Вариант от Гарета Хэйеса (бывший рекордсмен):
var ie = !+"\v1";
</script>
// Вариант от Дина Эдвардса:
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>
notIe = -[1,];
/* в таком случае становится
доступным написание вида */
if(-[1,]){
// код для нормальных браузеров
}else{
// код для IE
}
</script>
Как это работает?
Мой способ определения IE основан на документированной ошибке. Ошибка заключается в том что Internet Explorer прибавляет пустой элемент массива к общему числу элементов. То естьCode
[1,].length
Code
<script type='text/javascript'>
alert([,]==',');
// это кстати 8-символьная проверка на IE =)
</script>
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
http://leeiio.me/ie_detection_in_5_bytes/
или ещё вот
http://snandy.javaeye.com/blog/603712
[sayto]var IE = ''.replace('','$$')>'$'[/sayto],
http://twitter.com/WebReflection/status/7515524075
Мой способ легко преобразовать в булеву добавлением восклицательного знака, а вот ваш - никак, так как у вас уже выражение а не один элемент - придется либо окружать скобками, либо делать это позднее.
Вот ещё пример пятисимвольника возвращающего булевные значения:
[,]<1
Шестисимвольный вариант возвращающий true в IE и false в других браузерах.
шестисимвольный вариант, возвращающий 1 в IE и 0 в других браузерах.
Где-же "Гиннес"? :D
А так, занятно...
SinuS