2013-09-22 96 views
1

在Google的PageSpeed報告中,有一些攔截JavaScript需要是異步的。從this article我知道我必須同步屬性的地方,我的腳本標籤:CahePHP向腳本標記添加異步

<script async src="http://third-party.com/resource.js"></script> 

在CakePHP中,我不能夠準確地做到這一點,我就能夠得到:

<script async="async" src="http://third-party.com/resource.js"></script> 

使用在HTML的腳本方法如下:

$html->script(array('jsfile1', 'jsfile2'), array('async' => 'async')); 

我試圖array('async')但它在腳本標籤打印出0 =「0」

我怎樣才能讓它在腳本標籤中打印async。另外,我怎樣才能使它在CSS的鏈接標籤中也可用?

注意:我使用CakePHP 1.3倍

+0

我找這CakePHP的2.0 – Gunaseelan

回答

5

Checking the source code表明,有沒有辦法實現這樣的標籤,因爲它明顯,屬性的格式是%s="%s"

如果你真的需要這個我想現在最簡單的方法是通過擴展核心HtmlHelper提供你自己定製的HtmlHelper,並覆蓋_formatAttribute功能:

注:這是CakePHP的1.3.x版僅這很麻煩,因爲它不能在helpers數組中指定className。 CakePHP的2.x的提供覆蓋自如默認核心幫手清潔的方式,但它不是什麼OP想要所以我沒有把它放在這兒

  1. 創建app/views/helpers/custom_html.php

    <?php 
    App::import('Helper', 'Html'); 
    class CustomHtmlHelper extends HtmlHelper { 
        function __formatAttribute($key, $value, $escape = true) { 
         if (in_array($key, array('async', 'defer'))) { 
          return $key; 
         } 
         return parent::__formatAttribute($key, $value, $escape); 
        } 
    } 
    
  2. 在需要這個您的app_controller.php或任何主控制器,使用CustomHtmlHelper通過:

    var $helpers = array('CustomHtml'); 
    
  3. 在您看來,您現在可以開始使用asyncdefer標籤。如果您覺得合適,請隨意擴展此陣列。

    echo $this->CustomHtml->script('test', array('async' => 'async')); 
    
+0

非常感謝你,它開闢了新的領域對我來說。 – SaidbakR

+0

@Lionel Chan。感謝您的回答。如何添加異步並將參數推遲到cakephp 2.x中的腳本?你說cakephp 2.x有一個更清潔的方法。你可以解釋嗎? – Gunaseelan

+0

@Gunaseelan不幸的是,也沒有簡單的方法來做到這一點。您需要對HtmlHelper進行類似的覆蓋。我當時的意思是,你可以在控制器的$ helpers數組中指定「className」,這樣你仍然可以在你的視圖中使用'$ this-> Html-> script',並且你可以使用「增強」進入自定義類。檢查配置在這裏:http://book.cakephp.org/2.0/en/views/helpers.html#using-and-configuring-helpers(搜索'className') –