【问题标题】:Overriding document.write within a specified scope?在指定范围内覆盖 document.write?
【发布时间】:2014-02-04 04:23:07
【问题描述】:

我需要重写 document.write 以呈现从谷歌双击返回的包含在该函数中的广告。由于标准 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 的值。但是您不会在任何地方设置原始值。它应该自动恢复吗?
  • @Jon 这是范围和闭包的整个概念。它只是不适用于作为文档对象一部分的全局函数。
  • 如果代码使用参数而不是直接访问window.document 来修改属性。

标签: javascript jquery closures document.write


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    使用 iframe 放置广告。这样,您不必重写 document.write。广告将在自己的 iframe 上呈现,不会与主页的 document.write 混淆。

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-18
        • 2011-01-16
        • 2013-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多