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 相关文章推荐
JQuery一种取同级值的方式(比如你在GridView中)
Mar 15 Javascript
JavaScript禁止页面操作的示例代码
Dec 17 Javascript
js实现身份证号码验证的简单实例
Feb 19 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
Oct 16 Javascript
javascript匿名函数实例分析
Nov 18 Javascript
分享几种比较简单实用的JavaScript tabel切换
Dec 31 Javascript
原生JS实现图片轮播切换效果
Dec 15 Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
Jan 29 Javascript
微信小程序实现图片翻转效果的实例代码
Sep 20 Javascript
vue 解决路由只变化参数页面组件不更新问题
Nov 05 Javascript
Vue通过Blob对象实现导出Excel功能示例代码
Jul 31 Javascript
基于Vant UI框架实现时间段选择器
Dec 24 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
对淘宝URL中ID提取的PHP代码
2013/09/01 PHP
PHP中的多行字符串传递给JavaScript的两种方法
2014/06/19 PHP
php中strtotime函数用法详解
2014/11/15 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
2016/02/04 PHP
Firebug 字幕文件JSON地址获取代码
2009/10/28 Javascript
初窥JQuery-Jquery简介 入门了解篇
2010/11/25 Javascript
Javascript类定义语法,私有成员、受保护成员、静态成员等介绍
2011/12/08 Javascript
php析构函数的具体用法小结
2014/03/11 Javascript
js全选实现和判断是否有复选框选中的方法
2015/02/17 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
2015/12/07 Javascript
javascript实现标签切换代码示例
2016/05/22 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
js运动事件函数详解
2016/10/21 Javascript
微信小程序 支付简单实例及注意事项
2017/01/06 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
Angular2 http jsonp的实例详解
2017/08/31 Javascript
JS库之Waypoints的用法详解
2017/09/13 Javascript
Vue 项目代理设置的优化
2018/04/17 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
vue实现轮播图帧率播放
2021/01/26 Vue.js
Java中重定向输出流实现用文件记录程序日志
2015/06/12 Python
python TCP Socket的粘包和分包的处理详解
2018/02/09 Python
python批量下载网站马拉松照片的完整步骤
2018/12/05 Python
windows下Pycharm安装opencv的多种方法
2020/03/05 Python
python 实现倒计时功能(gui界面)
2020/11/11 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
购买英国原创艺术:Art Gallery
2018/08/25 全球购物
Java基础面试题
2014/07/19 面试题
数控加工专业毕业生自荐信
2013/09/27 职场文书
婚纱摄影师求职信
2014/03/07 职场文书
收入证明申请书
2015/06/12 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js
手把手带你彻底卸载MySQL数据库
2022/06/14 MySQL