loadJs 动态 按需 加载javascript 执行js方法
2013-04-11 19:01
555 查看
var win=window,doc=document;
var calss2Type={
'[object Array]':'array',
'[object Boolean]':'boolean',
'[object Date]':'date',
'[object Function]':'function',
'[object Number]':'number',
'[object Object]':'object',
'[object RegExp]':'regexp',
'[object String]':'string'
}
function getType(args){
return args&&calss2Type[Object.prototype.toString.call(args)]
}
function loadJs(arr,async){
/*
*params arr [] [{url:'***.js',fn:'mess.init',params:{type:'in'}},{url:'***.js',fn:'mess.init',params:{type:'in'}}]
*params arr {} {url:'***.js',fn:'mess.init',params:{type:'in'}}
*params arr string '***.js'
*params arr fun arguments.callee.call(this,fun())
*fn window['mess']['init']()
*/
var async=async,arr=arr;
if(getType(arr)==='string'){
this.createJs(arr);
return this;
}
if(getType(arr)==='object'){
var obj=arr;
this.createJs(obj.url||'',obj.fn||'',obj.params||'');
return this;
}
if(getType(arr)==='function'){
arguments.callee.call(this,arr());
}
if(getType(arr)==='array'&&arr.length){
for (var i = 0 ; i < arr.length; i++) {
var obj=getType(arr[i])==='object'&&arr[i];
if(obj){
if(!obj.url){
continue
}
this.createJs(obj.url,obj.fn,obj.params);
}
};
}
return this;
}
function createJs(url,fn,params){
var _this=this,
elm=doc.createElement('script');
elm.type='text/javascript';
elm.async=false;
if('onload' in elm){
elm.onload=function(){
if(fn) {
var method=getType(params)==='array'?'apply':'call';
if(getType(fn)==='string'){
fn= _this.getFn(fn);
}
fn[method](fn,params);
}
elm.onload=null;
}
}else{
elm.onreadystatechange=function() {
if (this.readyState==='loaded' || this.readyState==='complete') {
if(fn) {
var method=getType(params)==='array'?'apply':'call';
if(getType(fn)==='string'){
fn= _this.getFn(fn);
}
fn[method](fn,params);
}
elm.onreadystatechange=null;
}
}
}
elm.src=url;
doc.getElementsByTagName('body')[0].appendChild(elm);
},
function getFn(str){
var arr=str.split('.'),fns=win;
for(var i=0; i<arr.length;i++){
fns=fns[arr[i]];
}
return fns;
}
//loadJs({url:'/index/js/index.js',fn:'obj.say',params:['hello','me']});
(function(win,doc){
alert(1);
var obj={
say:function(mess,who){
alert(mess+' '+who);
}
}
//全局调用必须往外开方法
win.obj=obj;
})(window,document);
var calss2Type={
'[object Array]':'array',
'[object Boolean]':'boolean',
'[object Date]':'date',
'[object Function]':'function',
'[object Number]':'number',
'[object Object]':'object',
'[object RegExp]':'regexp',
'[object String]':'string'
}
function getType(args){
return args&&calss2Type[Object.prototype.toString.call(args)]
}
function loadJs(arr,async){
/*
*params arr [] [{url:'***.js',fn:'mess.init',params:{type:'in'}},{url:'***.js',fn:'mess.init',params:{type:'in'}}]
*params arr {} {url:'***.js',fn:'mess.init',params:{type:'in'}}
*params arr string '***.js'
*params arr fun arguments.callee.call(this,fun())
*fn window['mess']['init']()
*/
var async=async,arr=arr;
if(getType(arr)==='string'){
this.createJs(arr);
return this;
}
if(getType(arr)==='object'){
var obj=arr;
this.createJs(obj.url||'',obj.fn||'',obj.params||'');
return this;
}
if(getType(arr)==='function'){
arguments.callee.call(this,arr());
}
if(getType(arr)==='array'&&arr.length){
for (var i = 0 ; i < arr.length; i++) {
var obj=getType(arr[i])==='object'&&arr[i];
if(obj){
if(!obj.url){
continue
}
this.createJs(obj.url,obj.fn,obj.params);
}
};
}
return this;
}
function createJs(url,fn,params){
var _this=this,
elm=doc.createElement('script');
elm.type='text/javascript';
elm.async=false;
if('onload' in elm){
elm.onload=function(){
if(fn) {
var method=getType(params)==='array'?'apply':'call';
if(getType(fn)==='string'){
fn= _this.getFn(fn);
}
fn[method](fn,params);
}
elm.onload=null;
}
}else{
elm.onreadystatechange=function() {
if (this.readyState==='loaded' || this.readyState==='complete') {
if(fn) {
var method=getType(params)==='array'?'apply':'call';
if(getType(fn)==='string'){
fn= _this.getFn(fn);
}
fn[method](fn,params);
}
elm.onreadystatechange=null;
}
}
}
elm.src=url;
doc.getElementsByTagName('body')[0].appendChild(elm);
},
function getFn(str){
var arr=str.split('.'),fns=win;
for(var i=0; i<arr.length;i++){
fns=fns[arr[i]];
}
return fns;
}
//loadJs({url:'/index/js/index.js',fn:'obj.say',params:['hello','me']});
(function(win,doc){
alert(1);
var obj={
say:function(mess,who){
alert(mess+' '+who);
}
}
//全局调用必须往外开方法
win.obj=obj;
})(window,document);
相关文章推荐
- JavaScript 的性能优化:加载和执行(以及动态引入的外部 JS 文件在各浏览器中的加载顺序不一致)
- js加载之使用DOM方法动态加载Javascript文件
- js加载之使用DOM方法动态加载Javascript文件
- 动态加载外部.js文件时候,javascript的执行顺序问题
- JavaScript的执行原理,很多人都理解错了:在js被加载后,其实就将js代码执行了一遍,在内存中创建了所有js文件中的变量。而不是激发了某个js方法后,再去相应的js文件中去执行,是去内存中执行
- 补充《动态加载外部.js文件时候,javascript的执行顺序问题》
- 原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
- 动态加载js文件并且执行回调方法
- javascript中采用jQuery ajax动态加载js文件的解决方法
- 使用js加载器动态加载外部Javascript文件
- 页面自动执行(加载)js的几种方法
- 用JavaScript动态加载CSS和JS文件
- 异步加载js并执行js方法
- easyui 加载 html 片段 js不执行解决方法
- 动态加载JS脚本的4种方法
- JSP动态编译为servlet并动态加载该servlet,执行services方法
- 动态加载JS脚本的4种方法[转自http://hi.baidu.com/ajax] http://www.cnitblog.com/yemoo/archive/2007/07/19/30222.html
- 简易 Javascript DOM 包 | 元素水平垂直居中 | 动态执行 JS 代码 | 获取指定元素
- 使用getScript()方法异步加载并执行js文件
- ajax回调函数动态加载的标签里面js事件不执行