2011-08-31 71 views
1

試圖在Joomla中使用HeadJS。我在模板中添加了一個代碼 - 它抓取頭部輸出中的javascript文件,準備一個字符串在head.js代碼之間輸出它們,然後從joomla的頭部輸出標籤中刪除所有javascript文件。如何在Joomla上使用headjs?

問題是某些腳本在模板後加載。例如,一個模塊會在模板加載後加入一些腳本文件,所以它的文件會出現在我的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> 

回答

2

,不同的擴展可以連接到正在處理的輸出(模板呈現,這樣即使以後)時觸發不同的事件。

到目前爲止,我發現的最佳選擇是創建系統插件並將其移動到可用系統插件的最後一個位置。

現在你有兩個選擇:

  1. 使用onBeforeCompileHead事件(我猜推出的Joomla 1.5.23)移動腳本headjs。
  2. 使用onAfterRender事件和解析頭HTML代碼,所以它使用headjs加載。

這很好,如果你打開異步腳本來加載你對網站有完全控制的地方,但它幾乎不可能作爲Joomla的通用擴展來實現。一些擴展在head中使用內聯腳本,一些在HTML body中,你必須保持執行的順序(簡單的例子:Mootools必須首先加載)。

我使用異步加載只包含我自己的腳本(在我的模板或我的擴展中)。任何與Joomla核心(Mootools,core.js等)或其他擴展我都無法觸及的腳本。