Совместимость сайтов с IE8
Tony Ross, 20 марта 2009
В блоге команды Internet Explorer недавно опубликован список основных проблем совместимости существующих сайтов с IE8.
Разница между IE8 в режиме совместимости и IE7
Кросс-документные связи
Отключены хаки, которые использовались для кросс-доменных и кросс-документных связей.
РЕШЕНИЕ: Используйте Cross Document Messaging (XDM).
Расширение объекта события
В IE8 у объекта события есть свойства, связанные с новыми возможностями, например, source для Cross Document Messaging (XDM), некоторые из них доступны и в режиме совместимости, это может привести к конфликту с пользовательскими свойствами объекта события.
event.source = myObject; // Только для чтения IE8
РЕШЕНИЕ: Измените имя конфликтующего свойства.
event.mySource = myObject;
Порядок атрибутов
Порядок атрибутов в коллекции атрибутов и свойствах innerHTML и outerHTML изменен.
attr = elm.attributes[1]; // может отличаться в IE8
РЕШЕНИЕ: Ссылайтесь на атрибуты по имени.
attr = elm.attributes["id"];
Присваивание не поддерживаемых значений CSS свойств
Присваивание значений не поддерживающихся в IE7, но поддерживающихся в стандартном режиме IE8 не приводит к исключению в режиме совместимости. Некоторые сайты используют эти исключения, чтобы определить поддерживается ли соответствующее значение CSS свойства или нет.
try {
elm.style.display = "table-cell";
} catch(e) {
// выполняется в IE7, но не в IE8,
// независимо от режима
}
РЕШЕНИЕ: У этой проблемы нет простого решения (за исключением определения версии браузера). Лучшее что можно сделать это обновить страницу для работы в стандартном режиме IE8.
Разница между стандартным режимом и режимом совместимости IE8
Большинство проблем связано с отсутствием старых ошибок в стандартном режиме IE8. Обновление сайта для работы в стандартном режиме IE8 лучшее решение в долгосрочной перспективе, но если нужно быстрое решение проблем то можно использовать режим совместимости.
В стандартном режиме кроме вышеупомянутых проблем, можно столкнуться со следующими:
Определение версии браузера
Неверное определение версии браузера часто приводит некорректной работе страницы. Особенно это касается условных комментариев, на многих страницах они используются для исправления ошибок, которых больше нет в IE8.
<!--[if IE]>
<link rel="stylesheet" type="text/css" src="ie.css" />
<![endif]-->
РЕШЕНИЕ: Обновите части кода зависящие от версии браузера. По возможности, используйте проверку наличия объектов.
<!--[if lte IE 7]>
<link rel="stylesheet" type="text/css" src="ie.css" />
<![endif]-->
Проверка наличия объектов
Проверка наличия объектов отлично работает, если пользоваться ей корректно, но некоторые страницы предполагают наличие одних объектов исходя из наличия других, что приводит к ошибкам, т.к. объекты могут поддерживаться независимо.
if(window.postMessage) {
window.addEventListener("load", myHandler, false);
}
РЕШЕНИЕ: Проверяйте наличие непосредственно используемого объекта.
if(window.addEventListener) {
window.addEventListener("load", myHandler, false);
}
Ошибки в HTML
Коррекция ошибок в стандартном режиме IE8 отличается от коррекции ошибок в IE7.
<ul>
<li>1.1
<ul>
<li>1.1.1</li>
</li>
<!-- Закрывает 1.1 в IE8, но не в IE7 -->
<li>1.1.2</li>
</ul>
</li>
</ul>
РЕШЕНИЕ: Разметка не должна содержать ошибок.
<ul>
<li>1.1
<ul>
<li>1.1.1</li>
<!-- </li> -->
<li>1.1.2</li>
</ul>
</li>
</ul>
Работа с классом элемента
В IE7, для работы с классом элемента использовалось имя атрибута className. В стандартном режиме IE8 это исправлено. Использование старого имени создаст атрибут className и никак не повлияет на класс элемента.
return elm.getAttribute("className");
РЕШЕНИЕ: Используйте стандартное имя class.
return elm.getAttribute("class");
GetElementById
Метод getElementById теперь чувствителен к регистру и не ищет по атрибуту name.
<div id="Test"></div>
<script type="text/javascript">
// Из за разницы в регистре элемент не найден
var test = document.getElementById("test")
</script>
РЕШЕНИЕ: Следите за регистром и используйте getElementsByName для поиска по атрибуту name.
<div id="Test"></div>
<script type="text/javascript">
// Элемент Test найден
var test = document.getElementById("Test")
</script>
Generic CSS Prefix Selectors
Не поддерживаются в стандартном режиме IE8. В первую очередь это коснется страниц использующих VML. Использование такого селектора в скрипте приведет к ошибке, а в CSS к неверному отображению страницы.
v:* {
behavior: url(#default#VML);
}
РЕШЕНИЕ: Перечислите все нужные теги.
v:polyline, v:line {
behavior: url(#default#VML);
}
CSS Expressions
IE8 не поддерживает CSS Expressions в стандартном режиме.
/* CSS */
#main {
background-color:
expression((new Date()).getHours()%2 ? "#000" : "#fff");
}
РЕШЕНИЕ: Используйте улучшенную поддержку CSS или JavaScript.
/* Script */
var elm = document.getElementById("main");
if((new Date()).getHours()%2) {
elm.style.backgroundColor = "#000";
} else {
elm.style.backgroundColor = "#fff";
}
Нативный JSON
IE8 нативно поддерживает JSON, совместимый с ES3.1 Proposal Working Draft...
Некоторые страницы определяют наличине нативного JSON, и используют его нестандартным образом.
if(!window.JSON) {
JSON = myJSON;
}
JSON.encode(obj); // Не соответствует стандарту
РЕШЕНИЕ: Модифицируйте код, чтобы он соответствовал стандартам, или не используйте нативный JSON.
JSON = myJSON;
JSON.encode(obj);
Начальные значения CSS свойств
Не установленные свойства объекта currentStyle теперь возвращают их значения по умолчанию.
Это основная причина проблем с контролом меню в ASP.NET.
var zIndex = elm.currentStyle.zIndex;
if(zIndex == 0) {
// код
}
РЕШЕНИЕ: Проверяйте и старое, и новое (соответветствующее стандартам) значение по умолчанию.
var zIndex = elm.currentStyle.zIndex;
if(zIndex == 0 || zIndex == "auto") {
// код
}
Не установленные значения CSS свойств
Не установленные свойства объекта style теперь возврящают пустую строку (в соответствии со стандартом).
var zIndex = elm.style.zIndex;
if(zIndex === 0) {
// код
}
РЕШЕНИЕ: Проверяйте и старое значение, и пустую строку.
var zIndex = elm.style.zIndex;
if(zIndex === 0 || zIndex === "") {
// код
}
Коллекция атрибутов
Коллекция атрибутов теперь содержит только те атрибуты которые явно установлены, а не все атрибуты распознаваемые IE.
var attr = elm.attributes["checked"];
// Потенциальная ошибка в IE8
return attr.specified;
РЕШЕНИЕ: Проверяйте наличие атрибута в коллекции.
var attr = elm.attributes["checked"];
if(attr) {
return attr.specified;
} else {
return false;
}

Выводы: в ИЕ8 опять всё через ж....
:(((
отличная статья
спасибо
у меня вопрос: раньше в IE7 и IE6 в CSS можно было использовать хаки типа
_width:(работает для IE6 и ниже)
//width (работает для IE7 и ниже)
как быть с IE8 в таком случае?
На основании какого пункта сделаны такие выводы?
Условные комментарии никто не отменял.
На первый взгляд все не так и страшно, но как показывает практика, это только на первый взгляд...
А это тогда как, я что-то не понял:
Дополните пожалуйста статью описанием появившейся возможности создавать getter'ы и setter'ы с помощью метода defineProperty встроенного объекта Object, а то наверное так и останентся это полезная штука неизвестной :-) Посмотреть, как применяется можно в этой статье.
Очень полезно. Правда большую часть из измененившегося я просто не использую.
Sergei, что там непонятного, проблема не в самих услоных комментариях, а в том как они используются.
Octane, спасибо, я как раз пропустил это нововведение. Но это для статьи о нововведениях, а не о совместимости со старым. Посмотрю набереться ли материала на статью, да так, чтоб не сильно боянисто вышло.
Забавные все таки люди )
Были IE7-6-5 плохими — все ругались, что IE плохой. Только мелкомягкие попытались сделать нормальный браузер удовлетворяющий CSS2 и проходящий ACID2 тест, отказались от проприетарных свойств типа CSS Expressions, и вообще пошли по пути следованию стандартов, а не изобретению стандартов от Microsoft — так они снова плохие )
Присоединюсь к Евгению — совершенно необоснованный вывод.
Автору больше спасибо за столь подробное описание и что самое главное за «мини поварскую книгу» к IE8.
Больше всего нервничаю не за свой код — с ним можно разобраться, а за код различных применяемых CSS и в особенности JS фреймворков. Надеюсь на jQuery и его UI особенности IE8 не скажутся — но тщательное тестирование все равно придется проводить (
ИЕ8 даже бетка 2я вот уже месяца 3 радует меня. (до последней не обновился пока что).
пишу под него,обычный css, javascript и все окей =).
под 7ку отдельный стиль нужен был конечно немножко.
так что кто пользовался комментами,а не хаками,думаю проблем не испытывает.
Миркус, IE8 меня так же радует, но в плане вёрстки под неё сайтов - это вообще беда, лично для меня. Так же рад найти ваш блог, есть что почитать, так же хотелось узнать обмениваетесь ли вы постовыми?
глянув ваш блог, посоветовал бы Вам Пузатый,следовать стандартам заявленным в доктайпе.
что бы свести проблемы с ие8 к минимуму.
> РЕШЕНИЕ: Разметка не должна содержать ошибок.
Понравилось. Давно бы так :-)
кстати, после обновления до IE8, stanalone и portable версии предыдущих версий IE перестали корректно работать, особенно ИЕ6. формы неактивны, скрипты не подключаются. -(
кто-нибудь поборол эту проблему?
IETester работает нормально
http://www.my-debugbar.com/wiki/IETester/HomePage
Для примера со списком в IE7 (и ниже) "коррекция ошибок" совсем забавная: они тупо игнорируют закрывающие </li> (и, похоже, вообще все опциональные закрывающие теги:).
IE8 хоть чем-то радует... Даже дебаггер можно юзать!
IE потихоньку догоняет FireFox.
Вы че народ, с дубу рухнули. Что он догоняет. Ламы не догоняют. Вот сколько у вас проектов? У меня много и до IE8 не было проблем ни в одном браузере IE8 все похерил естественно, хотя на сайте msn все в радужных цветах, Chrome, Safari, Opera и прочее куда лучше и нормальный переход - это когда старый код править не надо, подумайте сколько миллионов сайтов надо править из-за долб....в в microsoft. Запустите http://acid3.acidtests.org/. Работает все только в режиме совместимости который надо включать пользователю - идиотизм!
Слишком уж эмоционально, пример хотя бы кинули в котором IE8 все сломал, чтобы было о чем говорить.
Не всегда это возможно, многое зависит от того как был написан этот старый код.
С тем, что прочее лучше я спорить не буду, но тоже не без греха, например, Опера проходит acid3, тогда почему у нее проблемы с элементарным сочетанием float:left и overflow:hidden
Выбор не богатый: или править, или IE должен оставаться нестандартным браузером.
Скажем не эмоционально, я пока на него не ориентируюсь. Могу сказать только, что всем известный jQuery и плагины к нему не радужно восприняли IE8, хотя все браузеры опять же кушали на ура. И это нормально когда IE всегда выделялась своим идиотизмом. Я не думаю, что народ вот так кинется переписывать плагины сразу под IE. А по поводу нормальности
разработчики IE вообще сидят в луже постоянно и вижжят мол они самые. Они кичатся мол мы FireBug переплюнем - недоросли, пока плевали уже FireBug ушел вперед. А по поводу "сделали" - парсер бы лучше с нуля переписали, а не уткнувшись в спецификации CSS2 перенесли и добавили глюков в него. Ну, по безопасности вообще отдельный и плачевный разговор. Кстати обновления безопасности иль чего там у них планируются раз в 2-ва месяца, просто сказка для такого безупречного продукта. Но это еще пол беды, поставил себе я это stable - результат системная ошибка при загрузке, может хоть в сборке ZVER небудет это чудо выеживаться. Еще факт Jquery в режиме совместимости видит эту пародию как IE6.
P.S. Если бы Microsoft не встроил это убожество в ядро и тем самым нагло пропихивая ламам - от него давно бы уже отказались, что и видно по тенденциям перехода людей на сторонние браузеры.
взгляд на 8-ку как на уже свершившееся, то что в нем по сравнению старыми версиями стала намного интереснее поддержка CSS и прочего мне кажется беспорным, но я будь моя воля поотрывал бы руки тем кто занимался реализацией этой поддержки, утечки памяти, нередко виснет, выполняет очень долго JS код, например построение большой таблицы из данных сервера в десятки раз дольше FF или Safari, конкретный пример 2сек и 4сек против 135сек которые потребовались ослику, память при этом расходует лучше всех и плохо освобождает... в общем растраивают меня темпы и полнота улучшений в ослике...
PS. чуть не забыл, вообщето меня сюда занесло из поисковика по поводу этого
v:polyline, v:line {
behavior: url(#default#VML);
}
только у меня так не работает работает так - v\:polyline, v\:line
Не забыли <html xmlns:v="urn:schemas-microsoft-com:vml">
Для упрощения можно использовать класс.
.vml {
behavior: url(#default#VML);
}
Пример vml
да спасибо, не забыл, попробую запомнить и этот вариант, но кстати для того что бы он заработал мне пришлось добавить сайт в "надежные узлы" без этого вместо примера была чистая страница. Еще раз спасибо за подсказку, буду к вам еще заходить :-)