2009-03-16 7 views

Respuesta

15

añadiendo contexto al selector es mucho más rápido que refinar su selector de

Esto es cierto en el caso general. Con respecto a sus ejemplos específicos, sin embargo, no es necesariamente cierto para jQuery < = 1.2.6.

Hasta e incluyendo jQuery 1.2.6 el motor selector funcionaba de manera "descendente" (o "de izquierda a derecha"). Lo que significa que tanto sus ejemplos operarían como esto (aproximadamente):

var root = document.getElementById('bar'); 
return root.getElementsByTagName('li'); 

jQuery 1.3.x (es decir, Sizzle, que incrusta jQuery) introduced a "bottom up" (or "right to left") approach a la consulta de la DOM. Así $('#bar li') ahora se convierte en (más o menos):

var results = []; 
var elements = document.getElementsByTagName('li'); 
for(var i=0; i < elements.length; i++) { 
    var element = elements[i]; 
    var parent = element.parentNode; 
    while(parent) { 
     if(parent.id == 'bar') { 
      results.push(element) 
      break; 
     } 
     parent = parent.parentNode; 
    } 
} 
return results 

Hay ventajas y desventajas de ambos enfoques. Encontraste uno de los inconvenientes.

Editar: se acaba de enterar de que this discussion chisporroteo tronco ahora hace una exención especial de selectores donde #id es primero. Utiliza eso como el contexto raíz, acelerando un poco las cosas. Esto debería disminuir si no elimina las diferencias de velocidad que está viendo.