Dal punto di vista delle performance si dovrebbero caricare i javascript alla fine della pagina (vedere http://developer.yahoo.com/performance/rules.html), almeno tutti i javascript di cui si può differire il caricamento. Ci sono script che devono essere caricati all'inizio della pagina... Ma siamo sicuri che non c'è altra possibilità?
Beh, in realtà questa è una autocritica su di un mio script. Nel codice di <a href="/articles/jquery-context-menu">imagedata drupal example module</a> rimpiazzo {imagedata ...} con una chiamanta alla funzione del plugin jQuery.
Ci sono molte situazione nelle quali è chiamata una funzione javascript direttamente, ma dove si potrebbe definire una struttura dati e usare una funzione "caller" che esegue il corrispettivo javascript per quella variabile
Inoltre, spesso l'esecuzione può/deve essere differita in un dato ordine di esecuzione, anche per far funzionare le cose (guarda <a href="http://www.smartango.com/blog/jquery-form-hint-plugin-mine">formhint plugin</a> e il problema con widget facebook). (usando la tecnica del definire una struttura dati, l'attributo defer diventa così inutile)
Detto ciò, può essere usata una struttura come:
<script>var datastruct = {type:'right',sel:"a > img"}</script>
e alla fine della pagina (tra altri javascript):
<script>
function functioncall(data){
$(data.sel).contextmenu(menu,data.type,data.timeout);
}
functioncall(datastruct);
</script>
Ok, questo funzione, e può anche essere usato un array:
<script>var datastruct = datastruct || new Array();datastuct.push({type:'right',sel:"a > img"});</script>
(.. con funzione caller che cicla sull'array, questa volta)
Ma può essere utilizzata una soluzione più elegante (secondo me): usare script type="text/html"
<script type="text/html" class="mydatas">{type:'right',sel:"a"}</script>
E una funzione caller:
function caller(class){
$("."+class).each(function(i,el){
eval('var m='+$(el).html());
$(m.sel).contextmenu(menu,m.type,m.timeout);
});
}
E si può decidere il momento quando chiamare la funzione.
Conclusioni
Nella maggior parte dei casi si può rispettare la regola di caricare gli script alla fine della pagina, avendo in più il controllo del tempo di esecuzione dello script.