1 条评论即拷即用:onDOMReady(提取自jQuery.ready)
2010年4月9日
上次abeet兄弟分享了即拷即用系列的动画函数 这次的onDOMReady更有吸引力了
先说明一下,为什么要提取jQuery的ready方法?
因为在很多时候大家做前端时,需要在DOM树载入时马上执行一些函数,比如对导航条进行初始化。
但又不愿意仅为了这一个需求而引入整个jQuery库,于是就把jQuery的ready方法提取出来,单独使用了。
另外你也可以在构建自己的js框架时使用此函数。
重复一遍,我们的口号是什么?
彪悍的应用,没有一行代码是多余的!!!
(function(){
var isReady=false; //判断onDOMReady方法是否已经被执行过
var readyList= [];//把需要执行的方法先暂存在这个数组里
var timer;//定时器句柄
ready=function(fn) {
if (isReady )
fn.call( document);
else
readyList.push( function() { return fn.call(this);});
return this;
}
var onDOMReady=function(){
for(var i=0;i<readyList.length;i++){
readyList[i].apply(document);
}
readyList = null;
}
var bindReady = function(evt){
if(isReady) return;
isReady=true;
onDOMReady.call(window);
if(document.removeEventListener){
document.removeEventListener("DOMContentLoaded", bindReady, false);
}else if(document.attachEvent){
document.detachEvent("onreadystatechange", bindReady);
if(window == window.top){
clearInterval(timer);
timer = null;
}
}
};
if(document.addEventListener){
document.addEventListener("DOMContentLoaded", bindReady, false);
}else if(document.attachEvent){
document.attachEvent("onreadystatechange", function(){
if((/loaded|complete/).test(document.readyState))
bindReady();
});
if(window == window.top){
timer = setInterval(function(){
try{
isReady||document.documentElement.doScroll('left');//在IE下用能否执行doScroll判断dom是否加载完毕
}catch(e){
return;
}
bindReady();
},5);
}
}
})();
使用方式如下
ready(navInit);//navInit为已存在的函数
//或
ready(function(){
if(agt.toLowerCase().indexOf("msie 6") != -1)
navInitForIE6();//如果浏览器是IE6,则执行navInitForIE6函数来初始化下拉菜单
});
再次感谢abeet的分享

