jQuery中的ready方法實現了當頁面載入完成後才執行的效果,但他並不是window.onload或doucment.onload的封裝,而是使用標準W3C瀏覽器DOM隱藏api和IE瀏覽器缺陷來完成的,首先,我們來看jQuery的程式碼
DOMContentLoaded = function()
{
//取消事件監聽,並執行ready方法 if ( document.addEventListener )
{
document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
jQuery.ready();
}
else if ( document.readyState === "complete" )
{
document.detachEvent( "onreadystatechange", DOMContentLoaded );
jQuery.ready();
}
};
jQuery.ready.promise = function( obj ) {
if ( !readyList ) {
readyList = jQuery.Deferred();
//表示頁面已載入完成,直接呼叫 ready方法 if ( document.readyState === "complete" ) {
//將 jQuery.ready壓入非同步訊息佇列,設定延遲時間1毫秒(請注意,有些瀏覽器延遲不能小於4毫秒)
}
else if ( document.addEventListener ) // {
//監聽DOM載入完成 document.addEventListener( "DOMContentLoaded", DOMentLoaded, false )
} else {
//低版本的IE瀏覽器 document.attachEvent( "onreadystatechange", DOMContentLoaded )
;
window.attachEvent( "onload", jQuery.ready );
var top = false;
try {
top = window.frameElement == null && document.documentElement;
} catch(e) {}
if ( top && top.doScroll ) //剔除iframe的成分 {
(function doScrollCheck() {
if ( !jQuery.isReady ) {
try {
//使用錯誤與低版本的IE
} catch(e) {
//因低版本的IE 瀏覽器,onreadystate return setTimeout( doScrollCheck, 50 );
}
jQuery.ready();
}
})();
}
}
}
return readyList.promise( obj );
};
ready: function( wait )
{
if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
//判斷頁面是否已完成載入並且是否已經執行ready方法
return;
}
if ( !document.body ) {
return setTimeout( jQuery.ready );
}
jQuery.isReady = true; //指示ready方法已執行
if ( wait !== true && --jQuery.readyWait > 0 ) {
return;
}
readyList.resolveWith( document, [ jQuery ] );
if ( jQuery.fn.trigger ) {
jQuery( document ).trigger("ready").off("ready");
}
},
總結:
頁載入完成有兩種事件,一是ready,表示文件結構已經載入完成(不包含圖片等非文字媒體檔案),二是onload,指示頁麵包含圖片等檔案在內的所有元素都載入完成。 (可以說:ready 在onload 前加載!!!)
一般樣式控制的,例如圖片大小控制放在onload 裡面載入;
jS事件觸發的方法,可以在ready 裡面載入;