覆盖指定范围内的document.write?

时间:2014-01-15 15:44:36

标签: javascript jquery closures document.write

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

到目前为止,我有:

(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');时,它仍在使用我的document.write版本。

3 个答案:

答案 0 :(得分: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 :(得分:1)

使用iframe放置广告。这样,您不必覆盖document.write。该广告将在其自己的iframe上呈现,并且不会混淆主页面的document.write。

另一个解决方案: 1.将原始document.write保存在变量中 2.将document.write覆盖到您的版本 3.在$ .getScript成功回调中恢复原始document.write。

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

答案 2 :(得分:0)

欢迎尝试https://github.com/shenjunru/LazyWrite

它允许您控制document.write()。

希望它可以解决您的问题。欢迎任何问题。