原⽣JS实现DOM加载完成马上执⾏JS代码的⽅法
⽤原⽣JS我们经常使⽤load事件来加载页⾯。但是load是在页⾯元素都加载完毕后才执⾏,如果页⾯内有⼤的图⽚的话,会在页⾯展现后好久时间后才执⾏。所以有时我们需要在DOM载⼊时马上执⾏⼀些函数。jQuery提供了ady⽅法⽤来代替load。但⼜不愿意仅为了这⼀个需求⽽引⼊整个JQuery库,于是就把jQuery的⽅法提取出来,单独使⽤了。
如果只需要对DOM进⾏操作,那么这时就没必要等到页⾯全部加载了。Firefox有DOMContentLoaded事件可以轻松解决,可惜的就是IE没有。
MSDN关于JSCRIPT的⼀个⽅法有段不起眼的话,当页⾯DOM未加载完成时,调⽤doScroll⽅法时,会产⽣异常。那么我们反过来⽤,如果不异常,那么就是页⾯DOM加载完毕了。所以对于Mozilla & Opera 浏览器,在dom树载⼊后有现成的DOMContentLoaded 事件。对于Safari 浏览器,有adystatechange事件,当该触发时,如果
对于ie,当在iframe内时,同样有adystatechange事件,对于ie在⾮iframe内时,只有不断地通过能否执⾏doScroll判断dom是否加载完毕。
在本例中每间隔5毫秒尝试去执⾏ document.documentElement.doScroll(‘left')。在ie8下,貌视⾮iframe窗⼝也会有adystatechange事件,另外也可以在构建⾃⼰的框架时使⽤此函数。
(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);
veEventListener)
{
}
else if(document.attachEvent)
{
document.detachEvent("onreadystatechange", bindReady);
if(window == p){
clearInterval(timer);//事件发⽣后清除定时器
timer = null;
}
}
};
if(document.addEventListener){
document.addEventListener("DOMContentLoaded", bindReady, false);
}
else if(document.attachEvent)//⾮最顶级⽗窗⼝
{
document.attachEvent("onreadystatechange", function(){
if((/loaded|complete/).adyState))
bindReady();
});
if(window == p)//在应⽤有frameset或者iframe的页⾯时,parent是⽗窗⼝,top是最顶级⽗窗⼝(有的窗⼝中套了好⼏层frameset或者iframe)  {
timer = setInterval(function(){
try
{
isReady||document.documentElement.doScroll('left');//在IE下⽤能否执⾏doScroll判断 dom是否加载完毕
}
catch(e)
{
return;
}
bindReady();
},5);
}
原生js和js的区别
}
})();
下⾯是使⽤⽅法:
ready(dosomething);//dosomething为已存在的函数
//也可以通过闭包来使⽤
ready(function(){
//这⾥是逻辑代码
});
以上这篇原⽣JS实现DOM加载完成马上执⾏JS代码的⽅法就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。