Selección por ID (era Re: [jQuery-es] Estructurar código)

Choan C. Gálvez choan.galvez en gmail.com
Mar Nov 28 14:20:10 PST 2006


Hola de nuevo.

On 11/28/06, stripTM <fer en striptm.com> wrote:
> ¿entonces "#lienzo #news" jQuery lo maneja de manera diferente que como
> lo hacen los selectores de css y lo dejá en "#news"?

No exactamente.

* Cuando se utiliza un selector simple de tipo ID (`#paco`), jQuery
optimiza la búsqueda usando `document.getElementById`.

* Si el selector incluye el combinador _descendiente_ (más conocido
como `#hay div.espacios`), jQuery busca el match entre los
descendientes de los elementos que casan con el primer selector.

Por tanto...

    $("#unid div.unaclase);

Viene a traducirse en:

1. Selecciono el elemento con id = unid
2. Selecciono los elementos descendientes de ese elemento que son de
tipo `div` cuyo className` incluye la palabra "unaclase" (y devuelvo
esta colección).

Pero

    $("#unid #otroid");

Se traduce en:

1. Selecciono el elemento con id = unid.
2. Selecciono el elemento con id = otroid

En resumen, que pasa olímpicamente del parentesco.

Lo puedes comprobar sustituyendo "#lienzo #news"  por "#abraracurcix
#news". O incluso "div.destonohayporaqui #lienzo".

En resumen, aquí hay una "sobreoptimización" que no en todos los casos
es adecuada. Ergo:

* Si el selector incluye un selector simple de tipo ID, todo lo que
lleve delante no va a hacer sino añadir trabajo innecesario (e inútil)
a la selección.

* Si (hay casos, los he vivido) es importante el contexto y no la
velocidad, se puede usar "#ancestro div#coso" (de esta manera no se
seleccionará "#coso" si no es descendiente de "#ancestro" puesto que
no se aplicará la optimización).

* Si realmente quieres ir a toda pastilla,
`$(document.getElementById("lienzo"))` es lo más rápido que puedes
utilizar, puesto que ni siquiera llegará a ser procesado por el parser
de expresiones regulares.

Salud.
-- 
Choan
<http://choangalvez.nom.es/>

Scriptia - Javascript y buenas prácticas en español
<blog.scriptia.net>


Más información sobre la lista de distribución jquery-es