29 октября 2009

Оптимизируем сайт убирая загрузку MooTools

Думаю многие из вас смотрели html-код своего сайта в браузере и замечали следующие строки:
<script type="text/javascript" src="/yalta/media/system/js/mootools.js"></script>

mootools.js — собственно MooTools, размером в 74кб.

Всё хорошо когда оно используется, а используется оно наверняка если у вас стоит какой-то коммерческий шаблон, либо установлен какой-то продвинутый ротатор изображений. Если вы точно уверены, что MooTools вам не нужен или вы вообще фанат JQuery, то описанное ниже для вас.

Из-за того, что мы будет вырезать Mootools, нам так же придётся вырезать загрузку плагина для MooTools «caption.js», который реализует возможность всплывающих подсказок. Этот функционал в чистой Joomla гостям нигде не доступен (доступен лишь в компоненте com_content пользователям с правами «Автор» и выше), поэтому убираем загрузку «mootools.js» и «caption.js» для гостей:
1) В файле index.php шаблона перед строкой <jdoc:include type=«head» /> добавим:
<?php
$user =& JFactory::getUser();
if ($user->get('guest') == 1) {
  $headerstuff = $this->getHeadData();
  $scripts = $headerstuff['scripts'];
  $headerstuff['scripts'] = array();
  foreach($scripts as $url=>$type) {
    if (strpos($url, 'js/mootools.js') === false && strpos($url, 'js/caption.js') === false) {
      $headerstuff['scripts'][$url] = $type;
    }
  }
  $this->setHeadData($headerstuff);
}
?>

Заметьте: если в вашем шаблоне есть строка <?php JHTML::_('behavior.mootools'); ?> то ваш шаблон используется MooTools, поэтому удалять его не следует.

Иногда бывает необходимость удалить загрузку MooTools для какого-то конкретного компонента, например в Community Builder используется JQuery и загружать просто так MooTools очень не здоровое действие:
1) В файле index.php шаблона перед строкой <jdoc:include type=«head» /> добавим:
<?php
JHTML::_('behavior.mootools');
if ($option == 'com_comprofiler') {
  $headerstuff = $this->getHeadData();
  $key = JURI::base( true ) . '/media/system/js/mootools.js';
  unset( $headerstuff['scripts'][$key] );
  $this->setHeadData( $headerstuff );
}
?>


2) Решение для самых отчаянных, которые хотят вырезать загрузку любых скриптов:
<?php
JHTML::_('behavior.mootools');
$document =& JFactory::getDocument();
if ($option == 'com_comprofiler') {
    $parameter_script = 'scripts';
    $headerstuff=$document->getHeadData();
     reset($headerstuff[$parameter_script]);
     foreach($headerstuff[$parameter_script] as $key=>$value){
        unset($headerstuff[$parameter_script][$key]);
     }
     $document->setHeadData( $headerstuff );
}
?>
+1

Комментарии:8

avatar
Всё равно его не брошу… :)
Mootools, конечно, «тяжеловат», но визуально он выглядит симпатичнее JQuery.
А для заказчиков это часто решает роль ;)
avatar
не, тут всё проще. кто знает mootools или jquery тот красоту может сделать и там и там. другое дело что mootools у нас мало кто знает так как исторически сложилось что jquery у нас стал популярнее. ну собственно и на западе так, и сервисы есть для поиска плагинов, у mootools с этим намного хуже.
avatar
Иногда бывает необходимость удалить загрузку MooTools для какого-то конкретного компонента...
У меня один из компонентов использует prototype. Можно ли их как нибудь подружить, или хотя бы разделить по компонентам?
И если не сложно, разжуйте код. Спасибо!
avatar
С сутью кода разобрался, но он отключает mootools для всей страницы, а мне надо, чтобы он был отключен только для одного модуля, другой же, стоящий выше должен его использовать
avatar
Ну так суть в том, что метод отключает загрузку на определённо странице (компоненте), а у модуля нет страниц, он публикуется на определённой странице. А что у вас prototype конфликтует с mootools?
avatar
Наглухо убивает, и в общем не мудрено. А надо. Как бы запустить prototype в изолированной «песочнице»? В отличии от jQuery функции совместимости в нем нет.
avatar
  • toorr2p
  • 21 января 2011, 07:40
  • 0
Вот еще пример для Joomla 1.6
avatar
Где? :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.