页面加载状况
$(document).ready()
$(function(){})
这两个是我们在页面初始化时常常运用的监听计划,那末他的现实的实行关联时什么样的呢?在原生js中是什么样的一种表现?
以下我会一而再再而三的写DOMContentLoaded,由于很多同砚都没有怎样听说过这个事宜
onload vs DOMContentLoaded
定义
onload:
当onload事宜触发的时刻,页面上的一切dom,款式表,剧本,图片,flash都已加载完成了
DOMContentLoaded:
当DOMContentLoaded事宜触发时,仅当dom加载完成,不包括款式表,图片,flash
光看定义,一览无余,哪一个比较合适作为我们推断的规范:图片啊什么的,我们完全能够不必等。
DOMContentLoaded事宜细致研讨
DOMContentLoaded边境事宜
外链款式在某些浏览器下面会影响剧本的加载。
在某些Gecko和Webkit引擎版本的浏览器内里,&&IE8在内,会同时提议多个http的要求并行加载款式表和脚步,然则剧本会等款式表加载完成以后才会被实行,以至款式表加载之前页面都不会衬着。opera不会,款式表未加载好就能够实行js。
DOMContentLoaded兼容性
DOMContentLoaded事宜兼容处置惩罚计划
由上可知,DOMContentLoaded事宜在ie9以下是不支持的,那末通例,我们要最先搞兼容处置惩罚计划
ie8及以下兼容处置惩罚计划
ie的平常处置惩罚计划
html加载历程当中会有一个document.readyState状况
五种状况:
0(未初始化):还没有send
1 loading(载入):正在发送要求
2 loaded(载入完成):实行完成,已接收到悉数相应内容
3 interactive(交互): 正在剖析相应内容
4 complete(完成): 相应内容剖析完成,客户端能够用了。
complete事宜和window.onload事宜是同时的。
这就是要监听页面的readystatechange事宜,当事宜为interactive||complete时就能够最先做js的事变了。
带iframe的处置惩罚
然则当页面中带有iframe时,这个readyState状况会挂起一向守候,守候页面的iframe也加载终了以后再处置惩罚,这个历程是我们不想要得,那就有别的一种处置惩罚计划
(function doScrollCheck(){
try{
temp.doScroll('left');
result += 'ie scroll' + (new Date()).getTime()+'\n';
} catch(e){
return setTimeout(doScrollCheck, 50);
}
}());
doScroll事宜在页面加载完成之前是不能挪用的,挪用就失利了,能够用try catch的方法来完成
jQuery处置惩罚计划
基本上说清楚了,那末我们来看看jQuery是怎样搞的吧
jQuery.ready.promise = function( obj ) {
if ( !readyList ) {
readyList = jQuery.Deferred();
//假如实行到此处时,document.readyState已是complete,就能够是ready了
if ( document.readyState === "complete" ) {
setTimeout( jQuery.ready );
//规范处置惩罚计划,DOMContentLoaded,平常浏览器都有的。
} else if ( document.addEventListener ) {
//事宜监听
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
// 做个备份,不论怎样,load事宜时肯定肯定会实行的
window.addEventListener( "load", jQuery.ready, false );
// ie处置惩罚计划
} else {
//这个时间比doscroll事宜快很多,他会在交互状况就触发,见demo2
document.attachEvent( "onreadystatechange", DOMContentLoaded );
// 照样备份
window.attachEvent( "onload", jQuery.ready );
// 且没有iframe的计划
var top = false;
try {
top = window.frameElement == null && document.documentElement;
} catch(e) {}
if ( top && top.doScroll ) {
(function doScrollCheck() {
if ( !jQuery.isReady ) {
try {
top.doScroll("left");
} catch(e) {
return setTimeout( doScrollCheck, 50 );
}
jQuery.ready();
}
})();
}
}
}
return readyList.promise( obj );
};
这就是我们经常使用的ready事宜
敬请期待下期,defer sync 种种种种和loaded DOMContentLoaded事宜的关联