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 相关文章推荐
js数字输入框(包括最大值最小值限制和四舍五入)
Nov 24 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
Mar 12 Javascript
JavaScript基础语法之js表达式
Jun 07 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
Jul 22 Javascript
vue toggle做一个点击切换class(实例讲解)
Mar 13 Javascript
Vue利用History记录上一页面的数据方法实例
Nov 02 Javascript
Vue中CSS动画原理的实现
Feb 13 Javascript
微信小程序template模版的使用方法
Apr 13 Javascript
微信小程序云开发如何实现数据库自动备份实现
Aug 16 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
Sep 18 Javascript
jQuery实现可编辑的表格
Dec 11 jQuery
vue学习笔记之给组件绑定原生事件操作示例
Feb 27 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
自己动手做一个SQL解释器
2006/10/09 PHP
通过php删除xml文档内容的方法
2015/01/23 PHP
php生成圆角图片的方法
2015/04/07 PHP
微信获取用户地理位置信息的原理与步骤
2015/11/12 PHP
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
JQuery表单验证插件EasyValidator用法分析
2014/11/15 Javascript
Javascript闭包用法实例分析
2015/01/23 Javascript
AngularJS语法详解(续)
2015/01/23 Javascript
Javascript核心读书有感之语句
2015/02/11 Javascript
js实现刷新iframe的方法汇总
2015/04/27 Javascript
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
微信公众号 客服接口的开发实例详解
2016/09/28 Javascript
实例详解JSON取值(key是中文或者数字)方式
2017/08/24 Javascript
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
在vue中动态添加class类进行显示隐藏实例
2019/11/09 Javascript
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
Django框架多表查询实例分析
2018/07/04 Python
python实现把二维列表变为一维列表的方法分析
2019/10/08 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
2020/04/21 Python
python爬取微博评论的实例讲解
2021/01/15 Python
即时搜索数百万张门票:SeatsForEveryone.com
2018/08/26 全球购物
文员个人求职自荐信
2013/09/21 职场文书
建筑毕业生自我鉴定
2013/10/18 职场文书
高校学生干部的自我评价分享
2013/11/04 职场文书
县优秀教师事迹材料
2014/01/31 职场文书
生产部厂长职位说明书
2014/03/03 职场文书
《春晓》教学反思
2014/04/20 职场文书
公司的门卫岗位职责
2014/09/09 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
预备党员转正意见
2015/06/01 职场文书
文化大革命观后感
2015/06/17 职场文书
四年级作文之植物
2019/09/20 职场文书
pytest配置文件pytest.ini的详细使用
2021/04/17 Python
解决xampp安装后Apache无法启动
2022/03/21 Servers