Возможно переопределить метод document.write. Таким образом, вы можете буферизовать строки, отправленные в 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 :
Вы также должны проверить дружественных фреймов . По сути, он создает iframe с тем же доменом и загружает все, а не в ваш документ. К сожалению, я не нашел хороших библиотек для этого.