在xhtml + xml页面中替换document.write()

时间:2010-09-01 00:47:45

标签: javascript xhtml google-chrome document.write

我在一家公司工作,该公司编写了客户网站嵌入的软件< script language =“JavaScript”src = ..... etc. etc。我们非常依赖document.write将元素写入页面。由于某种原因,我们的一个客户选择使用内容类型“application / xhtml + xml”,这使得document.write()在chrome中无法使用。

我明白为什么会这样,并且符合DOM的代码应该创建每个元素,设置其属性,如果需要填充文本节点,将文本节点附加到其父节点,将父节点附加到某个页面元素...

但是什么是一个好的解决方法,不需要所有这些垃圾?其中的write()有很多元素,如果我们制作节点并将它们固定在一起,如Knex或Legos或者你有什么,那么生成的代码将是可怕的。

编辑:尝试使用CDATA,但即使这行也被我们的脚本嵌入在同一页面上的xhtml解析器类似地谴责:

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

3 个答案:

答案 0 :(得分:11)

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

请注意,您需要将HTML修复为有效的XHTML,但这比将所有代码转换为使用DOM操作要少得多。

答案 1 :(得分:2)

也许您可以创建text/html类型的iframe,将内容写入其中,然后将节点导回主页面。

答案 2 :(得分:0)

我们一直在使用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,但你会得到一般的想法。