问题是关于异步加载js
//a.js
(function(){
function loadInit(){
var $Deferred_01 = function(){
return $.getScript('aa.js')
}
var $Deferred_02 = function(){
return $.getScript('bb.js') //依赖aa.js
}
var $promise = $.when($Deferred_01()).then($Deferred_02());
return $promise;
}
var windLoadFn = window.onload;
if(windLoadFn !=null){
window.onload = function(){
windLoadFn();
return loadInit();
}
}else{
window.onload = function(){
return loadInit();
}
}
})()
//b.js
(function(){
function loadInit(){
var bb = new BB() //依赖 bb.js;
}
if(window.onload!=null){
var fn = window.onload;
window.onload = function(){
fn().done(loadInit);
};
}else{
window.onload = function(){
loadInit();
};
}
})()
//页面加载是
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="aa.js"></script>
<script type="text/javascript" src="bb.js"></script>
我遇到的问题是在bb.js执行总有找不到aa.js 的 对象 或者 bb的 对象 不能 new AA() 或 new BB()初始化
脚本添加应该是这样的吧
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="a.js"></script>
<script type="text/javascript" src="b.js"></script>
onload函数将在页面资源都被加载完成后执行(包括图片,html,css,JS脚本)
那么当a.js被加载执行的时候,此时onload还不会有值,那么下面的代码块将被执行
window.onload = function(){ //INIT_LOAD_JS
return loadInit();
}
此时window.onload将绑定匿名函数,我们假设其函数名为 INIT_LOAD_JS
b.js在a.js后面加载
此时onload已经有绑定的函数对象,那么下面的代码块加被执行
var fn = window.onload;
window.onload = function(){ //INIT_LOAD_JS_RUN
fn().done(loadInit);
};
当load事件发生时,INIT_LOAD_JS_RUN函数将被执行,分别去加载aa.js和bb.js并被执行
那么正常的流程走下来;
在b.js中执行loadInit函数应该没有问题的
那么问题就在于
var $promise = $.when($Deferred_01()).then($Deferred_02());
要这样写
var $promise = $.when($Deferred_01()).then(function(){
return $Deferred_02();
});
一个完整的例子
a.js
(function(){
function loadInit(){
var $Deferred_01 = function(){
return $.getScript('aa.js')
}
var $Deferred_02 = function(){
return $.getScript('bb.js') //依赖aa.js
}
//要这样写
var $promise = $.when($Deferred_01()).then(function(){
return $Deferred_02();
});
return $promise;
}
var windLoadFn = window.onload;
if(windLoadFn !=null){
window.onload = function(){
windLoadFn();
return loadInit();
}
}else{
window.onload = function(){
return loadInit();
}
}
})()
b.js
/**
* Created by akong on 16/2/26.
*/
(function(){
function loadInit(){
var bb = new BB() //依赖 bb.js;
}
if(window.onload!=null){
var fn = window.onload;
window.onload = function(){
fn().done(loadInit);
};
}else{
window.onload = function(){
loadInit();
};
}
})()
aa.js
function AA(){
console.log('~~~AAA~~~');
}
bb.js
function BB(){
var aa=new AA();
console.log('~~~BB~~~');
}
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="script/jquery_2_1_3/jquery-2.1.3.min.js"></script>
<script type="text/javascript" src="a.js"></script>
<script type="text/javascript" src="b.js"></script>
</head>
<body>
</body>
</html>
运行后控制台将输出
~~~AAA~~~
~~~BB~~~