Niedawno opracowałem moduł, który wymagał wstrzykiwania niektórych plików JS i CSS do <head>
każdej strony. Początkowo użyłem:
$doc =& JFactory::getDocument();
$doc->addScript(JURI::base(true).'/modules/mod_x/js/mod_x.js');
Zauważyłem jednak, że po włączeniu buforowania witryna załadowała zarówno wersję buforowaną, jak /cache
i wersję niebuforowaną /modules/mod_x/js/
, powodując błędy JS.
Kiedy zmieniłem to na:
JHtml::script(Juri::base().'modules/mod_x/js/mod_x.js');
Skrypt został załadowany tylko raz, z pamięci podręcznej, usuwając te błędy.
I czytać w docs że addScript
metoda była bardziej „niski poziom” niż JHtml:script
metoda, ale poza mówiąc, że ...
Oczywiście będziesz musiał ręcznie zakodować niektóre kroki [które robi dla ciebie skrypt JHtml:], które zostałyby wykonane automatycznie przy użyciu powyższej [JHtml: metoda skryptowa] [jeśli używasz addScript].
... nie podano dalszych szczegółów.
Jaka jest różnica? Zakładam, że JHtml:script
ostatecznie wywołuje addScript
obiekt dokumentu w pewnym momencie, ale czy najpierw są podejmowane inne kroki pośrednie?
źródło
Odpowiedzi:
JHtml::script
zawiera dodatkową logikę. Zobacz http://api.joomla.org/cms-3/classes/JHtml.html#method_script w celu uzyskania informacji o interfejsie APIDomyślnie wykrywa ustawienia debugowania i używanej przeglądarki oraz ładuje pasujący skrypt. Na przykład, kiedy debugowanie jest włączone, załaduje nieskompresowaną wersję pliku, jeśli jest obecny.
Istnieją opcjonalne ustawienia, które pozwalają przesłonić plik na poziomie szablonu i inne rzeczy.
Michael Babker napisał dobry przewodnik, w jaki sposób używać,
JHtml::script()
aby umożliwić zastąpienia: http://www.babdev.com/blog/139-use-the-media-folder-allow-overridable-mediaFunkcja w repozytorium w celach informacyjnych: https://github.com/joomla/joomla-cms/blob/staging/libraries/cms/html/html.php#L659
Oficjalna strona z dokumentami, która jest teraz aktualizowana przez George'a: http://docs.joomla.org/J3.3:Adding_JavaScript_and_CSS_to_the_page
źródło
w dwóch słowach:
JHtml::script()
- pozwalają na przesłonięcie określonego skryptu (oprócz tego już dołączonego do JDocument), zależą od niektórych czynników (patrz @Bakual odpowiedź);$doc->addScript()
- dołącz skrypt bezpośrednio do dokumentu, bez sprawdzania zastąpień;Jeśli jesteś programistą rozszerzeń, wysoce zalecane jest użycie go
JHtml::script()
podczas dodawania skryptu. Pozwoli to użytkownikom zastąpić niektóre skrypty, w zależności od tego, czego chcą.Istnieje również podobna metoda dla css.
źródło