2013年10月28日 星期一

改變 yii 的 registerScriptFile/registerCoreScript 的檔案出現位置...

通常在 yii 載入其他 JavaScript 或是 CSS 檔案,都會用
Yii::app()->clientScript->registerCoreScript('jquery'); 
或是
Yii::app()->clientScript->registerScriptFile(Yii::app()->request->baseUrl.'/js/admin/bootstrap.min.js');

但是用這兩種方法載入 JavaScript 或是 CSS 的位置都很讓我頭疼...,完全插入在 <head>標籤之後。



這樣的安插位子有時候實在很讓人不解,因為這樣瀏覽器要 render 我的頁面的時候是這樣:




出現了這個 render 不一致的問題之後,pageSpeed 也告訴我了...
(有可能是因為載入 js/css 的順序可能太雜亂了。)




雖然我也能寫 hardcode ,完全不考慮使用 registerScriptFile 等的方式,可是這對 widget 來說,挺麻煩的,因為當我想控制某個 widget 才派上用場時,我還是需要再透過 registerScriptFile 載入該 widget 需要的 js/css ,但是這樣載入的順序會錯亂。

後來官方文件有提供解法是帶入 position 的參數,可以決定該 script 載入的位置。
http://www.yiiframework.com/doc/api/1.1/CClientScript


但是提供的 position 實在也差強人意...
以 registerScriptFile 來說,總共提供 3 種 $positoon:

  • POS_HEAD
  • POS_BEGIN
  • POS_END


比較一下這三者個位置:
POS_HEAD 是預設值,也就是我之前一直遇到的問題,被擺在 <head> 起始標簽之後。
考慮到前端的效能,雖然這三個位子我都不是很滿意...,
但還是選擇將 javascript 放在頁面底部,也就是使用 POS_END 的位子。







registerScriptFile 的 $position 是第二個參數,用的時候可以這樣用:
  <?php   
   Yii::app()->clientScript->registerScriptFile(  
     Yii::app()->request->baseUrl.'/js/your.js',   
     CClientScript::POS_END);   
 ?>  

但我發現 coreScriptPosition 不能像 registerScriptFile 這樣寫(至少我寫了沒有用...),在網路上後來查到有人這樣寫,我改了之後也真的能 work:
 <?php   
   Yii::app()->clientScript->coreScriptPosition=CClientScript::POS_END;  
   Yii::app()->clientScript->registerCoreScript('jquery');   
 ?>  

如此一來,已經可以控制 js 不要亂跑了,至少可以控制將它們統一放到頁面最底部在載入。
如果有更好的方法,歡迎讓我知道 :D 感謝!


沒有留言:

張貼留言

若你看的文章,時間太久遠的問題就別問了,因為我應該也忘了... XD

Vue multiselect set autofocus and tinymce set autofocus

要在畫面一進來 focus multiselect 的方式: 參考: https://jsfiddle.net/shentao/mnphdt2g/ 主要就是在 multiselect 的 tag 加上 ref (例如: my_multiselect), 另外在 mounted...