jQuery的ready⽅法详解
jQuery中的ready⽅法实现了当页⾯加载完成后才执⾏的效果,但他并不是load或者load的封装,⽽是使⽤标准W3C浏览器DOM隐藏api和IE浏览器缺陷来完成的,⾸先,我们来看jQuery的代码
复制代码代码如下:
DOMContentLoaded = function()
{
//取消事件监听,执⾏ready⽅法    if ( document.addEventListener )
{
}
else if ( adyState === "complete" )
{
document.detachEvent( "onreadystatechange", DOMContentLoaded );
}
};
复制代码代码如下:
if ( !readyList ) {
readyList = jQuery.Deferred();
//表⽰页⾯已经加载完成,直接调⽤ ready⽅法        if ( adyState === "complete" ) {
/
/将 ady压⼊异步消息队列,设置延迟时间1毫秒(注意,有些浏览器延迟不能⼩于4毫秒)
setTimeout( ady);
}
else if ( document.addEventListener ) //        {
//监听DOM加载完成            document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
//这⾥是为了确保所有ready执⾏结束,如果DOMContentLoaded⽅法执⾏了,将有⼀个状态值 isReady被设置为true,因此,              //ready⽅法⼀旦执⾏,那么将只执⾏⼀次,window.addEventListener中的ready 将被 return 中断
window.addEventListener( "load", ady, false );
} else {
//低版本的IE浏览器            document.attachEvent( "onreadystatechange", DOMContentLoaded );
window.attachEvent( "onload", ady );
var top = false;
try {
top = window.frameElement == null && document.documentElement;
} catch(e) {}
if ( top && top.doScroll )  //剔除iframe的成分            {
(function doScrollCheck() {jquery ajax例子
if ( !jQuery.isReady ) {
try {
//根据bug来兼容低版本的IE javascript.nwbox/IEContentLoaded/
top.doScroll("left");
} catch(e) {
//由于低版本的IE 浏览器,onreadystatechange事件不可靠,因此需要根据各个bug来判断页⾯是否已加载完成                            return setTimeout( doScrollCheck, 50 );
}
}
})();
}
}
}
return readyList.promise( obj );
};
复制代码代码如下:
ready: function( wait )
{
if ( wait === true ? --adyWait : jQuery.isReady ) {
//判断页⾯是否已完成加载并且是否已经执⾏ready⽅法
return;
}
if ( !document.body ) {
return setTimeout( ady );
}
jQuery.isReady = true; //指⽰ready⽅法已被执⾏
if ( wait !== true && --adyWait > 0 ) {
return;
}
if ( igger ) {
jQuery( document ).trigger("ready").off("ready");
}
},
总结:
页⾯加载完成有两种事件,⼀是ready,表⽰⽂档结构已经加载完成(不包含图⽚等⾮⽂字媒体⽂件),⼆是onload,指⽰页⾯包含图⽚等⽂件在内的所有元素都加载完成。(可以说:ready 在onload 前加载)
⼀般样式控制的,⽐如图⽚⼤⼩控制放在onload ⾥⾯加载;
jS事件触发的⽅法,可以在ready ⾥⾯加载;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。