Qual è la differenza tra JHtml: script () e $ doc-> addScript?


10

Di recente ho sviluppato un modulo che richiede l'iniezione di alcuni file JS e CSS in <head>ciascuna pagina. Inizialmente, ho usato:

$doc =& JFactory::getDocument();
$doc->addScript(JURI::base(true).'/modules/mod_x/js/mod_x.js');

Tuttavia, ho notato che quando è stata abilitata la memorizzazione nella cache, il sito ha caricato sia una versione cache che una versione /cachenon cache /modules/mod_x/js/, causando errori JS.

Quando l'ho cambiato in:

JHtml::script(Juri::base().'modules/mod_x/js/mod_x.js');

Lo script è stato caricato una sola volta, dalla cache, risolvendo questi errori.

Ho letto nei documenti che il addScriptmetodo era più "basso livello" rispetto al JHtml:scriptmetodo, ma oltre a dire che ...

Ovviamente, dovrai anche codificare manualmente alcuni dei passaggi [che JHtml: script fa per te] che verrebbero eseguiti automaticamente usando il [JHtml: metodo di script] sopra [se usi addScript].

... non vengono forniti ulteriori dettagli.

Quindi qual è la differenza? Presumo che JHtml:scriptalla fine invoca addScriptun oggetto documento a un certo punto, ma vengono intrapresi prima altri passaggi intermedi?


4
Ho riscritto un po 'i documenti di Joomla per provare ad aggiornarlo - vedi se ha più senso ora?
George Wilson,

1
@GeorgeWilson I documenti di Joomla sono davvero migliorati di recente. Grazie :)
TryHarder

Domanda relativa ai fogli di stile: joomla.stackexchange.com/q/10062/5239
Flimm,

Risposte:


8

JHtml::scriptha una logica aggiuntiva inclusa. Vedi http://api.joomla.org/cms-3/classes/JHtml.html#method_script per il riferimento API

Per impostazione predefinita, rileverà le impostazioni di debug e il browser utilizzato e caricherà lo script corrispondente. Ad esempio, quando il debug è abilitato, caricherà una versione non compressa del file, se presente.

Esistono impostazioni opzionali che consentono di sovrascrivere il file a livello di modello e altre cose.

Michael Babker ha scritto una buona guida su come utilizzare JHtml::script()per consentire le sostituzioni: http://www.babdev.com/blog/139-use-the-media-folder-allow-overridable-media

Funzione in repository per riferimento: https://github.com/joomla/joomla-cms/blob/staging/libraries/cms/html/html.php#L659

Pagina ufficiale del documento che è ora aggiornata da George: http://docs.joomla.org/J3.3:Adding_JavaScript_and_CSS_to_the_page


2
Grazie per la risposta. Il riferimento API è abbastanza conciso: esiste una spiegazione più completa degli effetti di detect_browser e detect_debug e quando dici "impostazioni opzionali" e "altre cose" sono documentate ovunque?
codinghands

Ho aggiunto un collegamento a un articolo di Michael che spiega la parte di sostituzione. Per quanto riguarda la parte di debug e browser, non penso che ci sia una documentazione. Dovresti leggere il codice per quello.
Bakual,

1
Quindi, se esiste un file js non compresso e compresso, ad esempio, e il debug è attivo, caricherà il nomefile-uncompressed.js e solo il nomefile.js quando il debug è disattivato. Per il browser quando viene eseguito il debug, cerca il nome file-browser.js, quindi il nome-browser-browser-browserversion.js ecc.
George Wilson,

2
Questa è una risposta incrinata - grazie @Bakual e @GeorgeWilson!
codinghands

1
Non dimenticare che anche JHtml può aggiungere MD5sum di uno script o di un foglio di stile al cache-bust.
Flimm,

4

in due parole:

  • JHtml::script() - ti permette di sovrascrivere lo script specifico (tranne quello già allegato a JDocument), dipende da alcuni fattori (vedi risposta @Bakual);
  • $doc->addScript() - allegare lo script direttamente al documento, senza verificare una sostituzione;

Se sei lo sviluppatore dell'estensione, ti consigliamo vivamente di usarlo JHtml::script()quando aggiungi lo script. Ciò consentirà ai tuoi utenti di sovrascrivere alcuni script specifici, a seconda di ciò che desiderano.
Esiste anche un metodo simile per css.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.