Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Короткий способ определения 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 так и не поправили.

21 комментарий
maxim-zotov (maxim-zotov.livejournal.com) 2010

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

Евгений Степанищев (bolknote.ru) 2010

Комментарий для maxim-zotov.livejournal.com:

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

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

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

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

lo 2010
  1. По поводу практического использования.
    Всего два случая: А) Использование для перенаправления на эксплоит. Б) Использование в проектах, имеющих регулярную и квалифицированную тех. поддержку. Если такой поддержи не будет, применять следует только userAgent, списывая последствия неправильного распознавания на пользователей, использующих свитчеры и/или экзотические браузеры. Господа, это, конце концов, — выражение воли этих пользователей.
  1. Гоняться за ВСЕМИ — не уважать себя. Равным образом может появиться браузер, который будет поддерживать свойства, методы, поведения, считающиеся специфическими для известных браузеров. И самое интересное, что никто еще не проверял, как работают эти хаки во всех, в т.ч. малоизвестных и малопопулярных, уже существующих браузерах! Потому что это никому не нужно. Таким образом, главный вывод: при распознавании мы всегда предполагаем ОПРЕДЕЛЕННЫЙ круг браузеров, потому что код мы проверяем в определенных браузерах, а не в браузерах, которые являются малоиспользуемыми или которые могут появиться или исчезли, но могут быть вдруг использованы (нетскейп, старые версии Opera и т. д.).
  1. На практике у вас будет не один, а много блоков, которые нужно отнести к определенному браузеру (не только 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

Евгений Степанищев (bolknote.ru) 2010

Комментарий для lo:

Если такой поддержи не будет, применять следует только userAgent, списывая последствия неправильного распознавания на пользователей, использующих свитчеры и/или экзотические браузеры

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

Отдельной строкой баги браузеров. Либо мы не поддерживаем браузер с багом (делаем graceful degradation, например), либо делаем тест, который показывает есть ли баг. Если и это нельзя сделать, то стараемся завязаться на что-то сильно специфичное для данного браузера. userAgent такой спецификой может являться.

Гоняться за ВСЕМИ — не уважать себя

Не понимаю причём тут неуважение себя. Гоняться за всеми всё равно не получится, сил не хватат. Так что рассчитывать надо, исходя из имеющихся ресурсов и предполагаемой аудитории.

На практике у вас будет не один, а много блоков, которые нужно отнести к определенному браузеру (не только IE).

На практике, у меня будет один или несколько блоков, использующих тот или иной подход. Браузеры, чаще всего, определять ни к чему.

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

Евгений Степанищев (bolknote.ru) 2010

Комментарий для lo:

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

lo 2010

Комментарий для Евгения Степанищева:

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

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

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

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

lo 2010

Комментарий для Евгения Степанищева:

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

Евгений Степанищев (bolknote.ru) 2010

Комментарий для lo:

Искренне верю, что не понимаешь. Oсобенно после этого поста: http://bolknote.ru/all/2362

Намёк не понял.

zg (zg.livejournal.com) 2010

Комментарий для Евгения Степанищева:

P.S. А вот найденную мной… особенность метода split в IE9 так и не поправили.

а что, был официальный багрепорт?

Евгений Степанищев (bolknote.ru) 2010

Комментарий для zg.livejournal.com:

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

zg (zg.livejournal.com) 2010

Комментарий для Евгения Степанищева:

Нет.

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

Евгений Степанищев (bolknote.ru) 2010

Комментарий для zg.livejournal.com:

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

zg (zg.livejournal.com) 2010

Комментарий для Евгения Степанищева:

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

Евгений Степанищев (bolknote.ru) 2010

Комментарий для zg.livejournal.com:

рапортовать или не рапортовать о баге — личное дело каждого.

Я обычно шлю баги, если знаю куда.

но во-втором случае удивляться, что не исправлено — на мой взгляд, моветон.

Я и не удивляюсь, просто надеялся, что исправили.

Евгений Степанищев (bolknote.ru) 2010

Комментарий для zg.livejournal.com:

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

Ной (sad-wind.ya.ru) 2010

Комментарий для Евгения Степанищева:

Написал об этом в комменты IEBlog’а

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

Евгений Степанищев (bolknote.ru) 2010

Комментарий для sad-wind.ya.ru:

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

Ной (sad-wind.ya.ru) 2010

Логиниться? Они издеваются?

Разве в багтрекеры других браузеров можно добавлять баги, не логинясь?

Он вообще из браузера должен отправляться и безо всякого логина.

Сейчас нету под рукой IE9. Может там такое и есть (ибо пре-альфа).

Евгений Степанищев (bolknote.ru) 2010

Комментарий для sad-wind.ya.ru:

Разве в багтрекеры других браузеров можно добавлять баги, не логинясь?

В «Опере» я могу добавить баг отображения из браузера, в «FF» логиниться не надо, в «Хроме» не пробовал.

Сейчас нету под рукой IE9. Может там такое и есть (ибо пре-альфа).

У меня есть, нет там такого.

Aleko 2011

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

Евгений Степанищев (bolknote.ru) 2011

Комментарий для Aleko:

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