jQuery rodzic rodzica

93

Obecnie próbuję znaleźć rodzica rodzica elementu. Kliknięto łącze, które znajduje się w a <td>, i chciałbym pobrać <tr>obiekt.

Dlaczego "$ (this) .parent (). Parent ()" nie zadziała? Co będzie?

Dzięki,
Brendan

Edycja: Wygląda na to, że błąd w mojej składni zrzucił całą sprawę. „$ (this) .parent (). parent ()” faktycznie działa, ale ostatecznie zdecydowałem się na $ (this) .closest ('tr') ”, ponieważ wydaje się być najbardziej wydajnym rozwiązaniem.

bloudermilk
źródło
1
czy możesz opublikować kod, abyśmy mogli zobaczyć, dlaczego selektor nadrzędny nie działa?
TStamper

Odpowiedzi:

222

Najlepszym sposobem byłoby prawdopodobnie użycie closest:

$(this).closest('tr');

Sprawdź dokumentację :

Closest działa, najpierw sprawdzając bieżący element, aby sprawdzić, czy pasuje do określonego wyrażenia, jeśli tak, po prostu zwraca sam element. Jeśli nie pasuje, będzie kontynuował przechodzenie w górę dokumentu, rodzic po rodzicu, aż zostanie znaleziony element pasujący do określonego wyrażenia. Jeśli nie zostanie znaleziony żaden pasujący element, żaden nie zostanie zwrócony.

Paolo Bergantino
źródło
20

Powinno działać. Możesz także spróbować $ (this) .parents (tag), gdzie tag to tag, który chcesz znaleźć.

Na przykład:

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

Znajdzie najbliższy tr „w górę łańcucha”.

Philippe Leybaert
źródło
9

To powinno zadziałać ... możesz spróbować

$(this).parents(':eq(1)');

.Parents (selector) mówi, że pobierz wszystkich przodków, którzy pasują do selektora

a: eq (1) mówi, że znajdź oneth (indeksowany zero, czyli drugi) element na liście

Lathan
źródło
Możesz spróbować zaalarmować, aby upewnić się, że jest to tag kotwicy HTML. Spróbuj: alert ('anchor html (' + $ (this) .html () + ')');
Lathan
6

Ten fragment działał dla mnie w przeszłości:

$(this).parent().parent(); 

Prześlij nam kod, aby zobaczyć, czy gdzieś może być inny problem ...

Gabriel Hurley
źródło
Zgadzam się z tym. Mogę używać $(this).parent().parent()bez problemu
DrewT
5

też spróbuj

$(this).closest('div.classname').hide();
Dilip
źródło
2

Jeśli masz jakikolwiek identyfikator / klasę dla rodzica, możesz użyć rodziców (), ale to da ci wszystkich rodziców aż do <body>, chyba że przefiltrujesz () lub zatrzymasz w inny sposób, na przykład

$(this).parents('.myClass');

Mam nadzieję, że to komuś pomoże :)

abhilashv
źródło
1

Spróbuj opakować $ (this) .parent () w obiekt jQuery, taki jak $ ($ (this) .parent ()) Często widzę potrzebę zrobienia tego, aby upewnić się, że mam prawidłowy obiekt jquery. Stamtąd powinieneś być w stanie skontaktować się z rodzicem lub być może używając prev ().

kristian nissen
źródło
8
To jest całkowicie bezcelowe. Wszystko, co robisz, to marnowanie czasu, tworząc kolejny obiekt jQuery ...
James,
1
var getParentNode = function(elem, level) { 
    level = level || 1; 
    for (var i = 0; i < level; i++) {
        if (elem != null) {
            elem = elem.parentNode; 
        }
    }
    return elem; 
}
Alex Polo
źródło
0

.closest() nie zawsze jest najlepszą opcją, szczególnie gdy masz tę samą konstrukcję elementu.

<div>
    <div>
        <div>
        </div>
    </div>
</div>

Możesz zrobić rodzic rodzica i jest to bardzo łatwe:

var parent = $('.myDiv').parent();
var parentParent = $(parent).parent();
var parentParentParent = $(parentParent).parent();

itp.

Webapper
źródło