Es posible anular el método document.write. De modo que puede almacenar en búfer las cadenas enviadas a document.write y generar el búfer donde desee. Sin embargo, cambiar un script de sincrónico a asincrónico puede causar errores si no se maneja correctamente. He aquí un ejemplo:
reemplazo document.write simplificado
(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";
})();
contenido de 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
he documentado los diferentes problemas que he encontrado al escribir y usar mi reemplazo de document.write: https://github.com/gregersrygg/crapLoader/wiki/What-to-think-about-when-replacing-document.write
Pero el peligro de utilizar un reemplazo document.write son todos los problemas desconocidos que puedan surgir. Algunos ni siquiera son posibles de recorrer.
document.write("<scr"+"ipt src='http://someadserver.com/adLib.js'></scr"+"ipt>");
adLib.doSomething(); // ReferenceError: adLib is not defined
Por suerte no me he encontrado con el problema anterior en la naturaleza, pero eso no garantiza que no ocurrirá;)
Aún quieres probarlo? Pruebe crapLoader (mío) o writeCapture:
También debe consultar friendly iframes. Básicamente crea un iframe del mismo dominio y carga todo allí en lugar de en su documento. Desafortunadamente, no he encontrado ninguna buena biblioteca para manejar esto todavía.
es el script de terceros descargado, por lo que puede editarlo?Creo que podría ser una mejor solución que hackear 'document.write()' – peirix
Mi ejemplo pasó. Lo que quise decir fue: document.write ('<' + 'div'); document.write ('>' + 'Text Content' + '<'); document.write ('\ div>') –
Podría editarlo, pero además del análisis completo de JS, ¿hay alguna forma de garantizar que el código editado funcione correctamente? –