Jhtml :: ordine degli script - come rimandare fino a quando jQuery non è stato caricato?


11

Uso JHtml::scriptper aggiungere script alle mie pagine in un modulo sviluppato su misura. Tuttavia, questi script vengono iniettati nell'intestazione prima dell'aggiunta di J3 in jQuery, ad esempio:

<!-- my module js -->
<script src="/modules/mod_tiles/js/jquery.isotope.min.js" type="text/javascript"></script>
<script src="/modules/mod_tiles/js/jquery.hoverintent.min.js" type="text/javascript"></script>
<script src="/modules/mod_tiles/js/mod_tiles.js" type="text/javascript"></script>
<!-- then joomla loads jQuery --->
<script src="/media/jui/js/jquery-noconflict.js" type="text/javascript"></script>
<script src="/media/jui/js/jquery.min.js" type="text/javascript"></script>

Come posso forzare Joomla a caricare jQuery prima di qualsiasi altro script?

Risposte:


15

Dovresti chiamare

JHtml::_('jquery.framework');

prima dell'altro tuo JHtml :: script. AFAIK questo assicura che jQuery sia caricato per primo.


Questa è stata l'unica soluzione che ha funzionato per me, collocata in mod_tiles.phpquesto jQuery forzato per primo. Grazie!
codinghands,


2

se ho letto correttamente la tua domanda, stai sviluppando il tuo modulo.

Prova questo, in default.php - la vista del modulo (in "tmpl"):

JHtml::stylesheet('modules/'.$module->module.'/assets/css/yourfile.css');

JHtml::script('modules/'.$module->module.'/assets/js/yourscript.js');

O questo :

JHtml::_('stylesheet', 'modules/'.$module->module.'/assets/css/anotherfile.css');

JHtml::_('script', 'modules/'.$module->module.'/assets/js/othercript.js');

In entrambi i casi, i tuoi file JS dovrebbero essere iniettati dopo jQuery, a condizione che tu abbia creato una cartella "asset" e una cartella "css" e una "js" all'interno.

La seconda soluzione è più conforme all'API joomla 3.XX.

Spero che sia d'aiuto.


L'unica modifica che ho apportato qui è stata quella di aggiungere la assetscartella - ciò non ha fatto differenze e gli script vengono ancora caricati prima di jQuery. Mi chiedo anche la saggezza nel mettere questo tipo di codice in un file modello (in particolare se ci sono più modelli che usano gli stessi script, DRY ecc.
Ecc

Ehi, il tuo commento è strano -> "inserendo questo tipo di codice in un file modello". Stavo, e forse non era abbastanza chiaro, parlando di un modulo sviluppato da te e basato su isotope.js e altri script JS. Mi dispiace molto se ho sbagliato e in realtà stai usando un modulo di terze parti chiamato mod_tiles. A proposito, ci sono altri modi per inserire script JS in un modello.
Ghazal,

Scusa, non intendevo sembrare così duro ahah! Devo essere svegliato troppo presto ... Hai ragione, è quello che sto facendo - è il mio modulo. Quello che intendevo per file modello era default.phpnella tmplcartella (modello) del modulo. Penserei che gli script dovrebbero essere caricati in mod_tiles.php(il "controller") piuttosto che default.php(la vista).
codinghands,

Inserendolo in un tmpl / default.php consente le sostituzioni. In mod_tiles.php non può essere ignorato.
sovainfo,

2

Ho riscontrato questo problema la scorsa settimana ed era correlato a dove stavo chiamando JHtml :: script. Lo stai facendo nella tua vista o nel modello della vista? Se provi ad aggiungere gli script nella vista stessa (views / yourview / view.html.php) verranno inseriti prima degli script di Joomla !, ma se aggiungi gli script nel template (views / yourview / tmpl / default.php) verranno inseriti dopo gli script di Joomla !.

In bocca al lupo!


Questo è un modulo con solo mod_tiles.php, un file helper.php e un singolo template (default.php) in tmpl. Ho provato ad aggiungere gli script sia in mod_tiles.php che in default.php - entrambi caricati prima di jQuery.
codinghands,

0

Ciò è probabilmente dovuto al metodo utilizzato dallo sviluppatore mod_tilesper importare gli script. Presumo che non si siano attenuti agli standard di codifica Joomla in questa situazione.

Hai 2 opzioni (che mi viene in mente) hwre:

  1. Se gli script vengono importati da un file all'interno della cartella tmpl all'interno del modulo, è possibile eseguire una sostituzione del modello e modificare il modo in cui lo script viene importato, utilizzando JHtml.
  2. È possibile scaricare e installare jQuery Easy che è un plug-in che importa jQuery e lo posiziona sopra tutti gli altri script.

Spero che questo ti aiuti


Ho sviluppato il modulo: quale metodo dovrei usare? L'ho fatto in una domanda ( joomla.stackexchange.com/questions/325/… ) e mi è stato detto che JHtml :: script era la strada da percorrere.
codinghands,

0

Volevo aggiungere i miei due bit dopo il fatto. Ho un paio di script e fogli di stile che devono essere caricati per ogni vista che abbiamo nel componente, e volevo che un singolo punto accadesse, assicurando anche che siano caricati nella sequenza corretta.

Nel file components\myComponent\mycomponent.php:

defined('_JEXEC') or die;

// Include dependancies
jimport('joomla.application.component.controller');

JHtml::stylesheet('http://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css', array(), true);
JHtml::stylesheet('components/com_mycomponent/assets/css/mycomponent.css');

JHtml::_('jquery.framework');   // Make sure jQuery is loaded before component JS
JHtml::script( 'components/mycomponent/assets/js/jquery.cookie.js');

// Execute the task.
$controller = JControllerLegacy::getInstance('Mycomponent');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();

-1

So che questo è un vecchio argomento ma sei mai arrivato in fondo a questo? Ho appena avuto lo stesso problema. Ho identificato la CAUSA ma non il problema / soluzione; Ho un'occhiatina sospetta che si tratti di un ERRORE ma potrebbe essere utilizzato da qualcun altro che lo prova.

Scenario: hai creato un modulo che include uno script dipendente da jQuery in modo da utilizzare quanto segue nella vista default.php:

$doc = JFactory::getDocument();
$doc->addScript("media/mod_accordion/js/accordion.js");

Quindi installare il modulo e assegnargli una posizione, diciamo 'a sinistra'. Quando si osserva il codice sorgente del front-end, tutto sembra a posto, tutti gli script vengono caricati dopo gli script inclusi in

JHtml::_('bootstrap.framework');

TUTTAVIA se si assegna al modulo una posizione "fisarmonica" e si utilizza la funzione di posizionamento del carico di joomla per aggiungere il modulo a un articolo

{loadposition accordion}

quindi accordion.js viene aggiunto PRIMA dei file bootstrap.framework.

L'unico modo in cui sono stato in grado di impedirgli di funzionare è quello di aggiungere lo script come script inline anziché essere incluso nella testa.

EDIT: lo stesso vale per l'inclusione del CSS; viene aggiunto in cima all'elenco della dichiarazione CSS (prima dei file CSS modello e bootstrap). Il trucco per questo è quello di aggiungere! Importante alle dichiarazioni 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.