国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

jQuery中的pushStack實現原理和應用實例

2019-11-20 13:14:51
字體:
來源:轉載
供稿:網友

pushStack是jQuery內核中一個非常重要的函數,它是如此重要,以至于許多jQuery內部函數中都頻繁用到它。平常情況下,雖然很少用到它, 但是掌握這個函數,不僅有利于理解jQuery的運行原理,還方便我們做更加高級的jQuery操作。

顧名思義,pushStack是入棧, 棧作為一種數據結構,是一種只能在一端進行插入和刪除操作的特殊線性表。數據入棧時,類似與我們進電梯,后進而先出, 如下圖:

jQuery中的棧其實并不是真正的棧,而是給jQuery對象附加一個屬性,指向當前對象的上一個對象, 通過end方法就能返回上一個元素。如下:

<span>1</span><span>2</span><span>3</span><script>$('span').eq(0).css('fontSize','20px').end().fadeOut(2000);</script>

上面的代碼會使第一個span的字體大小為20px,并讓所有span在2秒鐘之內fadaout。

pushStack屬于jQuery的實例方法,通過jQuery對象調用,如通過$().pushStack(document.getElementsByTagName(‘div')).css(‘background','blue')把所有div的背景都設置為藍色。那么pushStack的原理是什么,為什么傳入的DOM對象可以用css方法操作呢?先來看一下jQuery中pushStack的源碼:

pushStack: function( elems ) { // Build a new jQuery matched element set var ret = jQuery.merge( this.constructor(), elems ); // Add the old object onto the stack (as a reference) ret.prevObject = this; ret.context = this.context; // Return the newly-formed element set return ret;}//jQuery.mergemerge: function( first, second ) { var l = second.length, i = first.length, j = 0; if ( typeof l === "number" ) { for ( ; j < l; j++ ) {  first[ i++ ] = second[ j ]; } } else { while ( second[j] !== undefined ) {  first[ i++ ] = second[ j++ ]; } } first.length = i; return first;}

pushStack的實現比較簡單,主要涉及到jQuery的靜態方法merge, 這個方法用來合并對象, 設計思路是在第一個對象的基礎上,把第二個對象的屬性(0至n)附加上去, 理解這一點很重要。再回到pushStack這個函數,首先定義一個局部變量ret存儲合并對象,然后給這個對象存儲prevObject和context屬性,最后返回合并之后的ret對象。這里有幾點需要注意:
1, this.constructor 就是jQuery的構造函數init,所以this.constructor()返回一個jQuery對象.
2, 由于jQuery merge函數返回的對象是第二個函數附加到第一個上面,所以ret也是一個jQuery對象,這里可以解釋為什么pushStack出入的DOM對象也可以用CSS方法進行操作。
3, 返回的對象的prevObject屬性指向上一個對象,所以可以通過這個屬性找到棧的上一個對象.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 铜川市| 呼伦贝尔市| 德清县| 凤山县| 晋州市| 堆龙德庆县| 绵阳市| 木里| 府谷县| 句容市| 哈巴河县| 五华县| 迁西县| 巴里| 隆化县| 金坛市| 宣城市| 宿迁市| 上林县| 木兰县| 黎平县| 昔阳县| 罗城| 大田县| 宾阳县| 苍溪县| 麻栗坡县| 肇源县| 阿瓦提县| 大冶市| 永兴县| 右玉县| 西乡县| 吴堡县| 舞钢市| 台安县| 临桂县| 高青县| 安丘市| 逊克县| 和平县|