代码之家  ›  专栏  ›  技术社区  ›  Alkanshel

更换文档.写入()在xhtml+xml页中

  •  13
  • Alkanshel  · 技术社区  · 14 年前

    我在一家公司工作,该公司编写的软件客户端站点嵌入了<script language=“JavaScript”src=。。。。。等等,等等,我们相当依赖文档.写入将元素写入页面。出于某种原因,我们的一个客户选择使用内容类型“application/xhtml+xml”,这使得文档.写入()铬不可用。

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

    但什么是一个好的解决办法,不需要所有这些垃圾?其中的write()元素太多,如果我们制作节点并像Knex或Legos或诸如此类的东西一样将它们固定在一起,那么生成的代码将非常糟糕。

    编辑:尝试使用CDATA,但即使是这一行,xhtml解析器也会在与我们的脚本嵌入相同的页面上谴责它:

    <script language="text/javascript"><![CDATA[document.write('hi');]]></script>
    
    3 回复  |  直到 14 年前
        1
  •  11
  •   stormsweeper    14 年前
    var el = document.createElement('div');
    el.innerHTML = 'What you used to document.write()';
    document.body.appendChild(el);
    

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

        2
  •  2
  •   Sean Hogan    14 年前

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

        3
  •  0
  •   Qazzian    14 年前

    我们一直在使用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,但您已经了解了总体思路。