2013-02-09 14 views
10

Mam kod z wieloma podmenu, które mają tę samą nazwę klasy.W przeciwień stwie do jQuery's .Closest (Top/Far-Most?)

Oto struktura:

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

Zauważ, że .sub-menu mogą być nieskończone poziomy głębokości.

Jak to zrobić: po kliknięciu przycisku .elem chcę przechodzić przez DOM do góry, aż osiągnięty zostanie najwyższy .sub-menu i zastosować do niego styl. Jestem świadomy .closest() i .parent() i .find(), ale nie mam pojęcia, czy jQuery ma taką funkcję, takie jak .topMost(selector)?

Jedyny sposób, jaki mogę wymyślić to być może uruchomienie pętli i przejście przez .closest('.sub-menu') nowego elementu, dopóki jego długość nie wyniesie zero (nie ma więcej rodziców z tą klasą, więc musi to być najwyższa pozycja). Uważam jednak, że powinno to być bardziej praktyczne podejście.

Odpowiedz

19

Zakładając przez „przeciwieństwo najbliżej” chcesz „najdalej” elementu nadrzędnego, można użyć parents().last() coś takiego:

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

Uwaga, chcesz ostatni element tablicy jako jQuery przemierza w górę DOM, więc element najwyższego poziomu będzie ostatnim elementem kolekcji.

21

Pytanie jest nieco mylące jako. closest() może zostać źle zinterpretowane. W rzeczywistości oznacza to wyszukanie drzewa aż do znalezienia pierwszego dopasowania. Zatem przeciwieństwem jest przeszukiwanie drzewa, dopóki nie zostanie znalezione dopasowanie i ta metoda jest. first().

Aby znaleźć wszystkie potomków może użyć find(). Przeciwieństwem find() jest parents().

najbliżej() (wszystkie poziomy) Dla każdego elementu w zestawie, uzyskać pierwszy element pasujący do selektora poprzez testowanie samego elementu i przechodzenie w górę przez jej przodków w drzewie DOM.

first() (wszystkie poziomy) ograniczenie zbioru dopasowanych elementów do pierwszego w zestawie

rodziców() (wszystkie poziomy) uzyskać przodków każdego elementu w bieżącym zestawie dopasowanych elementów, opcjonalnie filtrowanych przez selektor.

nadrzędny() (obok tylko poziom) Get nadrzędny każdego elementu w bieżącym zestawem dopasowanych elementów, opcjonalnie filtrowany przez przełącznik.

znaleźć() (wszystkie poziomy) Get potomków każdego elementu do bieżącego zestawu dobranych elementów, przesączono przez przełącznik, obiekt jQuery lub elementów.

+0

Możesz zmienić tytuł na bardziej odpowiedni, jeśli uważasz, że wyjaśni cel tego pytania przyszłym czytelnikom. –

+0

Jestem z tym świetna. To, co googlełem. Po prostu napisałem to na przyszłość :) –

+3

Jest to niepoprawne, jeśli find() jest przeciwieństwem najbliższego(). find() znajdzie wszystkie elementy w drzewie. Zatem przeciwieństwem najbliższego(), przeszukiwania w dół, byłoby find(). First(). –