jQuery pai de um pai

93

Atualmente, estou tentando encontrar o pai de um pai de um elemento. Tenho um link sendo clicado que está em um <td>e gostaria de obter o <tr>objeto.

Por que "$ (this) .parent (). Parent ()" não funciona? O que irá?

Obrigado,
brendan

Edit: Parece que um erro na minha sintaxe estava atrapalhando tudo. "$ (this) .parent (). parent ()" de fato funciona, mas acabei optando por $ (this) .closest ('tr') "porque parece a solução mais eficiente.

bloudermilk
fonte
1
você poderia postar o código para que possamos ver por que seu seletor pai não está funcionando?
TStamper de

Respostas:

221

A melhor maneira provavelmente seria usando closest:

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

Confira a documentação :

Closest funciona examinando primeiro o elemento atual para ver se ele corresponde à expressão especificada; em caso afirmativo, ele apenas retorna o próprio elemento. Se não corresponder, ele continuará a percorrer o documento, pai por pai, até que seja encontrado um elemento que corresponda à expressão especificada. Se nenhum elemento correspondente for encontrado, nenhum será retornado.

Paolo Bergantino
fonte
20

Deve funcionar. Você também pode tentar $ (this) .parents (tag), onde tag é a tag que você deseja encontrar.

Por exemplo:

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

Vai encontrar o tr mais próximo "acima da cadeia".

Philippe Leybaert
fonte
9

Isso deve funcionar ... você pode tentar

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

O .parents (seletor) diz obter todos os ancestrais que correspondem ao seletor

e: eq (1) diz encontrar o oneth (indexado por zero, portanto o segundo) elemento na lista

Lathan
fonte
Você pode tentar alertar isso, para ter certeza de que é uma tag âncora html. Tente fazer: alert ('anchor html (' + $ (this) .html () + ')');
Lathan
6

Este snippet já teve um desempenho para mim no passado:

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

Poste algum código para nós para ver se pode haver outro problema em algum lugar ...

Gabriel Hurley
fonte
Eu concordo com isto. Posso usar $(this).parent().parent()sem problemas
DrewT
5

tente também

$(this).closest('div.classname').hide();
Dilip
fonte
2

Se você tiver qualquer tipo de id / classe para os pais, você pode usar pais (), mas isso fará com que todos os pais se ocupem do <corpo>, a menos que você filtre () ou pare de alguma outra forma como

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

Espero que isso ajude alguém :)

abhilashv
fonte
1

Tente envolver $ (this) .parent () em um objeto jQuery como $ ($ (this) .parent ()). Freqüentemente, encontro a necessidade de fazer isso para ter certeza de que tenho um objeto jquery válido. A partir daí, você poderá entrar em contato com os pais, ou talvez usando o prev ().

Kristian Nissen
fonte
8
Isso é completamente inútil. Tudo o que você está fazendo é perder tempo criando outro objeto 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
fonte
0

.closest() nem sempre é a melhor opção, especialmente quando você tem a mesma construção de elemento.

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

Você pode ser pai de um dos pais e é muito fácil:

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

etc.

Webapper
fonte