视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
原生JS实现DOM加载完成马上执行JS代码的方法
2020-11-27 22:08:20 责编:小采
文档

用原生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代码的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

下载本文
显示全文
专题