2013-02-09 31 views
10

我有一個包含許多共享相同類名的子菜單的代碼。jQuery's .Closest(Top/Far-Most?)對面

這裏有一個結構:

.menu 
    .sub-menu 
    .sub-menu 
    .sub-menu 
    .sub-menu 
    .sub-menu 
    .sub-menu 
     .elem 
     .elem 
    .sub-menu 

注意.sub-menu可能是無限級深。

那麼我該如何實現這一點:當點擊.elem時,我想向上遍歷DOM,直到達到最高的.sub-menu並對其應用樣式。我知道.closest().parent().find(),但我不知道jQuery是否有這樣的功能,如.topMost(selector)

我能想到的唯一方法是運行一個循環,然後通過新元素的.closest('.sub-menu'),直到它的長度爲零(這個類沒有更多的父母,所以它必須是最頂層的)。不過,我認爲應該有一個更實際的方法來解決這個問題。

回答

19

由你想要的「最遠的」父元素「最接近」相反假設,你可以使用parents().last(),像這樣:

$('.elem').click(function() { 
    var $topSubMenu = $(this).parents('.sub-menu').last(); 
}); 

注意,要在陣列中的最後一個元素的jQuery遍歷了DOM,因此頂級項目將成爲集合中的最後一個項目。

21

這個問題有點誤導。 closest()可能會被誤解。實際上它意味着搜索樹直到找到第一場比賽。所以相反的是在樹下搜索,直到找到匹配並且該方法是。 first().

要查找全部後代可以使用find()find()的反義詞是parents()

最接近()(各級) 對於組中的每一個元素,獲取通過測試元件本身和DOM樹向上遍歷通過它的祖先選擇相匹配的第一個元素。

第一()(各級) 減少匹配的元素到所述第一集合中的

父母()(各級) 獲取的每個元件的祖先在當前的匹配元素集合中,可選地由選擇器進行過濾。

父()(僅下一級) 獲取當前匹配的元素集合中的每個元素的父,任選地通過一個選擇器過濾。

查找()(各級)獲取每個元素的後代在當前匹配的元素,通過一個選擇器,jQuery對象,或元件過濾。

+0

如果您認爲它將爲未來的讀者闡明問題的目的,請隨意將標題編輯爲更合適的標題。 – 2013-06-14 08:42:44

+0

我很酷。它是什麼我Google搜索。剛剛發佈以備將來參考:) – 2013-06-14 09:37:29

+3

這對於find()與nearest()的相反是不正確的。 find()將查找樹中的所有元素。所以,最接近()的相反,搜索下來,將是find()。first()。 – 2014-02-27 20:34:28