Замена document.write() s на странице xhtml + xml

Я работаю в компании, которая пишет программное обеспечение, в которое встраиваются клиентские сайты с < script language = "JavaScript" src=..... и т.д. и т.д. Мы немного зависим от document.write, чтобы писать элементы на странице. Один из наших клиентов по какой-то причине решил использовать контент-тип "application/xhtml + xml", что делает document.write() непригодным для использования в chrome.

Я понимаю, почему это так, и что DOM-совместимый код должен создавать каждый элемент, устанавливать его атрибуты, при необходимости заполнять его текстом node, прикрепить текст node к его родительскому элементу, а родительский - к некоторой странице элемент....

но какое хорошее обходное решение, которое не требует всего этого мусора? В записи() s есть так много элементов, что полученный код был бы отвратительным, если бы мы сделали узлы и скрепляли их вместе, как Knex или Legos, или что-то-вы.

edit: Пробовал использовать CDATA, но даже эта строка так же осуждается синтаксисом xhtml на той же странице, что и наш script embed:

<script language="text/javascript"><![CDATA[document.write('hi');]]></script>

Ответ 1

var el = document.createElement('div');
el.innerHTML = 'What you used to document.write()';
document.body.appendChild(el);

Обратите внимание, что вам нужно исправить HTML, чтобы быть допустимым XHTML, но это должно быть намного меньше, чем преобразование всего кода для использования DOM-манипуляций.

Ответ 2

Возможно, вы можете создать iframe типа text/html, записать в него контент и затем импортировать узлы обратно на главную страницу.

Ответ 3

Мы используем JQuery и устанавливаем таймауты для перезаписи кода, предоставленного нам аналогичными организациями. Вот пример из Search Ignite:

<script>
<!--
// once all the page has loaded
$(document).ready(function ()
    {
        // wait a bit so everything else that runs when the page has loaded loads, then...
        setTimeout(function ()
        {
            // ...load the tracking stuff
            var headerTag = document.getElementsByTagName('head')[0];
            var seo_tag = $.createElement(document.location.protocol + "//track.searchignite.com/si/CM/Tracking/ClickTracking.aspx?siclientid=123456&jscript=1", "script");
            headerTag.appendChild(seo_tag);

        }, 20);
    });
// -->
</script>

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

Очевидно, вы не сможете положиться на JQuery, но вы получите общую идею.