Executar gravação no documento: não é possível gravar em um documento a partir de um script externo carregado de forma assíncrona, a menos que seja explicitamente aberto.

Eu estou tentando carregar um determinado script após o carregamento da página é executado, algo como isto:

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; 

E enquanto este script parece executar e baixar ‘scriptSrc’, e anexá-lo logo antes do final da tag body, ele produz a seguinte mensagem (não um erro) no console (chrome)

Falha ao executar ‘gravação’ em ‘Documento’: Não é possível gravar em um documento a partir de um script externo carregado de forma assíncrona, a menos que seja explicitamente aberto.

O que isso significa? E eu deveria fazer algo diferente? Mesmo que eu consiga o comportamento esperado?

Um script carregado de forma assíncrona provavelmente será executado APÓS o documento ter sido totalmente analisado e fechado. Assim, você não pode usar document.write() de tal script (bem tecnicamente você pode, mas não fará o que você quer).

Você precisará replace quaisquer instruções document.write() nesse script com manipulações explícitas de DOM, criando os elementos DOM e, em seguida, inserindo-os em um pai específico com .appendChild() ou .insertBefore() ou definindo .innerHTML ou algum mecanismo para manipulação direta de DOM assim.

Por exemplo, em vez desse tipo de código em um script in-line:

 

Você usaria isso para replace o script embutido acima em um script carregado dinamicamente:

 var container = document.getElementById("container"); var content = document.createElement("span"); content.style.color = "red"; content.innerHTML = "Hello"; container.appendChild(content); 

Ou, se não houvesse outro conteúdo no contêiner que você precisasse append, você poderia simplesmente fazer isso:

 var container = document.getElementById("container"); container.innerHTML = 'Hello'; 

Um pouco atrasado para a festa, mas o Krux criou um script para isso, chamado Postscribe . Conseguimos usar isso para superar esse problema.

Caso isso seja útil para qualquer pessoa, tive esse mesmo problema. Eu estava trazendo um rodapé para uma página da web via jQuery. Dentro desse rodapé havia alguns scripts do Google para anúncios e retargeting. Eu tive que mover os scripts do rodapé e colocá-los diretamente na página e isso eliminou o aviso.