在Joomla 3中的其他Javascript之前加载jQuery

时间:2012-10-25 22:36:30

标签: joomla joomla-extensions joomla3.0

我正在调整自定义组件到Joomla 3.它依赖于我以前加载的jQuery。现在它已包含在基本模板中,我不需要。但是,我首先加载了依赖于jQuery的自定义javascript。我使用以下表单加载它们:

$document = JFactory::getDocument();
$document->addScript( PATH TO SCRIPT);

这正确地将它们包含在<head>元素中,但它们在jQuery之前加载。

有些快速搜索会在abstract class JHtmlJquery中显示libraries/cms/html/jquery.php,但我不确定这是从哪里来的。

如何更改加载顺序以便在依赖它的脚本之前加载jQuery?我可以不进入核心代码吗?

4 个答案:

答案 0 :(得分:10)

马里奥的答案正朝着正确的方向发展,但它并没有做到这一点。事实证明,在加载其他脚本之前,您必须在组件中包含JHtml::('bootstrap.framework'); 的代码(而不仅仅是模板文件)。我使用的是库存J3模板protostar,其中包括twitter bootstrap在其模板index.php中。

我的自定义view.html.php的代码现在如下:

class MyView extends JViewLegacy
{
    function display($tpl = null)
    {
        $document = JFactory::getDocument();
        JHtml::_('bootstrap.framework');

        $document->addScript( PATH_TO_SCRIPT );

        ...
    }
}

此操作符合预期,jQuery和Bootstrap文件(jquery.min.jsjquery-noconflict.jsbootstrap.min.js)包含在我的自定义脚本之前的<head>中。

答案 1 :(得分:6)

我找到了解决方案。我不想要模板和组件加载bootstrap,加上只是加载一些模块的单篇文章的页面,我不想让每个模块加载bootstrap ...(我的意思是这是有点荒谬..)所以我决定完全从模板中取出引导程序,我构建了一个只加载bootstrap的系统插件,然后我设置插件的加载顺序首先加载。效果很好..

// Bootstrap Loader


    jimport('joomla.plugin.plugin');

    class plgSystemBootstrapLoader extends JPlugin {

        function onAfterRoute() {

            // Load Bootstrap
            JHtml::_('bootstrap.framework');
            $document = JFactory::getDocument();
            $document->addStyleSheet('/media/jui/css/bootstrap.min.css');
            $document->addStyleSheet('/media/jui/css/bootstrap-responsive.css');
        }

    }

答案 2 :(得分:2)

您使用的是什么模板?在J3中,在页面底部加载jQuery平台是一种常识,因此页面加载速度更快。在模板中查找 JHtml::_('bootstrap.framework'); // Loads the jQuery js scripts 并在此之后尝试加载你的js。

答案 3 :(得分:1)

Joomla可能会按照$document->addScript( PATH TO SCRIPT);方式编写的脚本和css文件按照添加顺序编写,执行组件和模块代码。

我搜索了一下,却找不到影响单独声明或jQuery加载的方法。但我可以提供其他解决方案。

我不能说我确定这将成为您问题的解决方案,因为我无法知道您的代码是做什么的,或者什么时候需要做某些事情。所以我可以进行最广泛的修复;)

只要您的代码在页面就绪之前不必处于活动状态,这将有效。

将自定义代码包装在js on ready语句中,因此在页面(以及jQuery已加载)之前它不会执行任何操作。

if (document.readyState === "complete") { 
    DoYourStuff(); 
}