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 相关文章推荐
HTML TO JavaScript 转换
Jun 26 Javascript
用jquery模仿的a的title属性(兼容ie6/7)
Jan 21 Javascript
javascript搜索框点击文字消失失焦时文本出现
Sep 18 Javascript
jQuery实现新消息闪烁标题提示的方法
Mar 11 Javascript
JavaScript中setMonth()方法的使用详解
Jun 11 Javascript
jQuery实现下滑菜单导航效果代码
Aug 25 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
Sep 12 Javascript
jQuery中事件与动画的总结分享
May 24 Javascript
利用jQuery实现滑动开关按钮效果(附demo源码下载)
Feb 07 Javascript
Angularjs2不同组件间的通信实例代码
May 06 Javascript
jQuery模拟实现天猫购物车动画效果实例代码
May 25 jQuery
vue2.0.js的多级联动选择器实现方法
Feb 09 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
php中一个有意思的日期逻辑处理
2012/03/25 PHP
PHP Global定义全局变量使用说明
2013/08/15 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
php防止sql注入的方法详解
2017/02/20 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
纯js实现的论坛常用的运行代码的效果
2008/07/15 Javascript
javascript iframe中打开文件,并检测iframe存在否
2008/12/28 Javascript
通过js获取div的background-image属性
2013/10/15 Javascript
jQuery中closest()函数用法实例
2015/01/07 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
2016/01/13 Javascript
Vue实现动态显示textarea剩余字数
2017/05/22 Javascript
vue 返回上一页,页面样式错乱的解决
2019/11/14 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
js get和post请求实现代码解析
2020/02/06 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
python实现bitmap数据结构详解
2014/02/17 Python
Python下的twisted框架入门指引
2015/04/15 Python
详解Django框架中用户的登录和退出的实现
2015/07/23 Python
python中numpy基础学习及进行数组和矢量计算
2017/02/12 Python
Python中拆分字符串的操作方法
2019/07/23 Python
python上selenium的弹框操作实现
2020/07/13 Python
如何Tkinter模块编写Python图形界面
2020/10/14 Python
用CSS3将你的设计带入下个高度
2009/08/08 HTML / CSS
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
印度第一网上礼品店:IGP.com
2020/02/06 全球购物
哈曼俄罗斯官方网上商店:Harman.club
2020/07/24 全球购物
互联网创业计划书的书写步骤
2014/01/28 职场文书
保险专业大学生职业规划书
2014/03/03 职场文书
银行委托书范本
2014/04/04 职场文书
酒店开业策划方案
2014/06/02 职场文书
大学生入党积极分子自我评价
2014/09/20 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
上下班时间调整通知
2015/04/23 职场文书
《没有任何借口》读后感:完美的执行能力
2020/01/07 职场文书
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python