jQuery之end()和pushStack()使用介紹

來源:互聯網
上載者:User

但在我們自己寫jQuery代碼的時候,卻很少關注或使用過pushStack(). 如果我們需要寫個涉及DOM遍曆的外掛程式,它就會顯得尤其有用.

在jQuery內部,pushStack()方法通過改變一個jQuery對象的prevObject屬性來"跟蹤"鏈式調用中前一個方法返回的DOM結果集(被jQuery封裝過,也是個jQuery對象,說是"跟蹤",是因為實際儲存的是個引用). 當我們再鏈式調用end()方法後, 內部就返回當前jQuery對象的prevObject. 具體更多細節, 直接看源碼即可. 這裡只做個簡單的分析, 直接來個例子:

html: 複製代碼 代碼如下:<div id="grandparent">
I am grandparent.
<div id="parent">
I am parent.
<div id="child">
I am child.
</div>
</div>
</div>

javascript: 複製代碼 代碼如下:var els = $('#child').parent().parent();
console.dir(els);

圖解:

瞭解這個之後, 我們來做一個grandparent外掛程式,用來替代.parent().parent()這樣連續2次的調用,直接用.grandparent().如果"一不小心"沒考慮end()的話,代碼很可能就是這個樣子的:

複製代碼 代碼如下:$.fn.grandparent = function() {
return this.parent().parent();
};

依舊用上面那個例子:

複製代碼 代碼如下:$('#child').grandparent().end(); //jQuery-[div#parent]

很顯然, 大多數情況下這不是我們想要的, 事實上我們想通過鏈式調用end()直接返回到jquery[div#child]. 現在該是pushStack出馬的時候了,我們只要加上一行即可:

複製代碼 代碼如下:$.fn.grandparent = function() {
var els = this.parent().parent();
return this.pushStack(els.get());
};

在pushStack內部, 把els.get()返回的DOM數組封裝成一個新的jQuery對象, 而this(jQuery[div#child])會賦值給之前新構建jQuery的prevObject, 最後返回新生的那個jQuery對象.

所以這次, 當我們再用end()就對了: 複製代碼 代碼如下:var grandparent = $('#child').grandparent()./* jquery-[div#grandparent]*/.end() /*jquery-[div#child]*/

此博文內容的主體思想來自Learning JQuery中的一篇部落格, 感謝該作者的分享. 感興趣的話, 點擊jQuery pushStack.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.