11

我正在设置一个页面,并且很难让它在浏览器中看起来很好(实际上只是 IE,因为它可以为 mozilla 和 webkit 正确呈现)。在认真考虑自 IE6 以来修复的旧 IE 错误之前,我想排除怪癖模式。容器页面有一个声明的文档类型,但是 iframe 代码没有。iframe 内容会以 quirks 模式(因为它没有 doctype)还是标准模式(因为容器有 doctype)呈现?来源遵循此方案:

<!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>
4

3 回答 3

23

在 IE9 之前,iframe 内的网页会根据自己的 doctype 呈现,而不是根据父容器的 doctype。但是,在 IE9 中,Microsoft 更改了行为,以便子 iframe 从父容器继承其 doctype/rendering。

请注意,只要使用兼容性视图,IE9 仍将以传统方式运行(iframe 尊重其自己的文档类型)。

在您的情况下,最好的解决方法是编写一个符合标准的容器页面,但需要包含一个带有 quirks 模式页面的 iframe - 是在您的文档类型和父页面中的开始标记之间添加以下任一元标记。

<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

于 2011-04-11T16:22:57.190 回答
15

买者自负

由于有些人遗憾地没有注意到这个答案在 IE9 存在之前很长一段时间就被发布并接受了,这改变了问题的条款。我通常会删除它以避免更多的反对意见,但由于答案实际上仍然是正确的,并且与浏览器人口统计数据的很大一部分相关,所以我会保留它。请不要再投票了。


Quirksmode:IE 将 iframe 渲染为单独的文档节点,doctype 不被继承,quirks 是默认的。

编辑:别人对您的问题的演示和非继承证明(感谢我的书签:P)

但是,您选择“几乎”作为您的文档类型,这意味着无论如何都不允许使用 iframe。获得有效 iframe 的唯一方法是父级是否存在怪癖,这会导致继承或没有争议。

推荐阅读

于 2010-09-15T13:58:09.420 回答
2

在这里查看我的答案以获得 MSDN 记录的 IE9 解决方案:如何强制 Iframe 在标准父框架下运行怪癖

简而言之,如果父页面以 IE9 模式渲染,则无法在 iframe 中触发 quirks 模式,但可以触发嵌入在 IE9 渲染引擎中的“quirks mode emulation” 。

JSBin 演示:http: //jsbin.com/ozejuk/1/

进一步阅读: http: //msdn.microsoft.com/en-us/library/gg558056 (v=vs.85).aspx

于 2013-03-22T05:47:09.073 回答