Quello che sto cercando di fare è includere dinamicamente uno o più file js da Javascript. So che ci sono un sacco di tecniche per questo, ma sto cercando una soluzione che rispetti queste regole:Include JavaScript in modo dinamico e aspetta
1) Non utilizzare alcun framework o librerie JS (jQuery, Prototype, ecc.).
2) Lo script deve interrompere l'esecuzione finché il file js esterno non viene completamente caricato e analizzato dal browser.
Il razionale # 2 è il file js esterno includerà le definizioni di funzione che devono essere utilizzate immediatamente dopo l'inclusione dello script. Il più delle volte il browser non ha avuto il tempo di analizzare il file js prima di iniziare a chiamare quelle funzioni.
Non mi dispiace utilizzando un callback per sapere quando lo script è terminato il caricamento, ma:
1) Io non so in anticipo come molti script stanno per essere inclusi in modo dinamico, in modo da don Non voglio e non posso scrivere un gruppo di callback annidati. Devo solo sapere quando hanno finito di caricare.
2) Sto dicendo che il tentativo di utilizzare qualche tipo di evento "load" per attivare la funzione callback potrebbe non funzionare se il browser ha memorizzato nella cache il codice JavaScript.
Modifica Avrei dovuto menzionare dall'inizio che questo è per un sistema di plugin, ma volevo mantenere la mia domanda/risposta abbastanza generica da essere utile ad altre persone.
Gli utenti definiscono quali plug-in si desidera caricare in un array.
plugins = [ 'FooPlugin', 'BarPlugin' ];
avrei quindi scorrere l'array, e caricare lo script js per ogni plugin:
for(var i = 0; i < plugins.length; i++) {
loadScript('plugins/' + plugins[i] + '.js');
}
Ogni plugin si spinge sulla matrice loaded_plugins (Questo è un esempio di FooPlugin.js)
load_plugins.push({
name: 'FooPlugin',
// Other plugin methods and properties here
});
Non sono sicuro di questa risposta, quindi inseriscilo come commento. Hai provato a usare AJAX per caricare il contenuto del javascript in una variabile lato client, quindi usando 'eval()'? Poiché bisognava aspettare che AJAX restituisse un messaggio 200/OK, si sa che l'intero script è stato caricato, e 'eval()' non dovrebbe passare alla riga successiva finché non ha terminato di eseguire l'intero script. – stevendesu
È possibile determinare quali script sono necessari durante il caricamento della pagina? Se è così, allora la soluzione di @ Paul è l'ideale. In caso contrario, la soluzione dipenderà dai browser che si desidera supportare e dal fatto che gli script si trovino nello stesso dominio della pagina. –
@steven_desu - Le funzioni/variabili nello script caricato non dovrebbero finire nel contesto in cui è stato chiamato eval()? Significa che non sarebbero disponibili al di fuori della funzione che utilizzava eval. – mellowsoon