原生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事件,另外也可以在构建自己的框架时使用此函数

rush:js;"> (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",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);
}
}
})();

下面是使用方法

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

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

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...