2014-01-15 94 views
1

我需要覆盖document.write,以便呈现从Google的doubleclick中包装该功能的广告。由于标准document.write完全取代了页面内容,因此我将其覆盖,将广告的内容附加到现有元素。但是,我想确保此覆盖只发生在广告呈现期间,并且可能在页面上的任何其他document.writes不受影响。这可以通过关闭来确定范围或完成吗?我并不十分熟悉这是如何完成的。覆盖指定范围内的document.write?

到目前为止,我有:

(function(){ 
function RenderAd(adURL,Element) 
{ 
    document.write = function(adContent) {       
     Element.append(adContent); 
    } 
    $.getScript(adURL); 
} 
    RenderAd('http://ad.doubleclick.net/N4890/adj/za.za.home/main;pos=300top;tile=2;sid=Amazon;sz=300x250;ord=12247707435800953?',$('#HeaderDiv')); 
}(document.write)); 

但是,当我打电话document.write('test');之后,它依然使用我的版本文件撰写的。

+0

您正在用自定义函数覆盖'document.write'的值。但是您不会将原始值设置回任何位置。它是否应该自动恢复? – Jon

+0

@Jon这是范围和封闭的整个概念。它只是作为文档对象的一部分与全局函数无关。 – AesopWaits

+0

这将是如果代码使用参数,而不是直接进入'window.document'来修改属性。 – Jon

回答

3

document.write是在HTML文档中的作用域,所以如果你改变它,任何后续的调用也会执行被覆盖的版本。你可以尝试一些东西,例如将原始document.write函数存储在temp var中,覆盖它,然后在完成函数调用之后替换它,但是由于对document.write的调用是通过回调并且是异步的,并且自从您可能以这种方式在页面上加载多个广告,但无法预测何时应恢复原始document.write。

在服务调用返回包装在document.write()调用中的HTML的场景中,通常会做的是在单独的iframe中加载它,该iframe将拥有自己的文档对象。

因此,如果可以,请为每个广告创建一个iframe,并将调用中返回的数据加载到Google双击iframe中。 document.write将为该iframe创建一个缓冲区,并且不会影响父HTML。

1

使用iframe放置广告。这样,你不必重写document.write。该广告将自己渲染iframe,不会混淆主页的document.write。

另一种解决方案认为: 1.保存原始文件撰写的变量 2.覆盖文件撰写你的版本 3.在$ .getScript成功回调恢复原来的文件撰写。

但这不行,因为脚本执行后没有触发回调。