Будет ли iframe отображаться в режиме причуд?

Я работаю над настройкой страницы, и у меня возникают трудности с тем, чтобы она хорошо смотрелась в разных браузерах (на самом деле это просто IE, так как она правильно отображается для mozilla и webkit). Я хочу исключить режим причуд, прежде чем серьезно рассмотреть старые ошибки IE, исправленные с IE6. Страница контейнера имеет объявленный тип документа, а код iframe - нет. Будет ли содержимое iframe отображаться в режиме quirks (потому что у него нет типа документа) или в стандартном режиме (потому что у контейнера есть тип документа)? Источник следует этой схеме:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
...
<body>
...
<iframe ...>
    <html>
    <head>
    ...
    </head>
    <body>
    ....
    </body>
    </html>
</iframe>
...
</body>
</html>

3 ответа

Решение

ПУСТЬ ПОКУПАТЕЛЬ БУДЕТ БДИТЕЛЕН

Поскольку некоторые, к сожалению, не заметили, что этот ответ был опубликован и принят довольно давно, пока не появился IE9, что меняет условия вопроса. Я бы, как правило, удалил это, чтобы избежать новых отрицательных голосов, но поскольку ответ на самом деле все еще верен и, к сожалению, имеет отношение к значительной части демографии браузера, я оставлю это. Просто, пожалуйста, не отрицайте это больше.


Quirksmode: IE отображает iframes как отдельные узлы документа, doctype не наследуется, а quirks используется по умолчанию.

Редактировать: чужая демонстрация вашей проблемы и доказательство отсутствия наследства (благодаря моим закладкам:P)

Тем не менее, вы выбрали "Почти" в качестве типа документа, что означает, что фреймы в любом случае не разрешены. Единственный способ получить действительные iframes - это если родитель был в причудах, которые наследуют или не имеют значения.

Рекомендуемое чтение.

До IE9 веб-страница в iframe отображалась в соответствии со своим собственным типом документа, а не в соответствии с типом документа родительского контейнера. Однако в IE9 Microsoft изменила поведение так, чтобы дочерний iframe наследовал свой тип документа / рендеринг от родительского контейнера.

Обратите внимание, что IE9 будет по-прежнему вести себя традиционным образом (iframe учитывает свой собственный тип документа) всякий раз, когда используется представление совместимости.

Лучший обходной путь для людей в вашей ситуации - написание страницы контейнера, соответствующей стандартам, но с необходимостью включить iframe со страницей режима quirks - это добавить любой из следующих метатегов между вашим типом документа и открывающим тегом на родительской странице.

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7">
<meta http-equiv="X-UA-Compatible" content="IE=8" />

Эти теги по сути скажут IE9 притвориться, что это IE7 или IE8. В эмуляцию включена логика, используемая для определения режима рендеринга для дочернего iframe. Недостатком этого обходного пути является то, что вы не сможете использовать какие-либо новые функции, поддерживаемые IE9 на родительской странице, но это, вероятно, предпочтительнее массовых ошибок рендеринга на дочерней странице.

См. http://web.archive.org/web/20110905060718/http://www.sitepoint.com/forums/html-xhtml-52/ie9-iframes-doctypes-you-743000.html для получения дополнительной информации.

Смотрите мой ответ здесь для MSDN-документированного решения для IE9: Как заставить Iframe запускать причуды в стандартном родительском фрейме

Короче говоря, невозможно запустить режим quirks в iframe, если родительская страница отображается в режиме IE9, но можно запустить "эмуляцию режима quirks", встроенную в механизм отображения IE9.

Демонстрация JSBin: http://jsbin.com/ozejuk/1/

Дополнительная информация: http://msdn.microsoft.com/en-us/library/gg558056(v=vs.85).aspx

Другие вопросы по тегам