13

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

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

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

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

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

3 回答 3

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

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

于 2010-09-28T22:50:43.333 回答
2

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

于 2010-09-29T12:12:27.510 回答
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,但您大致了解。

于 2010-09-29T12:04:08.853 回答