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 相关文章推荐
再次分享18个非常棒的jQuery表格插件
Apr 10 Javascript
JS检测图片大小的实例
Aug 21 Javascript
css结合js制作下拉菜单示例代码
Feb 27 Javascript
Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)
Sep 17 Javascript
Vue.js Ajax动态参数与列表显示实现方法
Oct 20 Javascript
Vue中的数据监听和数据交互案例解析
Jul 12 Javascript
IE9 elementUI文件上传的问题解决
Oct 17 Javascript
微信小程序在地图选择地址并返回经纬度简单示例
Dec 03 Javascript
vue实现页面滚动到底部刷新
Aug 16 Javascript
layui 弹出层值回传解决方式
Nov 14 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
Dec 19 Vue.js
vue响应式原理与双向数据的深入解析
Jun 04 Vue.js
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 Static关键字实用方法
2010/06/04 PHP
学习php设计模式 php实现适配器模式
2015/12/07 PHP
php 伪造HTTP_REFERER页面URL来源的三种方法
2016/09/22 PHP
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
javascript运算符——逻辑运算符全面解析
2016/06/27 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
实例讲解Vue.js中router传参
2018/04/22 Javascript
详解离线安装npm包的几种方法
2018/11/25 Javascript
如何在Vue.js中实现标签页组件详解
2019/01/02 Javascript
axios+Vue实现上传文件显示进度功能
2019/04/14 Javascript
angular多语言配置详解
2019/05/16 Javascript
Node爬取大批量文件的方法示例
2019/06/28 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
vue实现简单加法计算器
2020/10/22 Javascript
[00:57]林俊杰助阵DOTA2亚洲邀请赛
2015/01/28 DOTA
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
用Python实现最速下降法求极值的方法
2019/07/10 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
django框架单表操作之增删改实例分析
2019/12/16 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
2020/02/27 Python
Python批量将图片灰度化的实现代码
2020/04/11 Python
python飞机大战游戏实例讲解
2020/12/04 Python
CSS3动画之利用requestAnimationFrame触发重新播放功能
2019/09/11 HTML / CSS
深入浅析css3 中display box使用方法
2015/11/25 HTML / CSS
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
奇怪的鱼:Weird Fish
2018/03/18 全球购物
红色连衣裙精品店:Red Dress Boutique
2018/08/11 全球购物
工商管理专业实习生自我鉴定
2013/09/29 职场文书
校园广播稿500字
2014/02/04 职场文书
聘任书模板
2014/03/29 职场文书
施工质量承诺书范文
2014/05/30 职场文书
雷锋之歌观后感
2015/06/10 职场文书
好人好事新闻稿
2015/07/17 职场文书
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP