Quando eu quero obter, por exemplo, o pai do terceiro nível do elemento que devo escrever $('#element').parent().parent().parent()
Existe um método mais ideal para isso?
javascript
jquery
parent
Artur Keyan
fonte
fonte
Respostas:
Como parents () retorna os elementos ancestrais ordenados do mais próximo ao externo, você pode encadeá-lo no eq () :
fonte
$('.element').first().parents().eq(num);
[2]
retornará o elemento DOM subjacente, usingeq(2)
retornará um objeto jQuery.Depende de suas necessidades, se você souber qual pai está procurando, poderá usar o seletor .parents ().
EG: http://jsfiddle.net/HenryGarle/Kyp5g/2/
Exemplo usando índice:
fonte
Você pode dar ao pai de destino um ID ou classe (por exemplo, myParent) e a referência é com
$('#element').parents(".myParent")
fonte
Uma maneira mais rápida é usar o javascript diretamente, por exemplo.
Isso funciona significativamente mais rápido no meu navegador do que encadear
.parent()
chamadas jQuery .Consulte: http://jsperf.com/jquery-get-3rd-level-parent
fonte
Não encontrei nenhuma resposta usando
closest()
e acho que é a resposta mais simples quando você não sabe quantos níveis estão acima do elemento necessário, portanto, postando uma resposta:Você pode usar a
closest()
função combinada com seletores para obter o primeiro elemento correspondente ao percorrer o elemento para cima:fonte
É simples. Apenas use
onde 0 é o nível pai (0 é pai, 1 é pai etc)
fonte
Basta adicionar o
:eq()
seletor como este:Você acabou de especificar o índice que pai: 0 para pai imediato, 1 para pai principal, ...
fonte
Se você planeja reutilizar essa funcionalidade, a solução ideal é criar um plug-in jQuery:
Obviamente, convém estendê-lo para permitir um seletor opcional e outras coisas.
Uma observação: isso usa um
0
índice baseado para os pais,nthParent(0)
o mesmo que chamarparent()
. Se você preferir ter uma1
indexação baseada, usen-- > 0
fonte
var p = 1 + n; while (p--) { $p = $p.parent(); }
e se você quer mudar para uma base, Javascript sendo "Falsey" você pode usar:while (n--) { $p = $p.parent();}
salvar uma verificação condicionalnthParent(-2)
? Seu exemplo está quebrado.(function($) { $.fn.nthParent = function(n) { return $(this).parents().eq(n); }; }(jQuery));
parents
qual estará incorreto para seleções com mais de um elemento.var p = n >? (1 + n):1;
retornaria o primeiro pai nesse caso, em vez de "nada" - ou onde ele interrompe o loop no meu exemplo. ASSIM, provavelmente deveria ser:(function($) { $.fn.nthParent = function(n) { var $p = $(this); if (!(n > -0)) { return $() }; var p = 1 + n; while (p--) { $p = $p.parent(); } return $p; }; }(jQuery));
se você não quiser retornar nada.Se você tem uma div pai comum, pode usar o link parentsUntil ()
por exemplo:
$('#element').parentsUntil('.commonClass')
A vantagem é que você não precisa se lembrar de quantas gerações existem entre esse elemento e o pai comum (definido pela classe comum).
fonte
você também pode usar :
ex:
$(this).ancestors().eq(2)
-> o pai do pai dethis
.fonte
Você poderia usar algo como isto:
http://jsfiddle.net/Xeon06/AsNUu/
fonte
o uso de eq parece capturar o DOM dinâmico, enquanto o uso de .parent (). parent () parece capturar o DOM que foi carregado inicialmente (se isso for possível).
Eu uso os dois em um elemento que tem classes aplicado em onmouseover. eq mostra as classes enquanto .parent (). parent () não.
fonte
Como parents () retorna uma lista, isso também funciona
fonte