Jhtml :: orden de script: ¿cómo posponer hasta que se haya cargado jQuery?

11

Solía JHtml::scriptagregar scripts a mis páginas en un módulo desarrollado a medida. Sin embargo, estos scripts se inyectan en la cabeza antes de que J3 agregue jQuery, por ejemplo:

<!-- 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>

¿Cómo puedo forzar a Joomla a cargar jQuery antes que cualquier otro script?

codinghands
fuente

Respuestas:

15

Deberías llamar

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

antes de su otro JHtml :: script. AFAIK esto asegura que jQuery se cargue primero.

Fruppel
fuente
Esta fue la única solución que funcionó para mí, colocada en mod_tiles.phpeste jQuery forzado a cargar primero. ¡Gracias!
codinghands
1
@codinghands docs.joomla.org/…
Ville Niemi
2

Si leo su pregunta correctamente, está desarrollando su propio módulo.

Pruebe esto, en default.php - la vista del módulo (en "tmpl"):

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

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

O esto :

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

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

En ambos casos, sus archivos JS deben inyectarse después de jQuery, siempre que haya creado una carpeta "activo" y una carpeta "css" y una "js" dentro.

La segunda solución está más de acuerdo con joomla 3.XX API.

Espero eso ayude.

ghazal
fuente
El único cambio que hice aquí fue agregar la assetscarpeta, esto no fue diferente, y los scripts aún se cargan antes de que jQuery lo haga. También me pregunto sobre la sabiduría de poner este tipo de código en un archivo de plantilla (especialmente si hay varias plantillas que usan los mismos scripts, DRY, etc.)
codinghands
Hem, tu comentario es extraño -> "poner este tipo de código en un archivo de plantilla". Estaba, y tal vez no fue lo suficientemente claro, hablando de un módulo desarrollado por usted y basado en isotope.js y otros scripts JS. Lamento mucho haberme equivocado y en realidad estás usando un módulo de terceros llamado mod_tiles. Por cierto, hay otras formas de insertar scripts JS en una plantilla.
ghazal
Lo siento, no quise sonar tan duro jaja! Debe haber estado despierto demasiado temprano ... Tienes toda la razón, eso es lo que estoy haciendo, es mi módulo. Lo que quise decir con archivo de plantilla estaba default.phpen la tmplcarpeta (plantilla) del módulo. Pensé que los scripts deberían cargarse en mod_tiles.php(el 'controlador') en lugar de default.php(la vista).
codinghands
Colocarlo en un tmpl / default.php permite anulaciones. En mod_tiles.php no se puede anular.
sovainfo
2

Me encontré con este problema la semana pasada y estaba relacionado con el lugar al que estaba llamando JHtml :: script. ¿Estás haciendo esto en tu vista o en la plantilla de la vista? Si intenta agregar los scripts en la vista misma (views / yourview / view.html.php), se insertarán antes que los propios scripts de Joomla!, Pero si agrega los scripts en la plantilla (views / yourview / tmpl / default.php) se insertarán después de los scripts de Joomla!

¡Buena suerte!

Draper Zachary
fuente
Este es un módulo con solo mod_tiles.php, un archivo helper.php y una sola plantilla (default.php) en tmpl. Intenté agregar los scripts tanto en mod_tiles.php como en default.php, ambos se cargan antes de jQuery.
codinghands
0

Esto probablemente se deba al método que el desarrollador de mod_tilesha utilizado para importar los scripts. Supongo que no se han apegado a los estándares de codificación de Joomla en esta situación.

Tienes 2 opciones (que se me ocurren) hwre:

  1. Si las secuencias de comandos se importan desde un archivo dentro de la carpeta tmpl dentro del módulo, puede realizar una anulación de plantilla y cambiar la forma en que se importan las secuencias de comandos, utilizando JHtml.
  2. Puede descargar e instalar jQuery Easy, que es un complemento que importa jQuery y lo coloca por encima de todos los demás scripts.

Espero que esto ayude

Lodder
fuente
Desarrollé el módulo. ¿Qué método debo usar? Hice esto en una pregunta ( joomla.stackexchange.com/questions/325/… ) y me dijeron que JHtml :: script era el camino a seguir.
codinghands
0

Quería agregar mis dos bits después del hecho. Tengo un par de scripts y hojas de estilo que deben cargarse para cada vista que tengamos en el componente, y quería un solo punto para que eso ocurra asegurando también que se carguen en la secuencia correcta.

En el archivo 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();
PIB
fuente
-1

Sé que este es un tema antiguo, pero ¿alguna vez llegaste al fondo de esto? Acabo de experimentar el mismo problema. He identificado la CAUSA pero no el problema / solución; Tengo una sospecha disimulada de que es un ERROR, pero podría hacerlo con alguien más probándolo.

Escenario: ha creado un módulo que incluye un script dependiente de jQuery, por lo que utiliza lo siguiente en su vista default.php:

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

Luego instala el módulo y le da una posición de módulo, digamos 'izquierda'. Cuando mira el código fuente del front-end, todo se ve bien, todos los scripts se cargan después de los scripts que se incluyen en

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

SIN EMBARGO si le da al módulo una posición 'acordeón' y usa la función de posición de carga de joomla para agregar el módulo a un artículo

{loadposition accordion}

entonces accordion.js se agrega ANTES de los archivos bootstrap.framework.

La única forma en que he podido adaptarlo al trabajo es agregar el script como un script en línea en lugar de ser incluido en la cabeza.

EDITAR: lo mismo va para incluir el CSS; se agrega a la parte superior de la lista de declaraciones css (antes de los archivos css de plantilla y bootstrap). El objetivo de esto es agregar! Importante a las declaraciones CSS.

philip
fuente