jQuery中的ready方法实现了当页面加载完成后才执行的效果,但他并不是window.onload或者doucment.onload的封装,而是使用 标准W3C浏览器DOM隐藏api和IE浏览器缺陷来完成的,首先,我们来看jQuery的代码fcRHTML5中文学习网 - HTML5先行者学习网
复制代码 代码如下:
fcRHTML5中文学习网 - HTML5先行者学习网
DOMContentLoaded = function() fcRHTML5中文学习网 - HTML5先行者学习网
{ fcRHTML5中文学习网 - HTML5先行者学习网
//取消事件监听,执行ready方法 if ( document.addEventListener ) fcRHTML5中文学习网 - HTML5先行者学习网
{ fcRHTML5中文学习网 - HTML5先行者学习网
document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); fcRHTML5中文学习网 - HTML5先行者学习网
jQuery.ready(); fcRHTML5中文学习网 - HTML5先行者学习网
} fcRHTML5中文学习网 - HTML5先行者学习网
else if ( document.readyState === "complete" ) fcRHTML5中文学习网 - HTML5先行者学习网
{ fcRHTML5中文学习网 - HTML5先行者学习网
document.detachEvent( "onreadystatechange", DOMContentLoaded ); fcRHTML5中文学习网 - HTML5先行者学习网
jQuery.ready(); fcRHTML5中文学习网 - HTML5先行者学习网
} fcRHTML5中文学习网 - HTML5先行者学习网
};fcRHTML5中文学习网 - HTML5先行者学习网
复制代码 代码如下:
fcRHTML5中文学习网 - HTML5先行者学习网
jQuery.ready.promise = function( obj ) { fcRHTML5中文学习网 - HTML5先行者学习网
if ( !readyList ) { fcRHTML5中文学习网 - HTML5先行者学习网
readyList = jQuery.Deferred(); fcRHTML5中文学习网 - HTML5先行者学习网
//表示页面已经加载完成,直接调用 ready方法 if ( document.readyState === "complete" ) { fcRHTML5中文学习网 - HTML5先行者学习网
//将 jQuery.ready压入异步消息队列,设置延迟时间1毫秒(注意,有些浏览器延迟不能小于4毫秒) setTimeout( jQuery.ready); fcRHTML5中文学习网 - HTML5先行者学习网
} fcRHTML5中文学习网 - HTML5先行者学习网
else if ( document.addEventListener ) // { fcRHTML5中文学习网 - HTML5先行者学习网
//监听DOM加载完成 document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); fcRHTML5中文学习网 - HTML5先行者学习网
//这里是为了确保所有ready执行结束,如果DOMContentLoaded方法执行了,将有一个状态值 isReady被设置为true,因此, //ready方法一旦执行,那么将只执行一次,window.addEventListener中的ready 将被 return 中断 window.addEventListener( "load", jQuery.ready, false ); fcRHTML5中文学习网 - HTML5先行者学习网
} else { fcRHTML5中文学习网 - HTML5先行者学习网
//低版本的IE浏览器 document.attachEvent( "onreadystatechange", DOMContentLoaded ); fcRHTML5中文学习网 - HTML5先行者学习网
window.attachEvent( "onload", jQuery.ready ); fcRHTML5中文学习网 - HTML5先行者学习网
var top = false; fcRHTML5中文学习网 - HTML5先行者学习网
try { fcRHTML5中文学习网 - HTML5先行者学习网
top = window.frameElement == null && document.documentElement; fcRHTML5中文学习网 - HTML5先行者学习网
} catch(e) {} fcRHTML5中文学习网 - HTML5先行者学习网
if ( top && top.doScroll ) //剔除iframe的成分 { fcRHTML5中文学习网 - HTML5先行者学习网
(function doScrollCheck() { fcRHTML5中文学习网 - HTML5先行者学习网
if ( !jQuery.isReady ) { fcRHTML5中文学习网 - HTML5先行者学习网
try { fcRHTML5中文学习网 - HTML5先行者学习网
//根据bug来兼容低版本的IE top.doScroll("left"); fcRHTML5中文学习网 - HTML5先行者学习网
} catch(e) { fcRHTML5中文学习网 - HTML5先行者学习网
//由于低版本的IE 浏览器,onreadystatechange事件不可靠,因此需要根据各个bug来判断页面是否已加载完成 return setTimeout( doScrollCheck, 50 ); fcRHTML5中文学习网 - HTML5先行者学习网
} fcRHTML5中文学习网 - HTML5先行者学习网
jQuery.ready(); fcRHTML5中文学习网 - HTML5先行者学习网
} fcRHTML5中文学习网 - HTML5先行者学习网
})(); fcRHTML5中文学习网 - HTML5先行者学习网
} fcRHTML5中文学习网 - HTML5先行者学习网
} fcRHTML5中文学习网 - HTML5先行者学习网
} fcRHTML5中文学习网 - HTML5先行者学习网
return readyList.promise( obj ); fcRHTML5中文学习网 - HTML5先行者学习网
};fcRHTML5中文学习网 - HTML5先行者学习网
复制代码 代码如下: