通常在 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 是預設值,也就是我之前一直遇到的問題,被擺在 <head> 起始標簽之後。
考慮到前端的效能,雖然這三個位子我都不是很滿意...,
但還是選擇將 javascript 放在頁面底部,也就是使用 POS_END 的位子。
registerScriptFile 的 $position 是第二個參數,用的時候可以這樣用:
但我發現 coreScriptPosition 不能像 registerScriptFile 這樣寫(至少我寫了沒有用...),在網路上後來查到有人這樣寫,我改了之後也真的能 work:
如此一來,已經可以控制 js 不要亂跑了,至少可以控制將它們統一放到頁面最底部在載入。
如果有更好的方法,歡迎讓我知道 :D 感謝!
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