项目中做过这样的事情:所有页面都通过SSI指令 include这样一份public-js.shtml, 用来引入涉及到的js(包括公共的脚本 验证插件 自定义组件等),但是一些没有交互效果的页面根本不需要用到这些脚本,所以造成脚本冗余较大(尽管可以从缓存读取,但还是应该尽量减少没用到的脚本为佳)

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" -->

<!-- 页面通用函数 -->
<!--#include virtual="/include/page-js.shtml" -->

为了实现组件和验证插件的按需加载,定义这么一个函数loadJsCss

/*** js和css按需加载 ***/
function loadJsCss(url, callback ){// 非阻塞的加载 后面的js会先执行
var isJs = /\/.+\.js($|\?)/i.test(url) ? true : false;
function onloaded(script, callback){//绑定加载完的回调函数
if(script.readyState){ //ie
script.attachEvent('onreadystatechange', function(){
if(script.readyState == 'loaded' || script.readyState == 'complete'){
script.className = 'loaded';
callback && callback.constructor === Function && callback();
}
});
}else{
script.addEventListener('load',function(){
script.className = "loaded";
callback && callback.constructor === Function && callback();
}, false);
}
}
if(!isJs){ //加载css
var links = document.getElementsByTagName('link');
for(var i = 0; i < links.length; i++){//是否已加载
if(links[i].href.indexOf(url)>-1){
return;
}
}
var link = document.createElement('link');
link.type = "text/css";
link.rel = "stylesheet";
link.href = url;
var head = document.getElementsByTagName('head')[0];
head.insertBefore(link,head.getElementsByTagName('link')[0] || null );
}else{ //加载js
var scripts = document.getElementsByTagName('script');
for(var i = 0; i < scripts.length; i++){//是否已加载
if(scripts[i].src.indexOf(url)>-1 && callback && (callback.constructor === Function) ){
//已创建script
if(scripts[i].className === 'loaded'){//已加载
callback();
}else{//加载中
onloaded(scripts[i], callback);
}
return;
}
}
var script = document.createElement('script');
script.type = "text/javascript";
script.src = url;
document.body.appendChild(script);
onloaded(script, callback); }
}

// 表单验证插件 动态加载
function loadValidator(callback){// 加载nicevalidator插件
loadJsCss("/css/nicevalidator.css");
loadJsCss("/js/nicevalidator.js", callback);
}


// 组件动态加载
function loadComponent(callback){// 加载自定义组件
loadJsCss("/css/component.css");
loadJsCss("/js/component.js", callback);
}

 

但是发现每个验证方法或组件的调用都要放到回调函数内部,实在笨拙,而且改起来也很麻烦。如:

loadValidator(function(){ $('#frm').validator({...}););

loadComponent(function(){ $.Tab({...}); );

经过尝试发现可以保持页面原有的调用方式,只需在public.js公共js文件中定义相同接口即可:

(function(){
$.fn.validator = function(){
var args = arguments, self = this;
loadValidator(function(){//~~~初始状态fn.validator会请求js和css, 加载后的回调函数重写 fn.validator 为正确的方法
$.fn.validator.apply(self, args);
})
}
var fnames = ['Tab',"SiceSlider","SiceLvSelect","SiceSelect"];
$.each(fnames, function(i,fname){//~~~同理 回调函数重写接口为正确的函数
$[fname] = function(){
var args = arguments; loadComponent(function(){
var Foo = function(){}; Foo.prototype = $[fname].prototype; var foo = new Foo(); // 需要new 的组件,这样获取参数对象
$[fname].apply(foo,args);
});
}
});
})(jQuery)

~~~个人认为在不用seaJs requireJs等模块化管理插件的情况下,这种方式也还可以。

经验总结:按需加载JS和css的更多相关文章

  1. 转载 yii2-按需加载并管理CSS样式/JS脚本

    一.资源包定义 Yii2对于CSS/JS 管理,使用AssetBundle资源包类. 创建如下: backend/assets/AppAsset.php namespace backend\asset ...

  2. 转:按需加载html 图片 css js

    按需加载是前端性能优化中的一项重要措施,按需加载是如何定义的呢?顾名思义,指的是当用户触发了动作时才加载对应的功能.触发的动作,是要看具体的业务场景而言,包括但不限于以下几个情况:鼠标点击.输入文字. ...

  3. yii2.0 如何按需加载并管理CSS样式及JS脚本

    链接:http://www.yiichina.com/tutorial/399 (注:以下为Yii2.0高级应用测试) Yii2.0对于CSS/JS 管理,使用AssetBundle资源包类. 视图如 ...

  4. Yii2 灵活加载js、css

    Yii2.0对于CSS/js 管理,使用AssetBundle资源包类. 视图如何按需加载CSS/JS ? 资源包定义: backend/assets/AppAsset.PHP <?php na ...

  5. 动态加载js和css

    开发过程中经常需要动态加载js和css,今天特意总结了一下常用的方法. 1.动态加载js 方法一:动态加载js文件 // 动态加载js脚本文件 function loadScript(url) { v ...

  6. 动态加载js、css 代码

    一.原生js: /** * 加载js和css文件 * @param jsonData.path 前缀路径 * @param jsonData.url 需要加载的js路径或css路径 * @param ...

  7. 动态加载js和css的jquery plugin

    一个简单的动态加载js和css的jquery代码,用于在生成页面时通过js函数加载一些共通的js和css文件. //how to use the function below: //$.include ...

  8. PHP:如果正确加载js、css、images等静态文件

    日常中,我们想要把一些静态页面放在框架上或者是进行转移时,那么静态页面上的原url加载js.css.images都会失效,那么我们应该怎么进行修改捏? 现在仓鼠做个笔记哈 这里有几个注意项: 1.路径 ...

  9. 按需加载.js .css文件

    首先,理解按需加载当你需要用到某个js里面的函数什么鬼,或者某个css里的样式的时候你才开始加载这个文件. 然后是怎样实现的,简单来说就是在js中动态的createElem<script> ...

随机推荐

  1. dataguard dubugs

    alter database open read only;alter database open read only*ERROR at line 1:ORA-10456: cannot open s ...

  2. How do I pull a native DOM element from a jQuery object? | jQuery Learning Center

    How do I pull a native DOM element from a jQuery object? | jQuery Learning Center How do I pull a na ...

  3. xml 充当简易数据库

    后台: 写入节点 public static void Update(string path, string node, string attribute, string value) { try { ...

  4. js兼容性大全

    js有个第二定律好的属性/选择器一定不兼容/* 获取类名通用代码*/function getClassName(){ if(document.getElementsByClassName){ doso ...

  5. C# 委托和方法

    委托是一种特殊的引用类型,它将方法也作为特殊的对象封装起来,从而将方法作为变量或参数进行传递 using System; using System.Collections.Generic; using ...

  6. C#复习一( Twenty Days)

      今天开始将要复习最近所学的一些C#知识.下面就来总结一下今天所复习的内容,以此来巩固我对C#知识的掌握.今天主要以举几个程序为例. 首先还是要注意代码的规范: –注释//,/**/,/// –骆驼 ...

  7. C#_C++_SDK_WM_KEYDOWN人物卡顿延迟解决方法

    提问者采纳 由Keydown和keyup事件组合,keyDown来判定按下,此时开始移动,KeyUp判定松开,这样可行否? 追问 这是我一开始的写法,但就是因为 键盘重复延迟 导致keydown后会有 ...

  8. 利用python进行数据分析之数据规整化

    数据分析和建模大部分时间都用在数据准备上,数据的准备过程包括:加载,清理,转换与重塑. 合并数据集 pandas对象中的数据可以通过一些内置方法来进行合并: pandas.merge可根据一个或多个键 ...

  9. python函数callable

    callable(object) 中文说明:检查对象object是否可调用.如果返回True,object仍然可能调用失败:但如果返回False,调用对象ojbect绝对不会成功. 注意:类或函数是可 ...

  10. Qt实战之开发软件数据获取助手(eventFilter处理鼠标按下,event处理鼠标松开)

    前段时间,受朋友委托,需要做一个能够获取别人软件文本框中内容的助手.当然这需要调用win api来解决问题.一开始,我想都没想,就用getWindowText()....居然没用,好郁闷.于是查msd ...