Jhtml :: ordem dos scripts - como adiar até que o jQuery seja carregado?


11

Eu uso JHtml::scriptpara adicionar scripts às minhas páginas em um módulo desenvolvido sob medida. No entanto, esses scripts são injetados na cabeça antes que o J3 adicione o jQuery - por exemplo:

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

Como forçar o Joomla a carregar o jQuery antes de outros scripts?

Respostas:


15

Você deveria ligar

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

antes do seu outro JHtml :: script. AFAIK, garante que o jQuery seja carregado primeiro.


Essa foi a única solução que funcionou para mim - colocada mod_tiles.phpnesse jQuery forçado a carregar primeiro. Obrigado!
codinghands


2

se eu li sua pergunta corretamente, você está desenvolvendo seu próprio módulo.

Tente isso, em default.php - a visão do módulo (em "tmpl"):

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

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

Ou isto :

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

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

Nos dois casos, os arquivos JS devem ser injetados após o jQuery, desde que você tenha criado uma pasta "asset" e uma pasta "css" e "js" dentro.

A segunda solução está mais de acordo com a API do joomla 3.XX.

Espero que ajude.


A única alteração que fiz aqui foi adicionar a assetspasta - isso não foi diferente, e os scripts ainda carregam antes do jQuery. Gostaria também de saber sobre a sabedoria em colocar este tipo de código em um arquivo de modelo (especialmente se houver vários modelos usando os mesmos scripts, DRY etc etc.)
codinghands

Hem, seu comentário é estranho -> "colocando esse tipo de código em um arquivo de modelo". Eu estava, e talvez não esteja claro o suficiente, falando sobre um módulo desenvolvido por você e baseado no isotope.js e outros scripts JS. Sinto muito se eu estava errado e você está realmente usando um módulo de terceiros chamado mod_tiles. BTW, existem outras maneiras de inserir scripts JS em um modelo.
precisa

Desculpe, eu não quis parecer tão duro, haha! Deve ter acordado cedo demais ... Você está exatamente certo, é isso que estou fazendo - é o meu módulo. O que eu quis dizer com arquivo de modelo estava default.phpna tmplpasta (modelo) do módulo. Eu pensaria que os scripts deveriam ser carregados mod_tiles.php(o 'controlador') e não default.php(a exibição).
codinghands 12/06

Colocá-lo em um tmpl / default.php permite substituições. No mod_tiles.php, não pode ser substituído.
#

2

Eu encontrei esse problema na semana passada e estava relacionado a onde eu estava chamando JHtml :: script. Você está fazendo isso na sua visualização ou no modelo da visualização? Se você tentar adicionar os scripts na própria exibição (views / yourview / view.html.php), eles serão inseridos antes dos scripts do Joomla !, mas se você adicionar os scripts no modelo (views / yourview / tmpl / default.php) eles serão inseridos após os scripts do Joomla!

Boa sorte!


Este é um módulo com apenas mod_tiles.php, um arquivo helper.php e um único modelo (default.php) em tmpl. Tentei adicionar os scripts em mod_tiles.php e default.php - ambos carregavam antes do jQuery.
codinghands

0

Provavelmente, isso se deve ao método mod_tilesusado pelo desenvolvedor para importar os scripts. Eu suponho que eles não aderiram aos padrões de codificação Joomla nesta situação.

Você tem 2 opções (que eu posso pensar) hwre:

  1. Se os scripts estiverem sendo importados de um arquivo na pasta tmpl do módulo, você poderá executar uma Substituição de Modelo e alterar a maneira como o script está sendo importado, usando JHtml.
  2. Você pode baixar e instalar o jQuery Easy, que é um plugin que importa o jQuery e o coloca acima de todos os outros scripts.

Espero que isto ajude


Eu desenvolvi o módulo - que método devo usar? Eu fiz isso em uma pergunta ( joomla.stackexchange.com/questions/325/… ) e me disseram que JHtml :: script era o caminho a seguir.
codinghands

0

Eu queria adicionar meus dois bits depois do fato. Eu tenho alguns scripts e folhas de estilo que precisam ser carregados para todas as visualizações que temos no componente e queria que um único ponto acontecesse, garantindo também que eles fossem carregados na sequência correta.

No arquivo 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

Eu sei que esse é um tópico antigo, mas você já chegou ao fundo disso? Acabei de experimentar o mesmo problema. Eu identifiquei a causa, mas não o problema / solução; Eu tenho uma suspeita sorrateira de que é um erro, mas poderia fazer com alguém tentar isso.

Cenário: você criou um módulo que inclui um script dependente de jQuery para usar o seguinte na visualização default.php:

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

Você instala o módulo e coloca uma posição no módulo, digamos 'left'. Quando você olha para o código-fonte do front-end, tudo fica bem, todos os scripts são carregados após os scripts incluídos no

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

No entanto, se você der ao módulo uma posição 'acordeão' e usar o recurso de posição de carga do joomla para adicionar o módulo a um artigo

{loadposition accordion}

então o accordion.js é adicionado ANTES dos arquivos bootstrap.framework.

A única maneira de conseguir que ele funcione é adicionar o script como um script embutido, em vez de ser incluído na cabeça.

EDIT: o mesmo vale para incluir o css; está sendo adicionado ao topo da lista de declaração css (antes dos arquivos css de modelo e de inicialização). O problema é que isso é importante para as declarações css.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.