先推荐一篇关于OnReady的文章,写的很好:http://blog.csdn.net/huxin1/article/details/5483251
Ext源码看了不少时间了,很多东西没有搞懂,不急,慢慢来,下面是我下午抽空对Ext.OnReady仿写。
/* 插件版本信息*/
var Lucky = { version : '1.0' };
/* 浏览器判别*/
var agent = navigator.userAgent.toLowerCase();
Lucky.isIE = /msie/.test(agent)&&!/opera/.test(agent);
Lucky.isChrome = /chrome/.test(agent);
Lucky.isFF = /firefox/.test(agent);
/* Event事件*/
Lucky.Event = function(name){
this.name = name; //事件名
this.Listeners = [];//监听函数数组
}
Lucky.Event.prototype = {
//增加一个事件的监听函数
addListener : function(name,ftn){ //监听函数名 、 监听函数体
//判段该监听函数是否在集合存在
if(this.findListener(name,ftn) == -1){
//不存在创建、并添加
var temp = this.createListener(name,ftn);
this.Listeners.push(temp);
}
},
//查找监听函数
findListener : function(name,ftn){ //{fn : xx , ne : xx }
var len = this.Listeners.length-1;
while(len >= 0){
var temp = this.Listeners[len];
if(temp.fn == ftn && temp.ne == name){
return len;
}
len--;
}
return -1;
},
//创建监听函数
createListener : function(name,ftn){
var obj = {
fn : ftn,
ne : name
}
return obj;
},
//删除一个事件的监听函数
removeListener : function(name,ftn){
var index,flag = false;
if(index = this.findListener(name,ftn) != -1){
this.Listeners.splice(index,1);
flag = true;
}
return flag;
},
//执行一个事件的所有监听函数
fireListener : function(){
var len = this.Listeners.length-1;
var arg = Array.prototype.slice.apply(arguments); //将argument对象转成数组
while(len >= 0){
var temp = this.Listeners[len];
var fn = temp.fn;
if(fn.apply(window,arg) === false){ //undefined == false 但是 !== false
return false;
}
len--;
}
return true;
}
}
/* OnReady */
var onReady,flag;
Lucky.OnReady = function(ftn){
if(!onReady){ //如果监听事件不存在创建,只监听一次
onReadyEt = new Lucky.Event('onready');
onReadyEt.addListener('init',ftn); //添加监听函数
if(Lucky.isFF || Lucky.isChrome){
flag = true;
document.addEventListener('DOMContentLoaded',MidFtn,false); //写了不少,其实就这一句话才是OnReady的关键
}else if(Lucky.isIE){
(function(){
try{
document.documentElement.doScroll("left");
}catch(error){
setTimeout(arguments.callee, 0 );
return;
}
MidFtn();
})();
//document.attachEvent('onload',MidFtn,false);
}
}
function MidFtn(){
onReady = '^_&'; //控制开关
if(flag)
document.removeEventListener("DOMContentLoaded", MidFtn, false);
onReadyEt.fireListener();
}
}
/* 测试*/
Lucky.OnReady(function(){
alert('能正常使用!');
})