javascript开发随笔二 动态加载js和文件


Posted in Javascript onNovember 25, 2011

这时候最好的做法就是按需引入,动态引入组件js和样式,文件load完成后调用callback,运行js。代码还是很简便的
1. 判断文件load完成。加载状态ie为onreadystatechange,其他为onload、onerror

if(isie){ 
Res.onreadystatechange = function(){ 
if(Res.readyState == 'complete' || Res.readyState == 'loaded'){ 
Res.onreadystatechange = null; 
callback(); 
_self.loadedUi[modelName] = true; 
} 
} 
}else{ 
Res.onload = function(){ 
Res.onload = null; 
callback(); 
_self.loadedUi[modelName] = true; 
} 
Res.onerror = function(){ 
throw new Error('res error:' + modelName+'.js'); 
} 
}

2. 所有组件的命名最好保持一致,callback调用也比较方便。还可以根据需要增加参数比如: requires,依赖于那些文件;style,true || false,是否加载样式,等等。
3. 移除操作也可以有,移除script、style标签、delete组件
(function(window,undefined){ 
if(!window.ui) { 
window.ui = {}; 
} 
//动态加载ui的js 
window.bus = { 
config : { 
version : window.config.version, 
cssPath : window.config.resServer + '/css/v3/ui', 
jsPath : window.config.resServer + '/js/v2/ui' 
}, 
loadedUi : {}, 
readyStateChange : function(){ 
var ua = navigator.userAgent.toLowerCase(); 
return ua.indexOf('msie') >= 0; 
}, 
loadRes : function(modelName,prames,callback){ 
var _self = this; 
var Res = document.createElement(prames.tagName); 
for(var k in prames){ 
if(k != 'tagName'){ 
Res.setAttribute(k,prames[k],0); 
} 
} 
document.getElementsByTagName('head')[0].appendChild(Res); 
if(this.readyStateChange()){ 
Res.onreadystatechange = function(){ 
if(Res.readyState == 'complete' || Res.readyState == 'loaded'){ 
Res.onreadystatechange = null; 
callback(); 
_self.loadedUi[modelName] = true; 
} 
} 
}else{ 
Res.onload = function(){ 
Res.onload = null; 
callback(); 
_self.loadedUi[modelName] = true; 
} 
Res.onerror = function(){ 
throw new Error('res error:' + modelName+'.js'); 
} 
} 
}, 
removeUi : function(modelName){ 
if(!modelName){ 
return true 
}; 
this.loadedUi[modelName] = false; 
var head = document.getElementsByTagName('head')[0]; 
var model_js = document.getElementById('J_model_'+modelName + '_js'); 
var model_css = document.getElementById('J_model_'+modelName + '_css'); 
if(model_js && model_css){ 
delete window.ui[modelName]; 
head.removeChild(model_js); 
head.removeChild(model_css); 
return true; 
}else{ 
return false; 
} 
}, 
loadUi : function(modelName,callback,setting){ 
if(!modelName){ 
return true 
}; 
callback = callback || function(){}; 
if(this.loadedUi[modelName] == true){ 
callback(); 
return true 
} 
var deafult_setting = { 
style : true, 
js : true, 
requires : [] 
} 
for(var key in setting){ 
deafult_setting[key] = setting[key]; 
} 
deafult_setting['style'] === true && this.loadRes(modelName,{ 
id : 'J_model_'+modelName + '_css', 
name : modelName, 
tagName : 'link', 
type : 'text/css', 
rel : 'stylesheet', 
href : this.config.cssPath + '/' + modelName + '.css?v=' + this.config.version 
}); 
deafult_setting['js'] === true && this.loadRes(modelName,{ 
id : 'J_model_'+modelName + '_js', 
name : modelName, 
tagName : 'script', 
type : 'text/javascript', 
src : this.config.jsPath + '/' + modelName + '.js?v=' + this.config.version 
},callback); 
if(deafult_setting.requires.length > 0){ 
for(var i=0,len = deafult_setting.requires.length;i<len;i++){ 
this.loadUi(deafult_setting.requires[i]); 
} 
} 
} 
} 
})(window)

使用方法
// load comment for feed 
window.bus.loadUi('new_comment_feed', function(){ 
window.ui.new_comment_feed($("#J_newsList")); 
},{ 
style : false, 
requires:['emoticon','addFriend'] 
}); 
// load new yy ui 
window.bus.loadUi('yy', function(){ 
window.ui.yy(options); 
},{ 
style:false, 
requires:['emoticon'] 
}); 
// load photoLightbox 
window.bus.loadUi('photoLightbox', function(){ 
window.ui.photoLightbox(options.urlAjaxGetFriendPhoto, options.urlCommentOtherPhoto,$("#J_newsList"),options.myUid,options.myName); 
});
Javascript 相关文章推荐
麦鸡的TAB切换功能结合了javascript和css
Dec 17 Javascript
RequireJS入门一之实现第一个例子
Sep 30 Javascript
AngularJS入门之动画
Jul 27 Javascript
纯JavaScript手写图片轮播代码
Oct 20 Javascript
微信小程序网络请求wx.request详解及实例
May 18 Javascript
CSS3+JavaScript实现翻页幻灯片效果
Jun 28 Javascript
Easy UI动态树点击文字实现展开关闭功能
Sep 30 Javascript
angular4中关于表单的校验示例
Oct 16 Javascript
基于Vue实现微信小程序的图文编辑器
Jul 25 Javascript
Vue多组件仓库开发与发布详解
Feb 28 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
Jun 20 Javascript
swiper实现导航滚动效果
Dec 13 Javascript
javascript开发随笔一 preventDefault的必要
Nov 25 #Javascript
基于jquery的拖动布局插件
Nov 25 #Javascript
jQuery Jcrop插件实现图片选取功能
Nov 23 #Javascript
JQUERY1.6 使用方法四 检测浏览器
Nov 23 #Javascript
JQuery1.6 使用方法三
Nov 23 #Javascript
jQuery1.6 使用方法二
Nov 23 #Javascript
jQuery1.6 使用方法一
Nov 23 #Javascript
You might like
地摊中国 - 珍藏老照片
2020/08/18 杂记
php 大数据量及海量数据处理算法总结
2011/05/07 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
2013/06/26 PHP
浅析PHP中strlen和mb_strlen的区别
2014/08/31 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
javascript 另一种图片滚动切换效果思路
2012/04/20 Javascript
JS实现标签页效果(配合css)
2013/04/03 Javascript
关于extjs4如何获取grid修改后的数据的问题
2013/08/07 Javascript
谈谈对offsetleft兼容性的理解
2015/11/11 Javascript
一个例子轻松学会Vue.js
2017/01/02 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
Bootstrap入门教程一Hello Bootstrap初识
2017/03/02 Javascript
JS实现图片预加载之无序预加载功能代码
2017/05/12 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
强大的JavaScript响应式图表Chartist.js的使用
2017/09/13 Javascript
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
总结JavaScript在IE9之前版本中内存泄露问题
2018/04/28 Javascript
JS中this的指向以及call、apply的作用
2018/05/06 Javascript
对Vue beforeRouteEnter 的next执行时机详解
2018/08/25 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
JavaScript和TypeScript中的void的具体使用
2019/09/12 Javascript
opencv python 2D直方图的示例代码
2018/07/20 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
数据库连接池的工作原理
2012/09/26 面试题
数字天堂软件测试面试题
2012/12/23 面试题
注册资产评估专业求职信
2014/07/16 职场文书
2015中学学校工作总结
2015/07/20 职场文书
2016年中学法制宣传日活动总结
2016/04/01 职场文书
幽默导游词应该怎么写?
2019/08/26 职场文书
Pytorch中Softmax和LogSoftmax的使用详解
2021/06/05 Python
MySQL 如何限制一张表的记录数
2021/09/14 MySQL
SSM VUE Axios详解
2021/10/05 Vue.js
Java 超详细讲解IO操作字节流与字符流
2022/03/25 Java/Android