Короткий способ определения 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 так и не поправили.
А использовать navigator.userAgent для определения браузера это слишком уныло для настоящих ковбоев?
Комментарий для maxim-zotov.livejournal.com:
Это наполовину спорт, но для практики тоже годится. Расскажите мне как вы, используя userAgent, будете определять IE.
Сразу подскажу, что старые «Оперы» маскировались под IE (и новые умеют, просто старые это по-умолчанию делали) и их надо отфильтровывать по наличию строки «Opera». Может появиться ещё какой-то браузер, маскирующийся под IE (под FF явно какой-то плагин на эту тему есть).
«Классический» путь определения это:
var isIE = document.all && !self.opera;
Всего два случая: А) Использование для перенаправления на эксплоит. Б) Использование в проектах, имеющих регулярную и квалифицированную тех. поддержку. Если такой поддержи не будет, применять следует только userAgent, списывая последствия неправильного распознавания на пользователей, использующих свитчеры и/или экзотические браузеры. Господа, это, конце концов, — выражение воли этих пользователей.
// 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
Комментарий для lo:
Это в корне неверно. Проверять всё-таки надо наличие функционала, а не версию и движок браузера. Нет GeoAPI, не работаем с ним, например. Нет CANVAS, не используем. Пусть «это IE, значит нет CANVAS» неверный.
Отдельной строкой баги браузеров. Либо мы не поддерживаем браузер с багом (делаем graceful degradation, например), либо делаем тест, который показывает есть ли баг. Если и это нельзя сделать, то стараемся завязаться на что-то сильно специфичное для данного браузера. userAgent такой спецификой может являться.
Не понимаю причём тут неуважение себя. Гоняться за всеми всё равно не получится, сил не хватат. Так что рассчитывать надо, исходя из имеющихся ресурсов и предполагаемой аудитории.
На практике, у меня будет один или несколько блоков, использующих тот или иной подход. Браузеры, чаще всего, определять ни к чему.
Например, существует XMLHttpRequest? Используем его. Нет? Проверяем — есть ли ActiveXObject, если есть, используем его. Это правильный подход. Неправильный (повторюсь) — смотрим, если IE, используем ActiveXObject, иначе — пытаемся использовать XMLHttpRequest.
Комментарий для lo:
За способ распознавание браузеров спасибо, кстати! Очень забавно. Про «неубиваемые» это вы загнули, конечно. Со временем, он перестанет работать.
Комментарий для Евгения Степанищева:
1.// Это в корне неверно. Проверять всё-таки надо наличие функционала, а не версию и движок браузера.
В философии это называется «выход за пределы имеющегося качества». Дискутировать о том, нужно ли вообще определять браузер, Я не готов. Это долго. Я думаю, мы сходимся в том, что в некоторых практических случаях это нужно делать, иногда наряду с определением имеющегося функционала. Изначально вопрос стоял лишь в том, как лучше это делать. Ты считаешь, что document.all && !self.opera — это способ выйти из некоторых особых ситуаций, Я считаю, что про такие способы нужно либо забыть как об анахронизме и доверится userAgent`у, либо использовать более эффективные способы.
Искренне верю, что не понимаешь. Oсобенно после этого поста: http://bolknote.ru/all/2362 . Меня самого немало возмущает стремление некоторых людей выдать свою мировоззренческую позицию за истинную. Поэтому оговорюсь, это моё мнение: если бы мне предложили ориентироваться при написании кода на Оперу, которая использовала свитчер, или на возможный «ещё какой-то браузер, маскирующийся под IE», или на что-то подобное, вынуждающее меня использовать этот твой «классический» путь, Я послал бы предложенца в Ж.
Ещё раз повторюсь, что просто рассматриваю предложенную тобой же во втором комментарии ситуацию, не вдаваясь в конкретные случаи, когда удобнее разок определить браузер, чем определять функционал или когда нужно и то, и другое.
Комментарий для Евгения Степанищева:
Под «неубиваемостью» понимается неубиваемось яваскриптом. Со временем изменится многое, если не всё.
Пожалуйста.
Комментарий для lo:
Намёк не понял.
Комментарий для Евгения Степанищева:
а что, был официальный багрепорт?
Комментарий для zg.livejournal.com:
Нет. Я даже не знаю куда их слать. Для меня это загадка.
Комментарий для Евгения Степанищева:
в таком случае ps для меня выглядит как «разработчики моих мыслей к сожалению не читают».
Комментарий для zg.livejournal.com:
У меня есть надежда, что я не первый и не единственный, кто этот баг нашёл.
Комментарий для Евгения Степанищева:
все остальные по видимому тоже посчитали, что кто-то за них донесёт информацию о баге до разработчика. в итоге баг не исправлен.
рапортовать или не рапортовать о баге — личное дело каждого. но во-втором случае удивляться, что не исправлено — на мой взгляд, моветон.
Комментарий для zg.livejournal.com:
Я обычно шлю баги, если знаю куда.
Я и не удивляюсь, просто надеялся, что исправили.
Комментарий для zg.livejournal.com:
Написал об этом в комменты IEBlog’а. Надеюсь, заметят.
Комментарий для Евгения Степанищева:
Репортить баги нужно сюда (только надо залогиниться): https://connect.microsoft.com/IE/Feedback
Это багтрекер для всех микрософтовских бет.
Комментарий для sad-wind.ya.ru:
Логиниться? Они издеваются? Они решили максимально усложнить отправку баг-репорта? Он вообще из браузера должен отправляться и безо всякого логина.
Разве в багтрекеры других браузеров можно добавлять баги, не логинясь?
Сейчас нету под рукой IE9. Может там такое и есть (ибо пре-альфа).
Комментарий для sad-wind.ya.ru:
В «Опере» я могу добавить баг отображения из браузера, в «FF» логиниться не надо, в «Хроме» не пробовал.
У меня есть, нет там такого.
А я по прежнему использую свой хак в своих скриптах. IE9 настолько изменился что для него хак не требуется, поэтому всё продолжает отлично работать.
Комментарий для Aleko:
Ну это правда, IE9 довольно неплох.