2011-10-13 18 views
5

Questa domanda è correlata alla prestazione.jQuery cercherà l'ID prima di filtrare altri parametri nel selettore?

Se uso un selettore come la seguente

$('#myID a') // Does this find #myID and filter by a? 

O dovrei scrivere la dichiarazione come questo?

$('#myID').find('a') 

io non sono sicuro se jQuery è abbastanza intelligente per eseguire questa istruzione utilizzando l'ID primo o se funziona esattamente come CSS e legge da destra a sinistra. Non è un grosso problema con i tag, ma quando si esegue qualcosa come

$('#myID .myClass') 

Si fa una grande differenza in termini di prestazioni.

+1

Come appare nei tuoi esempi è che si desidera trovare tutti gli elementi poi filtrare in base all'ID. '$ ('a # myID)' sarebbe il modo in cui lo farei. Seleziona il tag di ancoraggio che ha l'ID di myID. Digitandolo come '$ ('# myID a')' in realtà selezionerebbe tutti i tag di ancoraggio che sono figli di myID. – PCasagrande

+0

Vero, ho omesso il .children() in caso di incidente. È pensato per afferrare l'elemento genitore tramite id e poi filtrare i bambini che cercano un'ancora. – THEtheChad

risposta

6

Da un articolo di Nettuts: http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-think-right-to-left-with-jquery/

Per fare un esempio, se Sizzle si imbatte in un selettore come $ ('# box p'), è vero che funziona da destra a sinistra, ma non c'è anche una rapida regex ottimizzazione che prima determinerà se la prima sezione di il selettore è un id. Se è così, lo userà come contesto, quando cerca i tag di paragrafo.

relativo commento da SizzleJS:

// Take a shortcut and set the context if the root selector is an ID 
// (but not if it'll be faster if the inner selector is an ID) 
3

Quando un ID è nel selettore. jQuery eseguirà prima document.getElementById quindi inizierà il filtraggio per gli elementi figlio.

in fondo questo è il motivo per cui non è mai una buona idea usare solo selettori di attributo o classe $('.someclass') or $('[name=myname]') senza essere più specifici. Perché fa sì che il codice attraversi il DOM e guardi ogni elemento per trovare quella classe.

Semplicemente aggiungendo un tagname allo stesso selettore $('div.someclass') or $('div.[name=myname]') si migliora l'efficienza perché verrà prima eseguito. document.getElementsByTagName restringere il numero di elementi da cercare.