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 相关文章推荐
JavaScript中的变量声明早于赋值分析
Mar 01 Javascript
文本框输入时 实现自动提示(像百度、google一样)
Apr 05 Javascript
JS 加入收藏夹的代码(主流浏览器通用)
May 13 Javascript
JS数组去重与取重的示例代码
Jan 24 Javascript
js模仿php中strtotime()与date()函数实现方法
Aug 11 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
Dec 18 Javascript
Vue.js双向绑定操作技巧(初级入门)
Dec 27 Javascript
vue js秒转天数小时分钟秒的实例代码
Aug 08 Javascript
IE9 elementUI文件上传的问题解决
Oct 17 Javascript
如何使用VuePress搭建一个类型element ui文档
Feb 14 Javascript
详解vue 路由跳转四种方式 (带参数)
Apr 28 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
Jun 18 jQuery
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
php Smarty date_format [格式化时间日期]
2010/03/15 PHP
QQ登录 PHP OAuth示例代码
2011/07/20 PHP
PHP--用万网的接口实现域名查询功能
2012/12/13 PHP
PHP运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
PHP输出两个数字中间有多少个回文数的方法
2015/03/23 PHP
关于PHP内置的字符串处理函数详解
2017/02/04 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
PHP实现UTF8二进制及明文字符串的转化功能示例
2017/11/20 PHP
Js之软键盘实现(js源码)
2007/01/30 Javascript
prototype 学习笔记整理
2009/07/17 Javascript
Javascript 设计模式(二) 闭包
2010/05/26 Javascript
javascript 单例/单体模式(Singleton)
2011/04/07 Javascript
web网页按比例显示图片实现原理及js代码
2013/08/09 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
js中自定义方法实现停留几秒sleep
2014/07/11 Javascript
JavaScript实现生成GUID(全局统一标识符)
2014/09/05 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
细数JavaScript 一个等号,两个等号,三个等号的区别
2016/10/09 Javascript
JQuery中解决重复动画的方法
2016/10/17 Javascript
Bootstrap3 datetimepicker控件使用实例
2016/12/13 Javascript
TableSort.js表格排序插件使用方法详解
2017/02/10 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
vue一个页面实现音乐播放器的示例
2018/02/06 Javascript
[45:25]完美世界DOTA2联赛循环赛 PXG vs IO 第一场 11.06
2020/11/09 DOTA
Python格式化css文件的方法
2015/03/10 Python
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
Python的包管理器pip更换软件源的方法详解
2016/06/20 Python
Python遍历pandas数据方法总结
2018/02/09 Python
关于python字符串方法分类详解
2019/08/20 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
使用Keras训练好的.h5模型来测试一个实例
2020/07/06 Python
计算 s=(x*y)1/2,用两个宏定义来实现
2016/08/11 面试题
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
音乐专业应届生教师求职信
2013/11/04 职场文书
有关打架的检讨书
2014/01/25 职场文书
导游词之广州陈家祠
2019/10/21 职场文书