我在一家公司工作,该公司编写了客户网站嵌入的软件< 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>
答案 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,但你会得到一般的想法。