Para selecionar um nó filho no jQuery, pode-se usar children (), mas também find ().
Por exemplo:
$(this).children('.foo');
dá o mesmo resultado que:
$(this).find('.foo');
Agora, qual opção é mais rápida ou preferida e por quê?
jquery
jquery-selectors
bart
fonte
fonte
.find()
e.children()
não são os mesmos. O último viaja apenas um único nível na árvore do DOM, como um seletor filho.find()
quase sempre é mais rápido.Respostas:
children()
apenas analisa os filhos imediatos do nó, enquantofind()
percorre todo o DOM abaixo do nó, portanto,children()
deve ser mais rápido com implementações equivalentes. No entanto,find()
usa métodos nativos do navegador, enquantochildren()
usa JavaScript interpretado no navegador. Nas minhas experiências, não há muita diferença de desempenho em casos típicos.O qual usar depende se você deseja considerar apenas os descendentes imediatos ou todos os nós abaixo deste no DOM, ou seja, escolha o método apropriado com base nos resultados desejados, não na velocidade do método. Se o desempenho for realmente um problema, experimente encontrar a melhor solução e use-a (ou veja alguns dos benchmarks nas outras respostas aqui).
fonte
Esse teste jsPerf sugere que find () é mais rápido. Eu criei um teste mais completo e ainda parece que find () supera children ().
Atualização: conforme o comentário do tvanfosson, criei outro caso de teste com 16 níveis de aninhamento. find () é apenas mais lento ao encontrar todos os divs possíveis, mas find () ainda supera child () ao selecionar o primeiro nível de divs.
children () começa a superar find () quando há mais de 100 níveis de aninhamento e cerca de 4000 divs para find () a percorrer. É um caso de teste rudimentar, mas ainda acho que find () é mais rápido que crianças () na maioria dos casos.
Consultei o código jQuery nas Ferramentas para desenvolvedores do Chrome e notei que children () faz chamadas internamente para sibling (), filter () e passa por mais algumas regexes do que find ().
find () e children () atendem a necessidades diferentes, mas nos casos em que find () e children () produziriam o mesmo resultado, eu recomendaria o uso de find ().
fonte
Aqui está um link que possui um teste de desempenho que você pode executar.
find()
é na verdade cerca de 2 vezes mais rápido quechildren()
.fonte
var $test = $list.find('.test');
onde $ list é o objeto jQuery. jsperf.com/jquery-selectors-context/101Isso não necessariamente dará o mesmo resultado:
find()
você obterá qualquer nó descendente , enquantochildren()
apenas os filhos imediatos correspondentes.A certa altura,
find()
era muito mais lento, pois era necessário procurar todos os nós descendentes que pudessem corresponder, e não apenas filhos imediatos. No entanto, isso não é mais verdade;find()
é muito mais rápido devido ao uso de métodos nativos do navegador.fonte
find()
era muito mais lento na época!Nenhuma das outras respostas lidou com o caso de utilização
.children()
ou.find(">")
a única procurar filhos imediatos de um elemento pai. Então, criei um teste jsPerf para descobrir , usando três maneiras diferentes de distinguir filhos.Por acaso, mesmo ao usar o seletor ">" extra,
.find()
ainda é muito mais rápido que.children()
; no meu sistema, 10x isso.Portanto, da minha perspectiva, não parece haver muitos motivos para usar o mecanismo de filtragem
.children()
.fonte
Para simplificar:
find()
- pesquise o filho, neto, bisneto dos elementos correspondentes ... todos os níveis.children()
- pesquise somente o filho dos elementos correspondentes (nível único abaixo).fonte