Hoy voy a hablar de como funciona el motor de selectores de JQuery que se denomina JQuery Sizzle Engine . Este motor se encarga de a partir de un selector dado seleccionar las diferentes selecciones en la página HTML de la forma mas óptima posible. Para entenderlo mejor vamos a revisar el siguiente bloque de código.
$(document).ready(function () { $("#zona").css("color","blue"); });
Selectores de ID y Clase
Es un código muy sencillo que JQuery tiene que procesar .¿Ahora bien como lo hace exactamente? . Bueno en este primer ejemplo todo es sencillo JQuery analiza la expresión y al darse cuenta que es un selector de Id (utiliza expresiones regulares para ello ). Delega en el método document.getElementById(“zona”) de Javascript que como todos sabemos selecciona un único nodo por Id del documento.
Algo similar sucederá si utilizamos el siguiente selector :
$(document).ready(function () { $(".elemento").css("color","blue"); });
En este caso se trata de un selector de clase . Por lo tanto JQuery después de analizarlo podrá delegar en el método document.getElementsByClassName().
Algo similar ocurre con document.getElementsByTagName(). ¿Ahora bien que pasará si lo que tenemos que seleccionar es algo mas complejo como por ejemplo lo siguiente? .
$(document).ready(function () { $("#zona .elemento").css("color","blue"); });
El método querySelectorAll
Bueno si revisamos las funciones anteriores rapidamente nos damos cuenta que no encajan .La primera selecciona por ID y la segunda por ClassName. Ninguno de los dos métodos soporta una expresión compuesta. Para solventar este problema JQuery delega en otro método de Javascript document.querySelectorAll(“#zona .elemento”). Este método soporta que se le pase cualquier selector válido de CSS. De esta forma solventamos el problema.
El motor Sizzle
Una vez hemos explicado como JQuery delega en Javascript para el uso de los distintos métodos del API nos queda un problema . ¿Que sucede con selectores mas complejos que no estan soportados por Javascript pero si por JQuery?. Un ejemplo de esta casuistica es el siguiente selector eq(1).
$(document).ready(function () { $(".elemento :eq(1)).css("color","blue"); });
Es en este caso en el que JQuery no puede usar ninguna de las funciones del objeto document de forma directa .No le queda mas remedio que delegar en un motor especial que tiene diseñado y se denomina Sizzle. Este motor evaluará el selector por complejo que sea y lo partirá en bloques para poder abordar la busqueda que le hemos pedidos como se muestra a continuación
Una vez hecho esto JQuery utilizará su método find del motor Sizzle para leer la expresión de derecha a izquierda y ir localizando nodos del arbol DOM que encajen . Así pues en este caso buscará todos los nodos que están en la segunda posición (recordemos eq comienza en 0) de un grupo de nodos.Una vez los tiene seleccionados buscará cuales de estos tienen como padre directo un class “.elemento” y así sucesivamente. Sin embargo esta busqueda será mas lenta que las anteriores.
JQuery Rendimiento
Una vez que hemos comentado estas cosas sobre como JQuery funciona , es mas facil encajar las ideas habituales de que entre los selectores pueden existir gran diferencia a nivel de rendimiento y que hay que andarse con ojo a la hora de usarlos ya que de definir un selector bueno basado en #id a otro similar pero que JQuery tenga que bajar a nivel de motor Sizzle hay mucha diferencia .La siguiente imagen resume un poco lo que hemos comentado.
Para ampliar información sobre estos temas recomiendo los siguientes enlaces en Ingles .
Links interesantes sobre Sizzle
http://blog.jquery.com/2012/07/04/the-new-sizzle/
http://blog.bigbinary.com/2010/02/15/how-jquery-selects-elements-using-sizzle.html
Selectores extendidos de JQuery donde Sizzle se aplica
http://api.jquery.com/category/selectors/jquery-selector-extensions/
[…] Otros artículos relacionados: Utilizando jQuery Data ,jQuery On/Off ,jQuery Sizzle […]
[…] artículos relacionados : jQuery Sizzle Engine , Java 8 […]
[…] Otros artículos relacionados JavaScript Map y JSON , jQuery Sizzle […]
[…] artículos relacionados : JQuery Sizzle, jQuery […]
Muchas gracias Cecilio! Un saludo
de nada 🙂
muy buen articulo!
gracias 🙂