Ejecutar escritura en documento: no es posible escribir en un documento desde un script externo cargado de forma asincrónica a menos que se abra explícitamente.
Estoy intentando cargar un determinado script después de que se ejecuta la carga de la página, algo como esto:
function downloadJSAtOnload(){
var element = document.createElement("script");
element.src = "scriptSrc";
document.body.appendChild(element);
}
if (window.addEventListener)
window.addEventListener("load", downloadJSAtOnload, false);
else if (window.attachEvent)
window.attachEvent("onload", downloadJSAtOnload);
else window.onload = downloadJSAtOnload;
Y aunque este script parece ejecutar y descargar 'scriptSrc' y agregarlo justo antes del final de la etiqueta del cuerpo, genera el siguiente mensaje (no es un error) en la consola (Chrome)
No se pudo ejecutar 'escribir' en 'Documento': no es posible escribir en un documento desde un script externo cargado de forma asincrónica a menos que se abra explícitamente.
¿Qué significa esto siquiera? ¿Y se supone que debo hacer algo diferente? ¿Aunque obtengo el comportamiento esperado?
Es probable que se ejecute un script cargado de forma asincrónica DESPUÉS de que el documento se haya analizado y cerrado por completo. Por lo tanto, no puede utilizar document.write()
dicho script (bueno, técnicamente puede hacerlo, pero no hará lo que desea).
Deberá reemplazar cualquier document.write()
declaración en ese script con manipulaciones DOM explícitas creando los elementos DOM y luego insertándolos en un padre particular con .appendChild()
o .insertBefore()
configuración .innerHTML
o algún mecanismo para la manipulación directa de DOM como ese.
Por ejemplo, en lugar de este tipo de código en un script en línea:
<div id="container">
<script>
document.write('<span style="color:red;">Hello</span>');
</script>
</div>
Utilizaría esto para reemplazar el script en línea anterior en un script cargado dinámicamente:
var container = document.getElementById("container");
var content = document.createElement("span");
content.style.color = "red";
content.innerHTML = "Hello";
container.appendChild(content);
O, si no hubiera ningún otro contenido en el contenedor al que simplemente necesitara agregar, simplemente podría hacer esto:
var container = document.getElementById("container");
container.innerHTML = '<span style="color:red;">Hello</span>';
Un poco tarde para la fiesta, pero Krux ha creado un guión para ello, llamado Postscribe . Pudimos usar esto para solucionar este problema.
En caso de que esto sea útil para alguien, tuve el mismo problema. Estaba incorporando un pie de página a una página web a través de jQuery. Dentro de ese pie de página había algunos scripts de Google para anuncios y retargeting. Tuve que mover esos guiones del pie de página y colocarlos directamente en la página y eso eliminó el aviso.