jQuery之end()和pushStack()使用介紹
更新時間:2012年02月07日 00:15:23 作者:
pushStack()方法在jQuery的DOM操作中被頻繁的使用, 如在parent(), find(), filter()中, 當然還有其他許多類似的方法, 它們往往需要返回一個jQuery封裝過的DOM結果集
但在我們自己寫jQuery代碼的時候,卻很少關注或使用過pushStack(). 如果我們需要寫個涉及DOM遍歷的插件,它就會顯得尤其有用.
在jQuery內部,pushStack()方法通過改變一個jQuery對象的prevObject屬性來"跟蹤"鏈式調用中前一個方法返回的DOM結果集(被jQuery封裝過,也是個jQuery對象,說是"跟蹤",是因為實際存儲的是個引用). 當我們再鏈式調用end()方法后, 內部就返回當前jQuery對象的prevObject. 具體更多細節(jié), 直接看源碼即可. 這里只做個簡單的分析, 直接來個例子:
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);
圖解:
$.fn.grandparent = function() {
return this.parent().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]*/
在jQuery內部,pushStack()方法通過改變一個jQuery對象的prevObject屬性來"跟蹤"鏈式調用中前一個方法返回的DOM結果集(被jQuery封裝過,也是個jQuery對象,說是"跟蹤",是因為實際存儲的是個引用). 當我們再鏈式調用end()方法后, 內部就返回當前jQuery對象的prevObject. 具體更多細節(jié), 直接看源碼即可. 這里只做個簡單的分析, 直接來個例子:
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);
圖解:

復制代碼 代碼如下:
$.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.
您可能感興趣的文章:
相關文章
基于jQuery實現帶動畫效果超炫酷的彈出對話框(附源碼下載)
這是一款基于jQuery的彈出對話框插件,這個jQuery對話框插件的最大特點是彈出和關閉都帶有非常炫酷的動畫特效,需要的朋友參考下吧2016-02-02
jQuery學習筆記(3)--用jquery(插件)實現多選項卡功能
多選項卡功能的網站有很多,本人在那么多的類似插件中,目前碰到這個比較好,花了點時間調試出來了與大家分享,感興趣的朋友可以參考下哈希望對你有所幫助2013-04-04
jQuery在vs2008及js文件中的無智能提示的解決方法
我通過下面方法實現了jQuery在VS2008及js文件中的智能提示的,希望對朋友們有所幫助。2010-12-12
關于juqery radio寫法的兼容性問題(新老版本jquery)
最近經客戶反映,頁面某些效果無反應,經查找,發(fā)現juqery的寫法有問題(jquery獲取radio值),主要是因為新版本修改了部分實現方式。2010-06-06

