在指定范围内重写文档



我需要覆盖document.write,以便呈现一个广告,该广告从Google的双击中包装在该函数中返回。由于标准 document.write 完全替换了页面内容,因此我覆盖了它以将广告内容附加到现有元素。但是,我想确保此覆盖仅在广告呈现期间发生,并且页面上可能存在的任何其他 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');时,它仍然使用我的 document.write 版本。

document.write 的作用域在 HTML 文档中,因此如果您更改它,任何后续对它的调用也将执行覆盖的版本。您可以尝试将原始 document.write 函数存储在临时变量中,重写它,然后在完成函数调用后替换它,但是由于对 document.write 的调用是通过回调并且是异步的,并且由于您可能以这种方式在一个页面上加载多个广告,因此您无法预测何时应该恢复原始 document.write。

服务调用返回包装在 document.write() 调用中的 HTML 的情况下,通常要做的是将其加载到单独的 iframe 中,该 iframe 将具有自己的文档对象。

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

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

考虑了另一种解决方案:1. 将原始文档保存在变量中2. 覆盖文档.写入您的版本3. 在 $.getScript 成功回调中恢复原始文档。

但这行不通,因为在脚本执行后不会触发回调。

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

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

希望它能解决你的问题。欢迎提出任何问题。

最新更新