2010-01-25 13 views
9

Esto es más una pregunta curiosa. Al hacer lo siguiente:Rendimiento jQuery al seleccionar varios elementos

$('.selector1, .selector2').doSomething() 

¿Se jQuery atraviesan totalmente el DOM dos veces para cada conjunto de objetos que coinciden con cada selector o es que la búsqueda de todos los elementos en un recorrido de la DOM?

+0

No lo creo porque por lo que he visto en el núcleo las coincidencias se realizan con expresiones regulares en varias propiedades de nodo (nodeName, NodeType, id, etc.) De modo que cualquier selector individual produce una iteración del DOM. Sin embargo, no soy 100% positivo en esto, por lo que voy a diferir a otros más familiarizados con las partes internas :-) – prodigitalson

+0

en realidad el ejemplo es malo porque el nodo '' no existe en HTML :) –

+0

Creo que lo que quieres hacer es busque el motor selector, Sizzle, cuyo código fuente puede ver: http://github.com/jeresig/sizzle/ http://github.com/jeresig/sizzle/blob/master/sizzle.js – artlung

Respuesta

1

creo que utiliza las funciones del navegador nativo para encontrar esto, usando:

document.getElementsByClassName() 
1

Realmente depende del navegador. En los navegadores más nuevos, usará document.querySelectorAll para cualquier consulta DOM (bajo esto se llama a document.getElementsByClassName para las clases). En los navegadores más antiguos que no son compatibles con esto, entonces tiene que resolverlo por sí mismo, lo que obviamente será más lento.

En general, debería preferir primero buscar cosas por identificación (o al menos restringir el alcance). Los nombres de clase y etiqueta serían los siguientes para la velocidad. Básicamente, las operaciones de DOM compatibles son las mejores.

+0

Suena como que en la mayoría de los casos, va a atravesar el DOM cada vez para cada selector. Aunque la forma en que atraviesa el DOM diferirá según el tipo de selector (elemento vs. ID vs. clase)? –

+0

Sí, utilizará una expresión regular para dividir todas sus consultas y ejecutarlas de a una por vez. Sin embargo, no me preocuparía el rendimiento de las clases o los ID. –

Cuestiones relacionadas