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

原生JS实现DOM加载完成马上执行JS代码的方法

程序员文章站 2023-11-05 23:28:10
用原生js我们经常使用window.onload事件来加载页面。但是window.onload是在页面元素都加载完毕后才执行,如果页面内有大的图片的话,会在页面展现后好久时...

用原生js我们经常使用window.onload事件来加载页面。但是window.onload是在页面元素都加载完毕后才执行,如果页面内有大的图片的话,会在页面展现后好久时间后才执行。所以有时我们需要在dom载入时马上执行一些函数。jquery提供了document.ready方法用来代替window.onload。但又不愿意仅为了这一个需求而引入整个jquery库,于是就把jquery的方法提取出来,单独使用了。

如果只需要对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)//在应用有frameset或者iframe的页面时,parent是父窗口,top是最*父窗口(有的窗口中套了好几层frameset或者iframe)
  {
   timer = setinterval(function(){
    try
    {
     isready||document.documentelement.doscroll('left');//在ie下用能否执行doscroll判断 dom是否加载完毕
    }
    catch(e)
    {
     return;
    }
    bindready();
   },5);
  }
  }
 })();

下面是使用方法:

 ready(dosomething);//dosomething为已存在的函数
 //也可以通过闭包来使用
 ready(function(){
  //这里是逻辑代码
 });

以上这篇原生js实现dom加载完成马上执行js代码的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。