您好,登錄后才能下訂單哦!
jQuery核心函數(shù)除了最重要的jQuery()之外,還有jQuery.holdReady()、jQuery.sub()、jQuery.when()、jQuery.noConflict()。今天我就介紹一下這四個方法吧。
首先是jQuery.holdReady(),直接上代碼:
holdReady: function( hold ) { if ( hold ) { jQuery.readyWait++; // readyWait就是一個計數(shù)器,表示還有多少個條目就緒事件才能執(zhí)行
} else { jQuery.ready( true ); } }
使用方法如下:
jQuery.holdReady( hold )
作用:暫停或恢復(fù).ready() 事件的執(zhí)行
參數(shù):hold為boolean值,指示是否暫?;蚧謴?fù)被請求的ready事件
jQuery.holdReady()方法允許jQuery的完成事件被該函數(shù)鎖定。這個高級特性的典型應(yīng)用場合是動態(tài)載入腳本,比如jQuery插件等。在附加的腳本載入完成前,即使頁面已經(jīng)準(zhǔn)備好,jQuery的完成事件也不會被觸發(fā)。這個函數(shù)必須在頁面的靠前部分被調(diào)用,比如在<head>標(biāo)簽當(dāng)中,jQuery載入下一行。在完成事件被觸發(fā)后調(diào)用此函數(shù)沒有任何效果。使用方法:首先調(diào)用$.holdReady(true)[調(diào)用后完成事件將被鎖定]。當(dāng)準(zhǔn)備好觸發(fā)完成事件時,調(diào)用$.holdReady(false)。需要注意的是,可以對完成事件添加多個鎖定,每個鎖定對應(yīng)一次$.holdReady(false)[解鎖]調(diào)用。jQuery的完成事件將在所有的鎖定都被解除,并且頁面也已經(jīng)準(zhǔn)備好的情況下被觸發(fā)。實際上就是為一些需要依賴動態(tài)腳本的代碼加的一個安全鎖,當(dāng)所需要的動態(tài)腳本加載完畢后再執(zhí)行就緒事件,而不是在DOM樹構(gòu)建成功后執(zhí)行。
這里面又涉及到了jQuery.ready()方法:
ready: function( wait ) { // 如果還有等待的事件的話就取消執(zhí)行,直接返回 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { return; } // 確定文檔的body已經(jīng)存在,延遲執(zhí)行是為了防止IE“抽風(fēng)” if ( !document.body ) { return setTimeout( jQuery.ready, 1 ); } // isReady屬性用來表示DOM樹是否可用 jQuery.isReady = true; // 如果正常的ready事件觸發(fā), 減少等待的數(shù)目,然后繼續(xù)等待 if ( wait !== true && --jQuery.readyWait > 0 ) { return; } readyList.resolveWith( document, [ jQuery ] ); // Trigger any bound ready events if ( jQuery.fn.trigger ) { jQuery( document ).trigger("ready").off("ready"); } }
請注意,這里的jQuery.ready()和jQuery(document).ready()是不一樣的。
接著分析jQuery.sub()方法。該方法不接收參數(shù),它的作用就是復(fù)制一份jQuery副本,并且不影響原來的jQuery對象:
jQuery.sub = function() { function jQuerySub( selector, context ) { return new jQuerySub.fn.init( selector, context ); } jQuery.extend( true, jQuerySub, this ); jQuerySub.superclass = this; jQuerySub.fn = jQuerySub.prototype = this(); jQuerySub.fn.constructor = jQuerySub; jQuerySub.sub = this.sub; jQuerySub.fn.init = function init( selector, context ) { if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { context = jQuerySub( context ); } return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); }; jQuerySub.fn.init.prototype = jQuerySub.fn; var rootjQuerySub = jQuerySub(document); return jQuerySub; };
jQuery.sub這個方法主要用于兩類特殊的情況,第一種情況是在不用污染jQuery對象原生方法的情況下提供一種干凈的方式去覆蓋擴(kuò)展jQuery對象,另一種情況是幫助開發(fā)者封裝和為jQuery插件構(gòu)建一個命名空間。有了這個方法以后,就可以在混沌的jQuery插件世界里構(gòu)建一個完全只屬于自己的插件模塊而不用擔(dān)心自己模塊會被污染或者自己的插件會和別的插件有沖突,但是同時也有幾點需要注意,sub對象中所有的方法都指向原生的jQuery對象,也意味著事件的綁定和派發(fā)以及綁定在elments中的data項仍然需要經(jīng)過全局的jQuery對象,此外還有ajax等。仔細(xì)看該方法的內(nèi)部實現(xiàn),很像縮小版的jQuery對象創(chuàng)建過程。它首先初始化一個新的function對象用于copy原生jQuery對象,接著借助原型鏈為sub對象copy原生對象的方法,再然后 產(chǎn)生新的document的上下文rootjQuerySub,最后在新的jQuerySub內(nèi)部初始化方法中調(diào)用原生的init方法進(jìn)行初始化,和jQuery原版對象的創(chuàng)建流程基本上一樣!
還有倆,加油。jQuery.when()方法可接受一個或多個參數(shù),該方法提供了一種方法來執(zhí)行一個或多個參數(shù)延遲對象的回調(diào)函數(shù),參數(shù)延遲對象通常表示異步事件:
when: function( subordinate /* , ..., subordinateN */ ) { var i = 0, resolveValues = core_slice.call( arguments ), length = resolveValues.length, // the count of uncompleted subordinates remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, // the master Deferred. If resolveValues consist of only a single Deferred, just use that. deferred = remaining === 1 ? subordinate : jQuery.Deferred(), // Update function for both resolve and progress values updateFunc = function( i, contexts, values ) { return function( value ) { contexts[ i ] = this; values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; if( values === progressValues ) { deferred.notifyWith( contexts, values ); } else if ( !( --remaining ) ) { deferred.resolveWith( contexts, values ); } }; }, progressValues, progressContexts, resolveContexts; // add listeners to Deferred subordinates; treat others as resolved if ( length > 1 ) { progressValues = new Array( length ); progressContexts = new Array( length ); resolveContexts = new Array( length ); for ( ; i < length; i++ ) { if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { resolveValues[ i ].promise() .done( updateFunc( i, resolveContexts, resolveValues ) ) .fail( deferred.reject ) .progress( updateFunc( i, progressContexts, progressValues ) ); } else { --remaining; } } } // if we're not waiting on anything, resolve the master if ( !remaining ) { deferred.resolveWith( resolveContexts, resolveValues ); } return deferred.promise(); }
這段代碼我也看得似懂非懂,所以具體的分析我就不寫了,如果你想深入了解的話參考:http://cmc3.cn/n/249.html和http://nuysoft.iteye.com/blog/1174798
最后一個方法,jQuery.noConflict(),用于解決命名沖突的問題。該方法接受一個可選的boolean參數(shù),如果該參數(shù)=true,則將全局變量$和全局變量jQuery的控制權(quán)全部讓出;如果沒有參數(shù)或者該參數(shù)=false,則只將全局變量$的控制權(quán)讓出。
注:如果將全局變量jQuery的控制權(quán)也讓出,我們必須考慮到大多數(shù)插件依靠jQuery存在的變量,這種情況,可能不能正常操作。
noConflict: function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; } if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; } return jQuery; }
代碼就不解釋了,是個人就能看懂,今天就寫到這吧。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。