在大型高负载项目上工作我遇到了在论坛和博客上已经描述过十亿个主题的问题,但是没有解决方案可以帮助我。这是故事。
我有横幅的HTML代码,我不知道代码是什么。有时它是纯HTML,但有时它是<script>
标记,其中包含带有<script>
标记的document.write,其中包含src以双击其中的网络。
所以我们有:脚本&gt; document.write&gt;脚本(双击)。
双击网络,你可能知道,也使用document.write,大部分时间他们都提供需要加载一个js文件的flash横幅。
毕竟我们有:脚本&gt; document.write&gt;脚本(doubleclick)&gt; document.write&gt;脚本&gt; ...
当您直接将其放在HTML中时,这很有用。页面渲染1部分,加载banner1,保持渲染页面,加载banner2,完成页面渲染。
但是现在我需要首先渲染页面,然后才能在加载横幅之后。 作为banner使用document.write我需要在window.onload事件之前加载它(注意:在window.onload document.write之后将重写整个文档。)
我做了什么:
在头部我有一个横幅对象(真正的命名空间类型很大:)),具有属性范围。
当满足页面呈现和横幅代码时,我将横幅的代码放入范围并放置<div id="bannerPlaceHolder"+id></div>
- 所以在这里我需要稍后放置横幅内容
页面呈现和</body>
标记之前我放置<script>banners.load()</script>
banners.load方法为范围数组中的每个项执行此操作:
document.write('<div id="codeHolder'+id+'">');
document.write(bannerCode);
document.write('</div>');
只有在此之后我才有window.onload()
事件执行此操作:
取所有横幅codeHolders和逐个节点将其从codeHolder的节点附加到placeHolder,因此在结果中我在渲染页面后加载了横幅,横幅位于正确的位置。
除IE之外一切都很完美,它以异步方式动态加载任何在DOM中放置的js脚本,因此doubleclick脚本中的document.write将节点附加到文档的末尾而不是我的codeHolder节点。像往常一样,它只在IE中出现。
对于可能知道解决方案的人,我将非常感激。
答案 0 :(得分:3)
你需要writeCapture.js(完全披露:我是作者。)所有的赌注都与第三方脚本有关。今天他们使用document.write
生成一些特定的HTML,但明天他们可以更改它,并且需要更新基于替换document.write
的任何简单黑客。 writeCapture会处理这个问题。您的用法如下:
$('#bannerPlaceHolder').writeCapture().html('<script type="text/javascript" src="http://doubleclick.net/bannerCode.js"></script>');
该库可以处理任何深度的脚本标记,并且可以很好地处理散布的HTML。如果你不使用jQuery,它也有一个独立的构建。
答案 1 :(得分:1)
通常使用横幅广告,您就会知道确切的尺寸和展示位置,那么如何动态创建iframe,其内容就是您在bannerCode中所拥有的内容,那就是全部。
答案 2 :(得分:0)
也许你可以使用属性innerHTML: 的document.getElementById( “X”)的innerHTML = “.................”;
或者你可以使用DOM:CreateElement和AppendChild
答案 3 :(得分:0)
将其加载到隐藏(大小为0x0)的iframe中,然后使用javascript将其移动到其他地方
答案 4 :(得分:0)
我认为iframe解决方案很难看。为什么你不能将横幅加载到一个单独的页面并将它们AJAX加载到DIV中?
答案 5 :(得分:0)
拆分document.write() - 在单独的-tags中调用,因此输出应如下所示:
文件撰写( ''); 文件撰写(bannerCode);文件撰写( '');
IE将等待document.write(bannerCode)准备就绪,并在写入结束标签时。