9

在从事大型、高负载的项目时,我遇到了论坛和博客上已经在数十亿个主题中描述的问题,但没有解决方案对我的情况有帮助。这是故事。

我有横幅的HTML代码,我不知道代码是什么。有时它是纯 HTML,但有时它是<script>带有 document.write的<script>标签,其中带有 src 的标签,可以在其中双击网络。

所以我们有:脚本 > document.write > 脚本(双击)。

双击网络,您可能知道,也使用 document.write 并且大多数时候他们提供需要加载更多 js 文件的 flash 横幅。

所以毕竟我们有: script > document.write > script(doubleclick) > document.write > script > ...

当您直接将它放在 HTML 中时,这很有效。页面渲染1部分,加载banner1,继续渲染页面,加载banner2,完成页面渲染。

但是现在我需要先渲染页面,并且只有在加载横幅之后。作为横幅使用 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 脚本,因此双击脚本中的 document.write 会将节点附加到文档的末尾,而不是在我的 codeHolder 节点中。像往常一样,它只在 IE 中。

我将非常感谢任何可能知道解决方案的人。

4

6 回答 6

3

您需要writeCapture.js(完全披露:我是作者。)所有赌注都与 3rd 方脚本无关。今天他们document.write用来生成一些特定的 HTML,但明天他们可以改变它,任何基于替换的简单黑客document.write都需要更新。writeCapture 负责处理。您的用法将类似于:

$('#bannerPlaceHolder').writeCapture().html('<script type="text/javascript" src="http://doubleclick.net/bannerCode.js"></script>');

该库可以处理任意深度的脚本标签,并且可以很好地处理穿插的 HTML。如果你不使用 jQuery,它也有一个独立的构建。

于 2009-12-29T16:36:11.800 回答
1

通常使用横幅,您会知道确切的尺寸和位置,那么如何动态创建一个 iframe,其内容就是您在 bannerCode 中拥有的内容,仅此而已。

于 2008-12-12T16:55:12.670 回答
0

将其加载到隐藏的(大小 0x0)iframe 中,然后使用 javascript 将其移动到其他位置

于 2009-02-17T11:16:11.937 回答
0

也许您可以使用属性 innerHTML: document.getElementById("x").innerHTML="..................";

或者你可以使用 DOM:CreateElement 和 AppendChild

于 2008-11-24T21:37:03.273 回答
0

我认为 iframe 解决方案很丑陋。为什么不能将横幅加载到单独的页面中并将它们 AJAX 加载到 DIV 中?

于 2009-04-22T13:54:03.707 回答
0

将 document.write() 调用拆分为单独的标签,因此输出应如下所示:

document.write(''); document.write(bannerCode);

document.write('');

IE 将等待 document.write(bannerCode) 准备好以及何时写入结束标签。

于 2009-09-23T13:26:40.100 回答