2010-05-05 17 views
14

Sto cercando un modo pulito per caricare in modo asincrono i seguenti tipi di file javascript: un file js "core" (hmm, chiamiamolo, oh non lo so , "jquery!" haha), x numero di file js che dipendono dal file js "principale" in fase di caricamento, e numero y di altri file js non correlati. Ho un paio di idee su come procedere, ma non sono sicuro di quale sia il modo migliore. Mi piacerebbe evitare di caricare script nel corpo del documento.caricamento js file e altri file js dipendenti in modo asincrono

Così, per esempio, voglio i seguenti 4 file JavaScript per caricare in modo asincrono, nome appropriato:


/js/my-contact-page-js-functions.js // unrelated/independent script 
/js/jquery-1.3.2.min.js // the "core" script 
/js/jquery.color.min.js // dependent on jquery being loaded 
http://thirdparty.com/js/third-party-tracking-script.js // another unrelated/independent script 

Ma questo non funziona perché non è garantito che jQuery è caricato prima che il plug-in di colore ...


(function() { 
    var a=[ 
     '/js/my-contact-page-functions.js', 
     '/js/jquery-1.4.2.min.js', '/js/jquery.color.js', 
     'http://cdn.thirdparty.com/third-party-tracking-script.js', 
    ], 
    d=document, 
    h=d.getElementsByTagName('head')[0], 
    s, 
    i, 
    l=a.length; 
    for(i=0;i<l;i++){ 
     s=d.createElement('script'); 
     s.type='text/javascript'; 
     s.async=true; 
     s.src=a[i]; 
     h.appendChild(s); 
    } 
})(); 

È praticamente impossibile caricare jquery e il plug-in in modo asincrono? (Poiché il plug-color richiede che jQuery sia caricato per primo.)

Il primo metodo che stavo considerando è quello di combinare lo script del plug-in del colore con il sorgente jQuery in un unico file.

Poi un'altra idea che avevo stava caricando il plugin colore in questo modo:


$(window).ready(function() { 
    $.getScript("/js/jquery.color.js"); 
}); 

Qualcuno ha qualche idea su come devi andare su questo? Grazie!

risposta

5

LabJS e RequireJS sono due scelte popolari in questo momento. Entrambi funzionano con jQuery ma adottano approcci leggermente diversi, quindi dovresti esaminare entrambi.

+0

LAB sembra non essere più mantenuto, quindi ho cambiato la risposta accettata alla tua, dal momento che hai citato RequireJS. (Probabilmente una scelta migliore al giorno d'oggi!) Speriamo che questa sia la "giusta" cosa da fare per le domande più vecchie qui su SO. – taber

0

Non sarai in grado di ottenere un carico completamente asincrono proprio per la ragione che hai menzionato; dipendenza.

Per il mio 10p, seguirei la rotta $ .getScript(). È fondamentalmente solo un wrapper per $ .ajax(), quindi caricare gli script in questo modo ti darà il caricamento asincrono che stai cercando.

12

LABjs creato appositamente per questo problema.

<script src="lab.js"></script> 
<script> 
    $LAB 
    .script("jquery.js") 
    .wait() 
    .script("jquery.color.js") 
    .script("jquery.otherplugin.js") 
    .script("mylib.js") 
    .wait() 
    .script("unrelated1.js") 
    .script("unrelated2.js"); 
</script> 

si potrebbe anche mettere gli script estranei nella propria $LAB catena, se davvero non hanno bisogno di aspettare per jQuery e gli altri script.

+0

grazie, se volevo caricare lab.js asincrono troppo, come faccio a sapere quando esiste $ LAB ed è pronto da chiamare? dovrei usare qualcosa come: function initLab() {...} ... document.onload = initLab; – taber

+0

Potresti fare qualcosa del genere, ma consiglierei di non farlo. LAB.js è solo 4.5k dopo il minification (solo 2.1k attraverso il filo gzip). Se lo si desidera, è possibile integrare il codice LABjs in un tag '

Problemi correlati