Desenvolvi recentemente um módulo que exigia a injeção de certos arquivos JS e CSS no <head>
de cada página. Inicialmente, usei:
$doc =& JFactory::getDocument();
$doc->addScript(JURI::base(true).'/modules/mod_x/js/mod_x.js');
No entanto, notei que, quando o armazenamento em cache estava ativado, o site carregava uma versão em cache e uma versão /cache
em cache /modules/mod_x/js/
, causando erros de JS.
Quando mudei isso para:
JHtml::script(Juri::base().'modules/mod_x/js/mod_x.js');
O script foi carregado apenas uma vez, do cache, resolvendo esses erros.
Eu li nos documentos que o addScript
método era mais 'baixo nível' do que o JHtml:script
método, mas além de dizer que ...
Obviamente, você também precisará codificar manualmente algumas das etapas [que JHtml: script faz por você] que seriam executadas automaticamente usando o [método JHtml: script] acima [se você usar o addScript].
... nenhum detalhe adicional é fornecido.
Então qual a diferença? Suponho que JHtml:script
eventualmente chame addScript
um objeto de documento em algum momento, mas outras etapas intermediárias são executadas primeiro?
fonte
Respostas:
JHtml::script
possui lógica adicional incluída. Consulte http://api.joomla.org/cms-3/classes/JHtml.html#method_script para obter a referência da APIPor padrão, ele detecta a configuração de depuração e o navegador usado e carrega o script correspondente. Por exemplo, quando a depuração estiver ativada, será carregada uma versão não compactada do arquivo, se presente.
Existem configurações opcionais que permitem substituir o arquivo no nível do modelo e outras coisas.
Michael Babker escreveu um bom guia de como usar
JHtml::script()
para permitir substituições: http://www.babdev.com/blog/139-use-the-media-folder-allow-overridable-mediaFunção no repositório para referência: https://github.com/joomla/joomla-cms/blob/staging/libraries/cms/html/html.php#L659
Página oficial do documento que agora é atualizada por George: http://docs.joomla.org/J3.3:Adding_JavaScript_and_CSS_to_the_page
fonte
em duas palavras:
JHtml::script()
- permite substituir o script específico (exceto o que já está anexado ao JDocument), depende de alguns fatores (consulte a resposta do @Bakual);$doc->addScript()
- anexar script diretamente ao documento, sem verificar uma substituição;Se você é o desenvolvedor da extensão, use altamente recomendado
JHtml::script()
ao adicionar o script. Isso permitirá que seus usuários substituam alguns scripts específicos, dependendo do que eles desejam.Também existe um método semelhante para css.
fonte