2010-05-19 8 views
35

Ogólne:Jak wybrać pierwszą antenę, która pasuje do selektora?

Jak mogę wybrać pierwszy pasujący przodka elementu w jQuery?

Przykład:

Weź ten blok HTML

<table> 
    <tbody> 
     <tr> 
      <td> 
       <a href="#" class="remove">Remove</a> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <a href="#" class="remove">Remove</a> 
      </td> 
     </tr> 
    </tbody> 
</table> 

mogę usunąć wiersz w tabeli, klikając "Usuń" przy użyciu tego kodu jQuery:

$('.remove').click(function(){ 
    $(this).parent().parent().hide(); 
    return false; 
}); 

to działa , ale jest dość kruchy. Jeśli ktoś wstawi na przykład <a> w <div>, pęknie. Czy istnieje składnia wybierak w jQuery, który następuje po tej logiki:

„Oto elementem, teraz znaleźć najbliższy przodek, który pasuje pewne kryteria wyboru i powrót to”

Dzięki

Odpowiedz

56

To byłoby closest:

$(this).closest('tr').hide(); 
+0

będę zaakceptować tę odpowiedź, gdy SO pozwala mi. Byłeś zbyt szybki. Dzięki – Zach

1

Możesz przekazać selektor do argumentu nadrzędnego, który moim zdaniem.

$('.remove').click(function(){ 
    $(this).parents("tr:first").hide(); 
    return false; 
}); 

Lub możesz użyć pozycji najbliższej, zgodnie z inną odpowiedzią.

$('.remove').click(function(){ 
    $(this).closest("tr").hide(); 
    return false; 
}); 
+0

Nie, "rodzic" patrzy tylko na bezpośredniego rodzica, a nie wszystkich przodków. – interjay

+0

'rodzic' przechodzi przez pojedynczy poziom drzewa DOM, zamiast tego potrzebowałbyś' rodziców'. Ponadto wyrażenie filtru powinno mieć postać 'tr: first' (bez spacji). – karim79

+1

@karim dziękuje, nie ma kawy, kiedy odpowiedziałem. Zmodyfikowano, aby odzwierciedlić. – Gabriel

3

wolę korzystania closest jak @Kobi zaznacza (+1), ponieważ wydaje się być najbardziej zwięzły sposób, aby to zrobić. Wystarczy wskazać, można również użyć parents:

$(this).parents("tr:first") 
+0

Dobra alternatywa. Właśnie zauważyłem bit ': first' w selektorze, ponieważ' parents() '(w przeciwieństwie do' closest() ') zwraca * wiele * elementów - wszystkie pasujące elementy od bezpośredniego rodzica w górę. – Dunc

0

Zakładając, że używasz jQuery 1.4, można użyć .parentsUntil() który powróci wszystkich przodków września ale NOT w tym wybranego przodka.

Więc w twoim przypadku pójdę z czymś takim:

$('.remove').click(function(){ 
    $(this).parentsUntil("tr").parent().hide(); 
    return false; 
}); 
Powiązane problemy