javascript
经验总结:按需加载JS和css
項目中做過這樣的事情:所有頁面都通過SSI指令 include這樣一份public-js.shtml, 用來引入涉及到的js(包括公共的腳本 驗證插件 自定義組件等),但是一些沒有交互效果的頁面根本不需要用到這些腳本,所以造成腳本冗余較大(盡管可以從緩存讀取,但還是應(yīng)該盡量減少沒用到的腳本為佳)
public-js.shtml
<!--#config timefmt="%Y%m%d%H%M%S"-->
<script type="text/javascript" src="/js/jquery1.6.js?v=<!--#flastmod virtual='/js/jquery1.6.js' -->" ></script>
<!-- <script type="text/javascript" src="/js/core.js?v=#flastmod virtual='/js/core.js'" ></script>
-->
<script type="text/javascript" src="/js/public.js?v=#flastmod virtual='/js/public.js'" ></script>
<!-- 加載組件 -->
<!--#include virtual="/include/component.shtml" -->
<!-- 加載表單驗證插件 -->
<!--#include virtual="/include/nicevalidator.shtml" -->
<!-- 頁面通用函數(shù) -->
<!--#include virtual="/include/page-js.shtml" -->
?
為了實現(xiàn)組件和驗證插件的按需加載,定義這么一個函數(shù)loadJsCss
// 表單驗證插件 動態(tài)加載
function loadValidator(callback){// 加載nicevalidator插件
loadJsCss("/css/nicevalidator.css");
loadJsCss("/js/nicevalidator.js", callback);
}
// 組件動態(tài)加載
function loadComponent(callback){// 加載自定義組件
loadJsCss("/css/component.css");
loadJsCss("/js/component.js", callback);
}
但是發(fā)現(xiàn)每個驗證方法或組件的調(diào)用都要放到回調(diào)函數(shù)內(nèi)部,實在笨拙,而且改起來也很麻煩。如:
loadValidator(function(){ $('#frm').validator({...}););
loadComponent(function(){ $.Tab({...}); );
?
經(jīng)過嘗試發(fā)現(xiàn)可以保持頁面原有的調(diào)用方式,只需在public.js公共js文件中定義相同接口即可:
(function(){$.fn.validator = function(){var args = arguments, self = this;loadValidator(function(){//~~~初始狀態(tài)fn.validator會請求js和css, 加載后的回調(diào)函數(shù)重寫 fn.validator 為正確的方法$.fn.validator.apply(self, args);})}var fnames = ['Tab',"SiceSlider","SiceLvSelect","SiceSelect"];$.each(fnames, function(i,fname){//~~~同理 回調(diào)函數(shù)重寫接口為正確的函數(shù)$[fname] = function(){var args = arguments;loadComponent(function(){ var Foo = function(){}; Foo.prototype = $[fname].prototype; var foo = new Foo(); // 需要new 的組件,這樣獲取參數(shù)對象$[fname].apply(foo,args); });}}); })(jQuery)~~~個人認為在不用seaJs requireJs等模塊化管理插件的情況下,這種方式也還可以。
總結(jié)
以上是生活随笔為你收集整理的经验总结:按需加载JS和css的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: setContentView( )方法
- 下一篇: 深数据 - Deep Data