1

尝试在 Joomla中使用HeadJS 。我在我的模板中添加了一个代码——它抓取头输出中的 javascript 文件,准备一个字符串以在 head.js 代码之间输出它们,然后从 joomla 的头输出标签中删除所有 javascript 文件。

问题是在模板之后加载了一些脚本。例如,一个模块将在模板加载后将一些脚本文件排入队列,因此它的文件出现在我的 head.js 代码之外。有什么想法可以控制吗?

$data = $this->getHeadData();

if( $data['scripts'] ){
    foreach ($data['scripts'] as $url=>$type){
        if( !strstr($url, 'ajax.googleapis.com/ajax/libs/jquery') )
        $headjs[] = $url;
    }
    unset( $data['scripts'] );
    $data['scripts'][$template . '/js/head.js'] = array(
        'mime' => 'text/javascript',
        'defer' => false,
        'async' => false);
    $this->setHeadData($data);
}

接着...

 <script>
        head.js(
        <? foreach($headjs as $script): ?>
            '<?=$script?>',
        <? endforeach; ?>
            function(){
            }
        );
    </script>
4

1 回答 1

2

不同的扩展可以连接到在处理输出期间触发的不同事件(即使在模板被渲染之后)。

到目前为止我发现的最佳选择是创建系统插件并将其移动到最后一个可用的系统插件。

现在你有两个选择:

  1. 使用onBeforeCompileHead事件(我猜引入了 Joomla 1.5.23)将脚本移动到 headjs。
  2. 使用onAfterRender事件并解析 head html 代码,以便使用 headjs 加载它。

如果您在完全控制网站的情况下加载异步脚本,这很好,但几乎不可能实现为 Joomla 的通用扩展。一些扩展在头部使用内联脚本,一些在 html 正文中,您必须保留执行顺序(简单示例:Mootools 必须首先加载)。

我过去只异步加载那些我自己包含的脚本(在我的模板或我的扩展中)。使用 Joomla 核心(Mootools、core.js 等)或其他我不涉及的扩展添加的任何脚本。

于 2011-10-25T12:01:04.177 回答