Замена 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, но вы получите общую идею.