Подтвердить что ты не робот

Основная веб-страница в стандартном режиме, iframe в режиме совместимости: любые проблемы?

У нас есть некоторый унаследованный HTML-контент, который мы должны отображать в режиме совместимости. Требование исходит от наших клиентов, которые хотят, чтобы их отчеты на основе HTML (некоторые из которых были созданы в дни IE6), чтобы выглядеть и печатать точно так же, независимо от версии браузера или базовых технологий. В то же время мы хотим использовать стандартный режим и 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 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>

Обратите внимание на разницу в рендеринге table, используя тот же CSS:


Standard and compatibility mode mix

Мой вопрос к опытным веб-разработчикам: - это поддерживаемый сценарий, который можно использовать в рабочей среде (IE8 + в основном, но иногда Safari/Chrome/Firefox)? Есть ли лучший способ сделать это?

Я наткнулся на связанный, хотя и противоположный question, который оставил меня со смешанными чувствами.

[ОБНОВЛЕНИЕ] (на основе комментариев):

Весь JavaScript находится внутри главной страницы и, похоже, работает нормально. Что интересно (и отлично!), Внутреннее представление кадра отображается в режиме совместимости, , но функции стандартного режима доступны для DOM (по крайней мере, при доступе с главной страницы). Например. document.getSelection работает (и делает перекрестные браузеры тоже).

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

MSDN говорит следующее: с режима IE9 веб-страницы не могут отображать несколько режимов документа. Например, рассмотрите веб-страницу, основанную на стандартах, которая содержит элемент фрейма, который отображает контент в режиме quirks. Режим IE9 отображает дочерний кадр в стандартном режиме (поскольку родительский документ находится в стандартном режиме). Согласно моим тестам, это неверно; мой пример работает по желанию в IE9: главная страница находится в стандартном режиме, страница фрейма находится в режиме quirk. [EDITED] Как отмечалось в комментариях, это Почти стандартный режим (т.е. не классическая причуда mode), с собственные правила рендеринга.

4b9b3361

Ответ 1

В режиме IE9 веб-страницы не могут отображать несколько режимов документа. Например, рассмотрите веб-страницу, основанную на стандартах, которая содержит фрейм который отображает содержимое в режиме quirks. Режим IE9 отображает дочерний кадр в режиме стандартов (поскольку родительский документ находится в стандартов).

По моим тестам это не правда; мой образец работает по желанию в IE9: главная страница находится в стандартном режиме, кадр страница находится в режиме quirk.

Не совсем; когда ваш образец работает по желанию, он фактически отображается в одном режиме отображения, с режимом quirks, эмулируемым для содержимого фрейма. Вы не должны заботиться об основной механике, пока полученный результат соответствует тому, что вы были после, хотя есть некоторые анекдотические свидетельства различий между эмулированными и нативными режимами (в основном, с манипуляциями js DOM).

Я бы немного больше беспокоился о о том, как IE10 + будет обрабатывать такие сценарии бахромы:

Начиная с предварительного просмотра IE11, режимы документа устарели и должны больше не используются, за исключением временных. Обязательно обновите сайты, которые полагаются на устаревшие функции и режимы документа, чтобы отразить современные стандарты.

Редактирование ниндзя: выглядит как это уже было разрешено на SO; изменяя принятое решение в соответствии с вашими потребностями, вы должны опустить Doctype и добавить <meta http-equiv="X-UA-Compatible" content="IE=5" />; X-UA-Compatibility правильно определено как msdn spec

Ответ 2

Это псевдо-ответ на ваш слегка неспецифический вопрос;

В отношении вашего опасения полагаться на эту функцию IE для "обратной совместимости", я чувствую то же самое. Microsoft предоставила этот вариант, потому что есть много компаний, которые занимают много времени, чтобы обновить свой веб-контент. Эта опция предназначена для того, чтобы позволить им иметь быстрый и грязный стоп-зазор, а не постоянное решение.

Итак, какое постоянное решение? Если это ваш вопрос, тогда ИМО это ответ; не полагайтесь на стоп-зазор и создавайте правильный вывод для отчетов.

Не зная, что представляют собой эти сообщения, невозможно правильно посоветовать вам в этой части, но вот удар в темноте:

Есть много вариантов для преобразования "HTML" в PDF. (Я помещаю HTML в цитаты, потому что каждый движок рендеринга должен требовать разные версии/стандарты HTML, и вам нужно будет знать эти предположения, прежде чем вы его выберете.) Если вы хотите, чтобы вывод, который будет отформатировать на 100% одинаковым в любом браузере, то вам нужен формат, который должен быть статичным и не изменяться; как PDF. Кроме того, у вас также есть варианты печати, о которых заботятся.