2014-01-15 123 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成功回調恢復原來的文件撰寫。

但這不行,因爲腳本執行後沒有觸發回調。