2011-10-13 11 views
5

Esta pregunta está relacionada con el rendimiento.¿Buscará jQuery la ID antes de filtrar otros parámetros en el selector?

Si utilizo un selector como la siguiente

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

O debería escribir la sentencia como esta?

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

no estoy seguro de si jQuery es lo suficientemente inteligente como para ejecutar esta declaración utilizando el ID de primera o si funciona exactamente como CSS y lee de derecha a izquierda. No es tan importante el uso de etiquetas, pero cuando se ejecuta algo así como

$('#myID .myClass') 

Se hace una gran diferencia en el rendimiento.

+1

Lo que se ve como en sus ejemplos es que usted quiere encontrar todos los elementos y luego filtro basado en el ID. '$ ('a # myID)' sería la forma en que lo haría. Seleccionará la etiqueta de anclaje que tiene la ID de miID. Escribirlo como '$ ('# myID a')' seleccionaría realmente todas las etiquetas de anclaje que son elementos secundarios de myID. – PCasagrande

+0

Es cierto que omití .children() por accidente. Está destinado a tomar el elemento padre por ID y luego filtrar a los niños que buscan un ancla. – THEtheChad

Respuesta

6

De un artículo Nettuts: http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-think-right-to-left-with-jquery/

A modo de ejemplo, si chisporroteo viene a través de un selector como $ ('# cuadro de p'), es cierto que funciona de derecha a izquierda, pero no hay también una optimización de expresión rápida que primero determinará si la primera sección de el selector es una identificación. Si es así, lo usará como contexto, cuando busque las etiquetas de párrafo.

comentario pertinente de 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

Cuando hay una identificación en el selector. jQuery primero ejecutará document.getElementById y luego comenzará a filtrar elementos secundarios.

Básicamente, esta es la razón por la que nunca es una gran idea usar simplemente los selectores de atributo o clase $('.someclass') or $('[name=myname]') sin ser más específico. Porque hace que el código atraviese el DOM y mire cada elemento para encontrar esa clase.

Con solo agregar un nombre de etiqueta al mismo selector $('div.someclass') or $('div.[name=myname]') mejora la eficacia porque primero se ejecutará. document.getElementsByTagName reduciendo el número de elementos para buscar.

Cuestiones relacionadas