2017-01-23 61 views
0

基本上我有這兩行代碼之後對方:如何查找document.write的運行環境。你能解開這個謎,

console.log(typeof (noAdsCallback)); 
document.write('<sc' + 'ript type="text/javascript">console.log(typeof(noAdsCallback));</scr' + 'ipt>'); 

第一個記錄function,第二日誌undefined寫入。

當然這比這更麻煩一點。所以這裏的設置簡而言之:

我有一個所謂的廣告提供商的瀑布。這意味着,我嘗試通過編寫(使用document.write)一些特殊標記(由我的廣告提供商向我提供)來加載一些廣告。

如果供應商不給我找一個廣告,他們發回一個JavaScript - 摘錄看起來像這樣:

if (typeof(window.noAdsCallback) === "function") noAdsCallback(); 

這個功能基本上是將下一個供應商的標籤,這不相同作爲第一個,直到我到達名單的末尾。

這個系統實際上工作正常,做我想要它做的。這兩行在開始日誌function中給出。

除非我將Google用作廣告提供商。 Google做了一件不同的事情,這似乎把所有事情搞砸了。

在Google中,我無法定義備用JavaScript代碼段。我所能做的就是提供一個fallback-url。因此,這個fallback-url(因爲它被加載到內部iframe內部的iframe中)將postMessage發送到頂部,然後調用相同的noAdsCallback()方法。而且,這也很好。收到該消息並執行正確的方法。但是,這兩行已經給出了不同的結果,即分別爲functionundefined

下一個提供程序然後在返回時找不到noAdsCallback()方法,因爲它使用document.write嘗試執行它。不知怎的,上下文丟失了。

第一提示:它在Chrome中正常工作(即,兩行日誌爲function),但它在FF或IE中不起作用。

第二提示:只要上下文永不切換,它就可以正常工作,但如果通信在任何時候都通過消息傳遞運行,它會感到困惑。

第三提示:使用下面提到的夢幻般的postscribe庫,實際上解決了這個問題,但在別處引入了新的問題。

第四提示:在使用document.write之前,調試window.name會給出正確的名稱,所以我不是隨機的iFrame。

整理的想法。我知道,我知道:不要使用文檔寫!我知道。但由於Adproviders使用它的時候,我不得不用它來,否則我得到這樣的:

Failed to execute 'write' on 'Document': It isn't possible to write into a document from an asynchronously-loaded external script unless it is explicitly opened. 

其實,現在我使用postscribe(https://github.com/krux/postscribe)和它的作品就像一個魅力,除了爲一個lousey提供者。而workauround解決方案就是使用文檔。只寫這個糟糕的提供者,併爲所有其他人訂閱。但我真的很想知道問題的根源在哪裏。

任何想法,非常感謝。

回答

1

我想我現在明白了。長話短說:不要使用DOCUMENT.WRITE :)

嘗試訂閱,如果你必須。

所以事後看來很明顯,因爲真的,在你閱讀過關於document.write()的任何地方,它說write()清除了整個文檔。我只是沒有得到它,因爲我從來沒有看到它發生,每個廣告都在使用它,就像整個時間一樣。另外,它似乎在Chrome上運行良好。發生什麼了??

那麼這裏發生了什麼。只要文檔處於打開狀態,這基本上意味着正在寫入,document.write()只是附加到流中,並且不會清除文檔。只要我使用document.write()來追加外部廣告腳本(可能並將包含document.write()),頁面不會關閉,因此文檔保持打開狀態。

這就是爲什麼將Google加入我的瀑布造成問題的原因:Google將所有內容放入iframe中。因此,包含瀑布模型的頁面只會看到iframe,並說:「就我而言,我完成了」並關閉了文檔,而事實上,Google仍在此處。

之後,Google沒有找到廣告,向主頁面發送postMessage,導致使用下一個提供程序。然後誰使用document.write()並清除所有內容。

一切?並非全部。請記住,當我使用Chrome時,它仍然用於工作?原因是,Chrome只是清除了HTML,但保留了Javascript的完整性。所以在Chrome上,我的Javascript-waterfall工作正常,因爲所有的JS對象仍然存在。所有其他瀏覽器清除它。

就是這樣。大概沒有人會讀它,但如果你這樣做,使用POSTSCRIBE!現在,我終於真正理解了document.write()和document.open()和document.close()我是一個很大的粉絲。

相關問題