尝试在 Joomla 中使用 HeadJS。我在模板中添加了一段代码 - 它获取 head 输出中的 javascript 文件,准备一个字符串以在 head.js 代码之间输出它们,然后从 joomla 的 head 输出标记中删除所有 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>
不同的扩展可以连接到处理输出期间触发的不同事件(因此即使在渲染模板之后)。
到目前为止,我发现的最佳选择是创建系统插件并将其顺序移动为最后一个可用的系统插件。
现在您有两个选择:
如果您在完全控制网站的情况下使用异步脚本加载,这很好,但几乎不可能实现为 Joomla 的通用扩展。有些扩展在 head 中使用内联脚本,有些在 html body 中使用内联脚本,您必须保留执行顺序(简单的示例:Mootools 必须首先加载)。
我通常只异步加载那些我自己包含的脚本(在我的模板或扩展中)。任何使用 Joomla 核心(Mootools、core.js 等)或其他扩展添加的脚本我不碰。