2009-02-27 12 views
5

Trovo questo codice eccellente, pubblicato da aemkei come risposte a questa domanda:Come si carica dinamicamente un file javascript da un dominio diverso?

  1. How do you dynamically load a javascript file? (Think C’s #include)
  2. Use javascript to inject script references as needed?

Si può scrivere dinamica tag script (usando Prototype):

new Element("script", {src: "myBigCodeLibrary.js", type: "text/javascript"}); 

Il problema qui è che non siamo a conoscenza di quando il file di script esterno è completamente caricato.

spesso si vuole il nostro codice dipende linea molto vicino e piace scrivere qualcosa di simile:

if (iNeedSomeMore){ 
    Script.load("myBigCodeLibrary.js"); // includes code for myFancyMethod(); 
    myFancyMethod();      // cool, no need for callbacks! 
} 

C'è un modo intelligente per iniettare script di dipendenze, senza la necessità di callback. Devi semplicemente estrarre lo script tramite una richiesta sincrona AJAX e valutare lo script a livello globale.

Se si utilizza il metodo Prototype Script.load assomiglia a questo:

var Script = { 
    _loadedScripts: [], 
    include: function(script){ 
    // include script only once 
    if (this._loadedScripts.include(script)){ 
     return false; 
    } 
    // request file synchronous 
    var code = new Ajax.Request(script, { 
     asynchronous: false, method: "GET", 
     evalJS: false, evalJSON: false 
    }).transport.responseText; 
    // eval code on global level 
    if (Prototype.Browser.IE) { 
     window.execScript(code); 
    } else if (Prototype.Browser.WebKit){ 
     $$("head").first().insert(Object.extend(
     new Element("script", {type: "text/javascript"}), {text: code} 
    )); 
    } else { 
     window.eval(code); 
    } 
    // remember included script 
    this._loadedScripts.push(script); 
    } 
}; 

ho scoperto che, il codice non funziona su IE se la di loro tutto viene eseguito in 'file:// 'protocollo, tuttavia, non è il problema dal momento che il suo caso d'uso riguardava un'applicazione web reale.

ho provato una volta per includere http://www.google-analytics.com/urchin.js da Google, ma da una pagina web, ma sembra che non si può richiedere file javascript da diverso dominio.

Come è possibile aggiungere in modo dinamico javascript, proprio come avviene negli script precedenti, ma da un altro dominio?

risposta

1

Il modello di sicurezza nei browser moderni impedisce a JavaScript di effettuare richieste tra domini. Questo ha dei buchi (vedi l'exploit di ogni sito web dall'inizio di Internet), ma usarli è più che un po 'losco ed è solo una questione di tempo prima che vengano riparati.

+0

Penso che potremmo farlo tramite proxy ajax, tuttavia, per la maggior parte dei casi di utilizzo pratico, questa è sicuramente la risposta appropriata. ;-) Grazie. – Nordin

0

Ciò che Rex ha detto è corretto, anche se HTML5 ha aggiunto messaggi di dominio incrociato e xhr, che richiedono un po 'di lavoro da parte vostra, ma dovrebbero essere utilizzabili per raggiungere questo obiettivo. Purtroppo non sono ancora presenti in tutti i browser rilasciati (penso che le ultime beta di Safari, Firefox e IE abbiano il supporto per alcune di queste funzionalità, ma non sono sicuro di quali browser supportino le apis)

6

Puoi utilizzare l'evento onload e onreadystatechange per capire quando viene caricato il tag <script>.

var script = new Element("script", {src: "myBigCodeLibrary.js", type: "text/javascript"}); 

script.onload = script.onreadystatechange = function(){ 
    if (!this.readyState || 
     this.readyState == "loaded" || this.readyState == "complete") { 
     //script is loaded 
    } 
}; 
Problemi correlati