Domanda

Ho un file JavaScript in un server che non posso modificare.

Ecco un campione dello script che devo scaricare:

var tags = '';
tags += '<a href="#somelink"><img src="someimage.gif"/></a>;
document.write(tags);
.

Ho iniziato a scaricare lo script tramite Ajax ed eseguirlo, ma ho urtato nel problema "Document.Write non può essere eseguito in un problema di chiamata asincrona".

Così volevo scaricare lo script come testo semplice e prendere ciò di cui ho bisogno dalla risposta e mettilo dove dovrebbe andare nella mia pagina HTML senza modyfing lo script originale.

$.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);
});
.

Ma Ajax getta un errore quando faccio la richiesta di download utilizzando dataType = "text".C'è un modo per aggirare questo e effettivamente scaricarlo come testo?

PS: lo script è per un'app privilegiata di Firefox OS, quindi non riesco a mettere lo script direttamente nella pagina HTML perché il CSP di sicurezza non lo consente ( https://developer.mozilla.org/en-us/apps/csp ).

È stato utile?

Soluzione

Dato che sembri in grado di run lo script con successo in qualche modo, ecco un'idea terribile che potrebbe funzionare: sovrascrivere document.write.

Prima di eseguire lo script, fai:

document.write = function(msg) {
    handleTagStringInApp(msg);
    delete document.write; // revert to original document.write when done
};
// now load execute the script...
.

Dove handleTagStringInApp è una funzione che scrivi che elabora in qualche modo la stringa del tag.Questo è in praticaJSONP, ma non è possibile regolare il nome del callback per essere qualcosa di non invadente o utile e deve invece utilizzare il nome di callback document.write.

Nota che questo sarà davvero male se qualcos'altro nella tua app ha effettivamente bisogno di utilizzare document.write.(Potresti aggirare questo nel tuo codice mantenendo un riferimento al document.write reale, ad esempio utilizzando var realDocWrite = document.write; a pagina Carico e chiamandolo con realDocWrite.call(document, "whatever").)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top