欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

提取jquery的ready()方法单独使用示例

程序员文章站 2022-06-20 17:59:44
大家可以使用windows.onload事件,但onload在看来,就是页面上的东西(img,iframe等资源)全部都加载完毕后才能发生,如果页面内有大的图片的话,会在页面展现后...

大家可以使用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(){
 //这里是逻辑代码
});