提取jquery的ready()方法单独使用示例
大家可以使用windows.onload事件,但onload在看来,就是页面上的东西(img,iframe等资源)全部都加载完毕后才能发生,如果页面内有大的图片的话,会在页面展现后好久时间后才执行。
如果只需要对dom进行操作,那么这时就没必要等到页面全部加载了。我们需要更快的方法。firefox有domcontentloaded事件可以轻松解决,可惜的就是ie没有。
msdn关于jscript的一个方法有段不起眼的话,当页面dom未加载完成时,调用doscroll方法时,会产生异常。那么我们反过来用,如果不异常,那么就是页面dom加载完毕了。所以 对于mozilla & opera ,在dom树载入后有现成的 domcontentloaded 事件。对于safari 浏览器,有document.onreadystatechange事件,当该触发时,如果 document.readystate=complete时,可视为dom树已经载入。
对于ie,当在iframe内时,同样有document.onreadystatechange事件,对于ie在非iframe内时,只有不断地通过能否执行doscroll判断dom是否加载完毕。
在本例中每间隔5毫秒尝试去执行 document.documentelement.doscroll('left')。在ie8下,貌视非iframe窗口也会有document.onreadystatechange事件,另外你也可以在构建自己的框架时使用此函数。
. 代码如下:
(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(omething);//dosomething为已存在的函数
//也可以通过闭包来使用
ready(function(){
//这里是逻辑代码
});