Pull to refresh

Internet Explorer 11: “Не называй меня IE”

Перевод статьи Nicholas C. Zakas — Internet Explorer 11: “Don’t call me IE”

Предисловие

Недавно, Microsoft официально представила предварительную версию Internet Explorer 11 для Windows 8.1. Это положило конец волне слухов основывавшихся на версиях-утечках столь оклеветанного веб-браузера. Сейчас мы знаем некоторые очень важные детали об Internet Explorer 11, включая поддержку WebGL, предварительной обработки (prefetch), пререндеринга (prerendering), flexbox, наблюдателей за изменениями (mutation observers) и других веб стандартов. Возможно еще более интересно чего все-таки нет в Internet Explorer 11.

Впервые за долгое время, Microsoft действительно удалила особенности (features) из Internet Explorer. Строка user-agent также была изменена. Это выглядит так будто Microsoft ушла со своего пути, чтобы обеспечить для всех существующих веток кода isIE(), на клиенте или сервере, значение false для Internet Explorer 11. Хорошее в этих изменениях, что Internet Explorer 11 наконец-то поддерживает достаточно веб стандартов, так что существующее поведение, специфичное для IE, больше не нужно.

Изменения User-agent

Строка user-agent для IE11 короче, чем предыдущие версии и содержит некоторые интересные изменения:
Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko

Сравним это со строкой user-agent IE10 (на Win7):
Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)

Самая заметная разница это удаление токена MSIE, который был частью строки user-agent IE с самого начала. Также заметно добавление в конце строки “like Gecko”. Это значит, что IE предпочитает быть идентифицированным как Gecko-type браузер, если он не определится как есть. Сафари был первым браузером добавившим “like Gecko”, так что любой кто анализирует (sniffing) “Gecko” в строке user-agent будет пропускать браузер.

Любой анализирующий (sniffing) код, который ищет “MSIE” сейчас не будет работать с новой строкой user-agent. Вы можете продолжать искать “Trident” для определения IE (токен “Trident” был введен вместе с IE9). Истинная версия IE сейчас идет с токеном “rv”
Дополнительно есть изменения в объекте navigator , которые также скрывает, какой браузер используется:
  • navigator.productсейчас установлен “Gecko”

Это может показаться подлой попыткой обмануть разработчиков, но это поведение на самом деле указано в спецификации HTML5. Свойство navigator.appName  должно быть либо “Netscape”, либо что-то более специфичное. Странные рекомендации, но IE11 следует им.
Побочный эффект этих изменений объекта navigator заключается в том, что определение браузера с использованием JavaScript может в конечном итоге использовать это, и будет идентифицировать IE, как браузер, основанный на Gecko.

document.all и друзья

Начиная с IE4, document.all был вездесущей силой в IE. Смотря на прежнюю реализацию <source lang=«javascript>document.getElementById(), document.all  был «путем IE» получения ссылки на элемент. Несмотря на поддержку DOM в IE5, document.all поддерживался в IE вплоть до версии 10. В IE11, этот пережиток прошлого был сделан несуществующим, что значит весь код основывавшийся на наличии document.all не будет работать в IE11 даже если код, который действительно использует document.all будет работать.
Другой пережиток это метод attachEvent() для добавления обработчиков событий. Этот метод, также как и метод detachEvent(), был удален из IE11. Удаление этих методов приводит к использованию обходного пути, как этот:


function addEvent(element, type, handler) {
    if (element.attachEvent) {
        element.attachEvent("on" + type, handler);
    } else if (element.addEventListener) {
        element.addEventListener(type, handler, false);
    }
}

Конечно, рекомендуется, чтобы вы всегда сначала тестировали версию основанную на стандартах, в случае чего удаление attachEvent() не приведет к другому поведению. Однако, интернет замусорен логикой обнаружения нестандартных особенностей, и удаление attachEvent() обеспечивает, что любой код написанный в предложенной манере будет использовать стандартную версию вместо специфичной для IE.
Некоторые другие особенности, которые были удалены:
  • window.execScript() – Собственная версия IE  eval()
  • window.doScroll() – прокрутка окна
  • script.onreadystatechange – скрипт был загружен
  • script.readyState – проверка статуса загрузки скрипта
  • document.selection – получение выделенного текста
  • document.createStyleSheet – создание таблиц стилей
  • style.styleSheet – указание ссылки на таблицу стилей объекта style

Все это имеет основанные на стандартах аналоги, которые должны использоваться вместо старых способов IE. Как и с удалением других особенностей, удаление этих означает что кроссбраузерный код, который выполняет определение особенностей, основанных на стандартах, должен продолжать работать без изменений.

Заключение

Это выглядит так, что IE11 может быть лучшим Internet Explorer еще долгое время. Наконец-то удалены доказательства прошлых ошибок. Сегодня Microsoft готова занять место среди браузеров основанных на стандартах. Удаление старых особенностей и регулирование строки user-agent так, что новый браузер не будет определяться как IE, достаточно уникальное изменение для обеспечения работоспособности сайтов, которые работают сегодня. Если веб-приложение использует определение особенностей вместо анализа браузера, тогда код должен работать с IE11. Для серверов которые анализируют строку user-agent, пользователи должны продолжать получать полнофункциональный сайт, благодаря прекрасной поддержке стандартов IE11.
Будущее без специфичных веток кода для IE близок, и я один из тех кто счастлив встретить его.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.
Change theme settings