Não é possível carregar o script como texto simples com AJAX
-
20-12-2019 - |
Pergunta
Eu tenho um arquivo javascript em um servidor que eu não posso modificar.
Aqui está um exemplo de script que eu tenho para fazer o download:
var tags = '';
tags += '<a href="#somelink"><img src="someimage.gif"/></a>;
document.write(tags);
Eu comecei a baixar o script via AJAX e executá-lo, mas esbarrei com o documento".gravação não pode ser executada na chamada assíncrona" problema.
Então, eu queria baixar o script como um texto simples e pegar o que eu preciso da resposta e colocá-lo onde ele deve ir na minha página html sem modyfing o script original.
$.ajax({
type: "GET",
url: "http://myurlexample.com",
dataType: "text",
}).success(function(msg){
console && console.log("The script was downloaded as text: "+msg);
}).error(function(object,status,errortxt){
console && console.log("The script wasn't downloaded as text. The error:"+ errortxt);
});
Mas o AJAX lança um erro quando eu faço o pedido de transferência usando dataType = "text"
.Existe alguma maneira de contornar esse e realmente baixá-lo como um texto?
P. S:O script é para o Firefox OS privilegiada app, então eu não posso colocar o script diretamente no html da página, porque a segurança CSP não permite que ele (https://developer.mozilla.org/en-US/Apps/CSP).
Solução
Já que você parece capaz de executar o script com êxito, de alguma forma, aqui está uma idéia terrível que pode funcionar:substituir document.write
.
Antes de executar o script, execute:
document.write = function(msg) {
handleTagStringInApp(msg);
delete document.write; // revert to original document.write when done
};
// now load execute the script...
onde handleTagStringInApp
é uma função que você escrever que os processos da cadeia de marca de alguma forma.Este é basicallyJSONP, mas você não pode ajustar o retorno de chamada nome para ser algo discreto ou útil e, em vez disso, deve usar o retorno de chamada nome document.write
.
Note que este será muito ruim se qualquer outra coisa em seu aplicativo, na verdade, precisa usar document.write
.(Você pode contornar isso no seu próprio código, mantendo uma referência para o real document.write
, por exemplo, usando var realDocWrite = document.write;
no carregamento da página e chamando-o com realDocWrite.call(document, "whatever")
.)