Короткий способ определения IE через JavaScript в IE9 не сработает

Из блога IEBlog:
var len = [1,2,3,].length; 
alert(len); //should be 3, IE8 says 4
В IE9 поправили застарелый баг — Internet Explorer добавляет ещё один элемент в массив, если в конце перечисления элементов массива есть запятая. На этом основан самый короткий способ проверки на IE через JavaScript. По стандарту последняя запятая игнорируется. IE9 теперь следует стандарту.

Не будет работать и проверка через «\v» (цитата из того же блога):
alert("\v"==="v");//IE8 said true, should be false 
alert("\v"==="\u000b"); 
    //IE8 said false, should be true
В общем, полагаться на хаки в таких проверках будет нельзя. Думаю, единственный надёжным способом будет условная компиляция:
if (/*@cc_on!@*/0) {
    // IE
}
P.S. А вот найденную мной… особенность метода split в IE9 так и не поправили.
26 июня 2010 02:05

maxim-zotov (maxim-zotov.livejournal.com)
26 июня 2010, 02:44

А использовать navigator.userAgent для определения браузера это слишком уныло для настоящих ковбоев?

bolk (bolknote.ru)
26 июня 2010, 13:08, ответ предназначен maxim-zotov (maxim-zotov.livejournal.com):

Это наполовину спорт, но для практики тоже годится. Расскажите мне как вы, используя userAgent, будете определять IE.

Сразу подскажу, что старые «Оперы» маскировались под IE (и новые умеют, просто старые это по-умолчанию делали) и их надо отфильтровывать по наличию строки «Opera». Может появиться ещё какой-то браузер, маскирующийся под IE (под FF явно какой-то плагин на эту тему есть).

«Классический» путь определения это:

var isIE = document.all && !self.opera;

lo (инкогнито)
26 июня 2010, 15:26

1. По поводу практического использования.
Всего два случая: А) Использование для перенаправления на эксплоит. Б) Использование в проектах, имеющих регулярную и квалифицированную тех. поддержку. Если такой поддержи не будет, применять следует только userAgent, списывая последствия неправильного распознавания на пользователей, использующих свитчеры и/или экзотические браузеры. Господа, это, конце концов, - выражение воли этих пользователей.

2. Гоняться за ВСЕМИ - не уважать себя. Равным образом может появиться браузер, который будет поддерживать свойства, методы, поведения, считающиеся специфическими для известных браузеров. И самое интересное, что никто еще не проверял, как работают эти хаки во всех, в т.ч. малоизвестных и малопопулярных, уже существующих браузерах! Потому что это никому не нужно. Таким образом, главный вывод: при распознавании мы всегда предполагаем ОПРЕДЕЛЕННЫЙ круг браузеров, потому что код мы проверяем в определенных браузерах, а не в браузерах, которые являются малоиспользуемыми или которые могут появиться или исчезли, но могут быть вдруг использованы (нетскейп, старые версии Opera и т.д.).

3. На практике у вас будет не один, а много блоков, которые нужно отнести к определенному браузеру (не только IE). Это означает, что вам нужно будет определить несколько браузеров, и потом пользоваться результатами распознавания. Я уже не буду приводить здесь ссылки на первоисточник, ибо уже приводил, и результат очевиден, Я постараюсь донести всё этим комментарием. Так вот, неизвестно, что мы увидим в финальной версии IE9, но на данный момент во всех последних превью версиях (Win) работают следующие неубиваемые кратчайшие способы распознавания основных браузеров:

// 1->IE, 0->FF, 2->GCrome, 3->Safari, 4->Opera, 5->Konqueror
alert( (typeof/./)[0]=='f'?+'1\0'?3:2:+'1\0'?5:1-'\0'?1:+{valueOf:function(x){return!x}}?4:0 )
// 1->IE, 0->FF, 2->GCrome, 3->Safari, 4->Opera
alert( 1-'\0'?1:+'1\0'?3:(typeof/./)[0]=='f'?2:+{valueOf:function(x){return!x}}?4:0 )

Авторы: LeverOne, sirdarckcat

bolk (bolknote.ru)
26 июня 2010, 16:03, ответ предназначен lo

Если такой поддержи не будет, применять следует только userAgent, списывая последствия неправильного распознавания на пользователей, использующих свитчеры и/или экзотические браузеры
Это в корне неверно. Проверять всё-таки надо наличие функционала, а не версию и движок браузера. Нет GeoAPI, не работаем с ним, например. Нет CANVAS, не используем. Пусть «это IE, значит нет CANVAS» неверный.

Отдельной строкой баги браузеров. Либо мы не поддерживаем браузер с багом (делаем graceful degradation, например), либо делаем тест, который показывает есть ли баг. Если и это нельзя сделать, то стараемся завязаться на что-то сильно специфичное для данного браузера. userAgent такой спецификой может являться.
Гоняться за ВСЕМИ - не уважать себя
Не понимаю причём тут неуважение себя. Гоняться за всеми всё равно не получится, сил не хватат. Так что рассчитывать надо, исходя из имеющихся ресурсов и предполагаемой аудитории.
На практике у вас будет не один, а много блоков, которые нужно отнести к определенному браузеру (не только IE).
На практике, у меня будет один или несколько блоков, использующих тот или иной подход. Браузеры, чаще всего, определять ни к чему.

Например, существует XMLHttpRequest? Используем его. Нет? Проверяем — есть ли ActiveXObject, если есть, используем его. Это правильный подход. Неправильный (повторюсь) — смотрим, если IE, используем ActiveXObject, иначе — пытаемся использовать XMLHttpRequest.

bolk (bolknote.ru)
26 июня 2010, 16:05, ответ предназначен lo

За способ распознавание браузеров спасибо, кстати! Очень забавно. Про «неубиваемые» это вы загнули, конечно. Со временем, он перестанет работать.

lo (инкогнито)
26 июня 2010, 17:27, ответ предназначен bolk (bolknote.ru):

1.// Это в корне неверно. Проверять всё-таки надо наличие функционала, а не версию и движок браузера.

В философии это называется "выход за пределы имеющегося качества". Дискутировать о том, нужно ли вообще определять браузер, Я не готов. Это долго. Я думаю, мы сходимся в том, что в некоторых практических случаях это нужно делать, иногда наряду с определением имеющегося функционала. Изначально вопрос стоял лишь в том, как лучше это делать. Ты считаешь, что document.all && !self.opera - это способ выйти из некоторых особых ситуаций, Я считаю, что про такие способы нужно либо забыть как об анахронизме и доверится userAgent`у, либо использовать более эффективные способы.

2. // Не понимаю причём тут неуважение себя.

Искренне верю, что не понимаешь. Oсобенно после этого поста: http://bolknote.ru/2009/12/28/~2362 . Меня самого немало возмущает стремление некоторых людей выдать свою мировоззренческую позицию за истинную. Поэтому оговорюсь, это моё мнение: если бы мне предложили ориентироваться при написании кода на Оперу, которая использовала свитчер, или на возможный "ещё какой-то браузер, маскирующийся под IE", или на что-то подобное, вынуждающее меня использовать этот твой "классический" путь, Я послал бы предложенца в Ж.
Ещё раз повторюсь, что просто рассматриваю предложенную тобой же во втором комментарии ситуацию, не вдаваясь в конкретные случаи, когда удобнее разок определить браузер, чем определять функционал или когда нужно и то, и другое.

lo (инкогнито)
26 июня 2010, 17:36, ответ предназначен bolk (bolknote.ru):

Под "неубиваемостью" понимается неубиваемось яваскриптом. Со временем изменится многое, если не всё.
Пожалуйста.

bolk (bolknote.ru)
26 июня 2010, 19:34, ответ предназначен lo

Искренне верю, что не понимаешь. Oсобенно после этого поста: http://bolknote.ru/2009/12/28/~2362
Намёк не понял.

zg (zg.livejournal.com)
26 июня 2010, 20:40, ответ предназначен bolk (bolknote.ru):

P.S. А вот найденную мной… особенность метода split в IE9 так и не поправили.
а что, был официальный багрепорт?

bolk (bolknote.ru)
26 июня 2010, 20:56, ответ предназначен zg (zg.livejournal.com):

Нет. Я даже не знаю куда их слать. Для меня это загадка.

zg (zg.livejournal.com)
26 июня 2010, 21:22, ответ предназначен bolk (bolknote.ru):

Нет.
в таком случае ps для меня выглядит как «разработчики моих мыслей к сожалению не читают».

bolk (bolknote.ru)
26 июня 2010, 21:28, ответ предназначен zg (zg.livejournal.com):

У меня есть надежда, что я не первый и не единственный, кто этот баг нашёл.

zg (zg.livejournal.com)
26 июня 2010, 21:54, ответ предназначен bolk (bolknote.ru):

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

bolk (bolknote.ru)
26 июня 2010, 22:44, ответ предназначен zg (zg.livejournal.com):

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

bolk (bolknote.ru)
26 июня 2010, 22:58, ответ предназначен zg (zg.livejournal.com):

Написал об этом в комменты IEBlog'а. Надеюсь, заметят.

Ной (sad-wind.ya.ru)
8 июля 2010, 17:12, ответ предназначен bolk (bolknote.ru):

Написал об этом в комменты IEBlog'а
Репортить баги нужно сюда (только надо залогиниться): https://connect.microsoft.com/IE/Feedback
Это багтрекер для всех микрософтовских бет.

bolk (bolknote.ru)
9 июля 2010, 12:00, ответ предназначен Ной (sad-wind.ya.ru):

Логиниться? Они издеваются? Они решили максимально усложнить отправку баг-репорта? Он вообще из браузера должен отправляться и безо всякого логина.

Ной (sad-wind.ya.ru)
9 июля 2010, 15:01

Логиниться? Они издеваются?
Разве в багтрекеры других браузеров можно добавлять баги, не логинясь?
Он вообще из браузера должен отправляться и безо всякого логина.
Сейчас нету под рукой IE9. Может там такое и есть (ибо пре-альфа).

bolk (bolknote.ru)
9 июля 2010, 17:13, ответ предназначен Ной (sad-wind.ya.ru):

Разве в багтрекеры других браузеров можно добавлять баги, не логинясь?
В «Опере» я могу добавить баг отображения из браузера, в «FF» логиниться не надо, в «Хроме» не пробовал.
Сейчас нету под рукой IE9. Может там такое и есть (ибо пре-альфа).
У меня есть, нет там такого.

Aleko (инкогнито)
19 мая 2011, 17:41

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

bolk (bolknote.ru)
19 мая 2011, 18:35, ответ предназначен Aleko

Ну это правда, IE9 довольно неплох.

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)