Cosa sono i bambini più veloci () o find () in jQuery?


320

Per selezionare un nodo figlio in jQuery è possibile utilizzare children () ma anche find ().

Per esempio:

$(this).children('.foo');

dà lo stesso risultato di:

$(this).find('.foo');

Ora, quale opzione è più veloce o preferita e perché?


27
.find()e .children()non sono gli stessi. Quest'ultimo percorre solo un singolo livello lungo l'albero del DOM, come un selettore figlio.
Timothy003,

1
@ Timothy003 L'hai descritta male, la prima viaggia a un livello inferiore, non la seconda
Dipesh Rana,

5
@DipeshRana il 'secondo' applicato alla frase di Timothy003, non alla domanda.
Jayesh Bhoot,

1
Grazie per aver sollevato questo problema. In molti casi la differenza di prestazioni è banale, ma i documenti in realtà non menzionano che questi due metodi siano implementati in modo diverso! Per motivi di buone pratiche, è bene sapere che find()è quasi sempre più veloce.
Steve Benner,

Ecco perché non mi è mai piaciuta la costruzione della "prima" o della "seconda" in inglese. Di 'solo quello che vuoi dire. Sheesh.
Chris Walker,

Risposte:


415

children()guarda solo i figli immediati del nodo, mentre find()attraversa l'intero DOM sotto il nodo, quindi children() dovrebbe essere più veloce dato implementazioni equivalenti. Tuttavia, find()utilizza metodi browser nativi , mentre children()utilizza JavaScript interpretato nel browser. Nei miei esperimenti non c'è molta differenza di prestazioni nei casi tipici.

Quale utilizzare dipende dal fatto che si desideri considerare solo i discendenti immediati o tutti i nodi al di sotto di questo nel DOM, ovvero scegliere il metodo appropriato in base ai risultati desiderati, non alla velocità del metodo. Se le prestazioni sono davvero un problema, allora sperimenta per trovare la soluzione migliore e usala (o vedi alcuni dei benchmark nelle altre risposte qui).


9
Certo, ma cosa succede se l'elemento genitore ha solo nodi figlio? Ho intenzione di fare un po 'di profilazione su questo.
Jason,

11
Le prestazioni di children vs find dipendono dal browser e dalla complessità della ricerca del DOM. Sui browser moderni find () utilizza internamente querySelectorAll che può facilmente superare i figli () nel selettore complesso e su sottostruttura DOM piccola o moderata.
LeJared,

Aiuterebbe a fornire alcuni risultati quantitativi dei tuoi esperimenti.
Luca,

Per me in tutti i test con annidamenti gerarchici tra 5 e 20 find () ha sempre sovraperformato i bambini (). (testato su Google Chrome 54) Mi aspettavo il contrario. Quindi d'ora in poi prenderò la strada semplice e troverò (...) i miei elementi invece di attraversarli attraverso i bambini (). Children (). Children () ...
Ruwen

179

Questo test jsPerf suggerisce che find () è più veloce. Ho creato un test più approfondito , e sembra ancora che find () superi i bambini ().

Aggiornamento: secondo il commento di tvanfosson, ho creato un altro caso di test con 16 livelli di annidamento. find () è più lento solo quando trova tutti i div possibili, ma find () supera ancora i bambini () quando si seleziona il primo livello di div.

children () inizia a sovraperformare find () quando ci sono oltre 100 livelli di annidamento e circa 4000+ div per essere trovati da find (). È un caso di test rudimentale, ma penso ancora che find () sia più veloce dei bambini () nella maggior parte dei casi.

Ho esaminato il codice jQuery in Strumenti per gli sviluppatori di Chrome e ho notato che children () effettua chiamate interne a sibling (), filter () e passa attraverso alcune regex in più rispetto a find ().

find () e children () soddisfano esigenze diverse, ma nei casi in cui find () e children () generano lo stesso risultato, consiglio di utilizzare find ().


4
Sembra che i bambini utilizzino metodi di attraversamento dom e find utilizzi il selettore api, che è più veloce.
topek,

4
Caso di prova piuttosto degenerato poiché hai un solo livello di annidamento. Se si desidera il caso generale, è necessario impostare alcune profondità di annidamento arbitrarie e controllare le prestazioni mentre find () attraversa alberi più profondi rispetto ai bambini ().
tvanfosson,

Se stai verificando se un elemento figlio singolare specifico (ad es. Event.target) si trova in un elemento dom specifico (ad es. $ ('. Navbar')), allora $ .contains (questo, event.target) è di gran lunga il più veloce (8.433.609 / secondo contro 140k per la ricerca jquery più veloce). jsperf.com/child-is-in-parent
Chris Sattinger,

92

Ecco un link che ha un test delle prestazioni che puoi eseguire. find()è in realtà circa 2 volte più veloce di children().

Chrome su OSX10.7.6


$ .contains (document.getElementById ('list'), $ ('. test') [0]) è 8.433.609 / secondo. Se hai elementi specifici e vuoi solo sapere se B è in A, allora è meglio. jsperf.com/child-is-in-parent
Chris Sattinger,

Bel test. Nota che può essere ancora più veloce se fai qualcosa come var $test = $list.find('.test');$ list è l'oggetto jQuery. jsperf.com/jquery-selectors-context/101
Maciej Krawczyk

24

Quelli non forniranno necessariamente lo stesso risultato: find()ti daranno un nodo discendente , mentre children()ti daranno solo figli immediati che corrispondono.

Ad un certo punto, è find()stato molto più lento poiché ha dovuto cercare ogni nodo discendente che potesse essere una corrispondenza e non solo figli immediati. Tuttavia, questo non è più vero; find()è molto più veloce grazie all'utilizzo di metodi browser nativi.


1
Non secondo le altre risposte haha: p. Solo quando hai un albero DOM molto, molto, molto grande ..
pgarciacamou,

1
@Camou Questa risposta ha quattro anni. find()era molto più lento al momento!
John Feminella,

@camou sta dicendo che la parte della performance era "Non secondo le altre risposte". Il primo paragrafo di questa risposta è accurato.
Don Cheadle,

14

Nessuna delle altre risposte ha affrontato il caso dell'utilizzo .children()o .find(">")della ricerca solo dei figli immediati di un elemento padre. Quindi, ho creato un test jsPerf per scoprirlo , usando tre modi diversi per distinguere i bambini.

In effetti, anche usando il selettore ">" extra, .find()è ancora molto più veloce di .children(); sul mio sistema, 10 volte.

Quindi, dal mio punto di vista, non sembra esserci molta ragione per usare il meccanismo di filtraggio .children().


3
Grazie per questo commento! Mi chiedo se jQuery debba semplicemente passare a .children (x) essere un alias per .find (">" + x), anche se probabilmente ci sono altre complicazioni a cui non sto pensando.
Michael Scott Cuthbert,

1
Questo sembra il confronto più appropriato. Grazie!
GollyJer,

3

Entrambi find()e i children()metodi vengono utilizzati per filtrare il figlio degli elementi corrispondenti, tranne per il fatto che il primo percorre qualsiasi livello verso il basso, il secondo percorre un singolo livello verso il basso.

Per semplificare:

  1. find() - cerca tra i figli, il nipote, il pronipote degli elementi corrispondenti ... tutti i livelli giù.
  2. children() - cerca solo nel figlio degli elementi corrispondenti (livello singolo giù).
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.