基本上我有這兩行代碼之後對方:如何查找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()方法。而且,這也很好。收到該消息並執行正確的方法。但是,這兩行已經給出了不同的結果,即分別爲function
和undefined
下一個提供程序然後在返回時找不到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解決方案就是使用文檔。只寫這個糟糕的提供者,併爲所有其他人訂閱。但我真的很想知道問題的根源在哪裏。
任何想法,非常感謝。