原生JS实现DOM加载完成马上执行JS代码的方法
用原生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代码的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
推荐阅读
-
原生JS实现DOM加载完成马上执行JS代码的方法
-
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
-
多种方法实现当jsp页面完全加载完成后执行一个js函数
-
模拟jQuery中的ready方法及实现按需加载css,js实例代码
-
JS实现判断图片是否加载完成的方法分析
-
从jQuery的remove()和原生JS的removeChild()方法再观jQuery对象和DOM对象的关系(代码教程)
-
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)_javascript技巧
-
模拟jQuery中的ready方法及实现按需加载css,js实例代码_jquery
-
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
-
模拟jQuery中的ready方法及实现按需加载css,js实例代码_jquery