可以覆蓋document.write方法。所以你可以緩衝發送到document.write的字符串,並在任何你喜歡的地方輸出緩衝區。但是,如果處理不正確,則將腳本從同步更改爲異步可能會導致錯誤。這裏有一個例子:
簡化文件撰寫更換
(function() {
// WARNING: This is just a simplified example
// to illustrate a problem.
// Do NOT use this code!
var buffer = [];
document.write = function(str) {
// Every time document.write is called push
// the data into buffer. document.write can
// be called from anywhere, so we also need
// a mechanism for multiple positions if
// that's needed.
buffer.push(str);
};
function flushBuffer() {
// Join everything in the buffer to one string and put
// inside the element we want the output.
var output = buffer.join('');
document.getElementById("ad-position-1").innerHTML = output;
}
// Inject the thid-party script dynamically and
// call flushBuffer when the script is loaded
// (and executed).
var script = document.createElement("script");
script.onload = flushBuffer;
script.src = "http://someadserver.com/example.js";
})();
內容http://someadserver.com/example.js
var flashAdObject = "<object>...</object>";
document.write("<div id='example'></div>");
// Since we buffer the data the getElementById will fail
var example = document.getElementById("example");
example.innerHTML = flashAdObject; // ReferenceError: example is not defined
我已經證明我寫,我使用時遇到的各種問題document.write替換:https://github.com/gregersrygg/crapLoader/wiki/What-to-think-about-when-replacing-document.write
但是使用document.write替換的危險都是可能出現的未知問題。有些甚至無法避開。
document.write("<scr"+"ipt src='http://someadserver.com/adLib.js'></scr"+"ipt>");
adLib.doSomething(); // ReferenceError: adLib is not defined
幸運的是,我還沒有碰到過在野外上述問題,但並不能保證它不會發生;)
還是想嘗試一下?試用crapLoader(我的)或writeCapture:
您還應該檢查出friendly iframes。基本上它會創建一個同域iframe,並將所有內容加載到文件中而不是文件中。不幸的是,我還沒有找到任何好的庫來處理這個問題。
是第三方腳本下載,所以你可以編輯它?我認爲這可能是一個比黑客更好的解決方案'document.write()' – peirix 2009-10-08 10:56:16
我的例子沒有通過。我的意思是: document.write('<'+'div'); document.write('>'+'Text Content'+'<'); document.write('\ div>') – 2009-10-08 10:59:12
我可以編輯它,但除了完整的JS解析,有沒有一種方法來保證編輯的代碼將正常工作? – 2009-10-08 11:01:14