2011-04-11 54 views
3

在jQuery中處理.end()函數時遇到了一些問題。我讀過的文檔宣稱它是從過濾器或其他選擇中「回滾」更改。例如,使用帶有破壞性方法的jQuery end()函數

var someDivs = $('div'); 
someDivs 
    .filter('li') 
    .css('color', 'green') 
.end(); // ok, reverted back to original wrapper 

另一方面,這是行不通的。

someDivs 
    .get(0) // get DOM element at index 0 
.end(); // error, executing a jQuery method on a plain javascript object. 

我只是想確認我是正確的,某些鏈破壞性的方法,如HTML(),文本()和get()之後被調用,這是不可能恢復到原來的包裝。

在此先感謝。

+0

這不是不可能的。 '$(someDivs.get(0))端();'。要更新我的答案,並添加此。 – Khez 2011-04-11 01:59:53

+0

@Khez,這不會傷心。這相當於再次從頭開始選擇元素,在這種情況下...... end()會去哪裏? – 2011-04-11 02:06:15

+0

@ Box9 ...呃你錯了。 [一個DOM元素包裝在一個jQuery對象。](http://api.jquery.com/jQuery/) – Khez 2011-04-11 02:09:40

回答

3

是的,end()只適用於返回jQuery對象的方法。返回字符串(.html().text())或DOM元素(.get())的方法將不允許您隨後鏈接任何jQuery方法。

3

get()返回實際的HTML DOM Element而不是jQuery元素。您需要使用eq()

someDivs.eq(0).end(); 

如果你需要從一個DOM元素返回一個jQuery對象上下文。你總是可以把元素扔到$()中。例如上面的語句可以寫成:

$(someDivs.get(0)).end(); 

^這就是爲什麼你在大多數事件處理程序做$(this)。您正在通過DOM元素而不是jQuery對象。

+0

我認爲OP是知道的,因爲他提到'.html()'和'.text()'。 – 2011-04-11 01:55:08

+0

不,.end()不會讓你回到一些分區。 做.get(0)返回一個DOM元素,並因此失去原始列表歷史記錄。 – Lathan 2011-04-11 02:17:31

2

是的,你是正確的,因爲那些「破壞性」函數返回的值是而不是 jQuery對象。

但是,當您將選擇存儲在變量(例如someDivs)中時,甚至不需要使用.end()。 jQuery的遍歷函數(children()filter()等等)實際上並沒有修改它們所應用的jQuery對象,而是返回一個新的jQuery對象。 jQuery的文檔的這一部分是非常有幫助的鏈接中瞭解什麼發生:

大多數的jQuery的DOM遍歷方法上一個jQuery對象實例 運行併產生一個新的,匹配 不同組DOM元素。當 發生這種情況時,就好像元素的新集合 被推送到維持在對象內部的堆棧 上。 每個連續的過濾方法 將一個新的元素集推到 堆棧上。如果我們需要更舊的元素 集合,我們可以使用end()將集合 彈出堆棧。

由於原來的jQuery對象沒有被修改,而不是使用.end(),您可以直接引用原文:

var html = someDivs.filter('li').html(); 
var text = someDivs.filter('p').text();