27

我们有一些必须以兼容模式呈现的遗留 HTML 内容。我们的客户希望他们的基于 HTML 的报告(其中一些是在 IE6 时代创建的)外观和打印完全相同,而不管浏览器版本或底层技术如何,我们的客户提出了这一要求。同时,我们希望在我们的 Web 应用程序的其余部分使用标准模式和 HTML5。

一个明显的解决方案是以<iframe>兼容模式托管旧内容。以下似乎适用于跨浏览器:

main.html(标准模式):

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <title></title>
    <style type="text/css">
        body {
            font-family: Arial;
            font-size: 9pt;
            font-style: italic;
            font-weight: bold;
        }
    </style>
    <script type="text/javascript">
        window.onload = function () {
            info.firstChild.data = "document.compatMode: " + document.compatMode;
            // test frame's HTML5 API: document.getSelection()
            setInterval(function () {
                var selection = document.getElementById("contentFrame").contentDocument.getSelection();
                var selectedNode = selection.focusNode;
                if (selectedNode)
                    info2.firstChild.data = "Selected node: " + selectedNode.nodeName + ", offset: " + selection.focusOffset;
                else
                    info2.firstChild.data = "";
            }, 500);

        }
    </script>
</head>
<body>
    <h1>Standard Mode Page</h1>
    <span>body font</span>
    <table border="1">
        <tr>
            <td>Table font</td>
        </tr>
    </table>
    <span>body font</span>
    <pre id="info">&nbsp;</pre>
    <pre id="info2">&nbsp;</pre>
    <iframe id="contentFrame" style="width: 500px; height: 300px;" src="frame.html"></iframe>
</body>
</html>

frame.html(在兼容模式下):

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "">
<html>
<head>
    <title></title>
    <style type="text/css">
        body {
            font-family: Arial;
            font-size: 9pt;
            font-style: italic;
            font-weight: bold;
        }
    </style>
    <script type="text/javascript">
        window.onload = function () {
            info.firstChild.data = "document.compatMode: " + document.compatMode;
            editable.focus();
        }
    </script>
</head>
<body>
    <h1>Compatibility Mode Frame</h1>
    <span>body font</span>
    <table border="1">
        <tr>
            <td>Table font</td>
        </tr>
    </table>
    <span>body font</span>
    <pre id="info">&nbsp;</pre>
    <div id="editable" contentEditable="true" style="border: 1px dotted red">
        Editable
    </div>
</body>
</html>

请注意使用相同 CSS 渲染 的区别table


标准和兼容模式混合

我对有经验的 Web 开发人员的问题:这是一个可以在生产环境中使用的受支持的场景(主要是 IE8+,但偶尔是 Safari/Chrome/Firefox)?有没有更好的方法来做到这一点?

我偶然发现了一个相关但相反的问题,这让我百感交集。

[更新](基于评论):

所有 JavaScript 都驻留在主页面中,并且看起来工作得很好。有趣的是(而且很棒!),内部框架的视图以兼容模式呈现,但其 DOM 可以使用标准模式功能(至少在从主页访问时)。例如document.getSelection可以工作(也可以跨浏览器)。

支持的场景是指 W3C HTML 和 DOM 标准的任何认可。到目前为止,我还没有找到一个明确的答案。这种行为也可能只是一个很好的副作用,尽管它跨浏览器工作的事实是有希望的。

MSDN说如下:从 IE9 模式开始,网页无法显示多种文档模式。例如,考虑一个基于标准的网页,该网页包含一个以 quirks 模式显示内容的框架元素。IE9 模式以标准模式显示子框架(因为父文档处于标准模式)。根据我的测试,这是不正确的;我的示例在 IE9 中按需要工作:主页处于标准模式,框架页面处于 quirk 模式。[编辑]正如评论中指出的,它是几乎标准模式(即,不是经典的怪癖模式),有自己的渲染规则

4

2 回答 2

8

从 IE9 模式开始,网页无法显示多种文档模式。例如,考虑一个基于标准的网页,该网页包含一个以 quirks 模式显示内容的框架元素。IE9 模式以标准模式显示子框架(因为父文档处于标准模式)。

根据我的测试,这是不正确的;我的示例在 IE9 中按需要工作:主页处于标准模式,框架页面处于 quirk 模式。

不完全的; 当您的示例按需要工作时,它实际上以单一显示模式显示,并为帧内容模拟了quirks 模式。只要结果输出与您所追求的相匹配,您就不必关心底层机制,尽管有一些轶事证据表明模拟模式和本机模式之间存在差异(主要与 js DOM 操作有关)。

我会更关心IE10+ 将如何处理这种边缘场景

从 IE11 Preview 开始,文档模式已被弃用,不应再使用,除非是临时使用。确保更新依赖旧功能和文档模式的站点以反映现代标准。

忍者编辑:看起来这已经在 SO 上解决了;根据您的需要修改接受的解决方案,您应该省略 Doctype 并添加<meta http-equiv="X-UA-Compatible" content="IE=5" />根据msdn 规范X-UA-Compatibility正确定义

于 2013-10-02T00:31:05.743 回答
2

这是对您稍微不具体的问题的伪答案;

关于您担心依赖此 IE 功能来实现“向后兼容性”,我也有同感。微软提供了这个选项,因为那里有很多公司需要很长时间来更新他们的网络内容。这个选项是为了让他们有一个快速而肮脏的权宜之计,而不是永久的解决方案。

那么,永久的解决方案是什么?如果这是您的问题,那么 IMO 这就是答案;不要依赖权宜之计并为报告制定正确的输出。

在不知道这些报告是什么的情况下,不可能在这方面为您提供适当的建议,但这是在黑暗中刺伤:

有很多选项可以将“HTML”转换为 PDF。(我将 HTML 放在引号中,因为每个渲染引擎都必然需要不同的 HTML 版本/标准,您需要在选择一个之前了解这些假设。)如果您想要在任何浏览器上格式 100% 相同的输出,那么您需要一种静态且不会更改的格式;像PDF。此外,您还可以处理打印选项。

于 2013-09-30T15:26:23.947 回答