2010-12-09 23 views
4

Je comprends que $("#id") est plus rapide car il mappe à une méthode javascript native. Est-ce la même chose de $("body")?

Répondre

10

Non, il n'utilise pas Sizzle, il y a un raccourci spécial pour $("body") en place, you can see the code here:

// The body element only exists once, optimize finding it 
    if (selector === "body" && !context && document.body) { 
     this.context = document; 
     this[0] = document.body; 
     this.selector = "body"; 
     this.length = 1; 
     return this; 
    } 

Notez que ce n'est pas tout à fait le même que $(document.body), que le contexte résultant de $("body") est document, où $(document.body) (comme tout autre noeud DOM) a un contexte de lui-même.

+0

Utilise-t-elle le grésillement pour $ ("body.class")? Dois-je donc utiliser $ ("body"). Filter (". Class") ... ou quelque chose? – Matrym

+0

@Matrym - Les nouveaux navigateurs ne s'en soucient pas beaucoup, ils utiliseront des méthodes de sélection natives, comme 'querySelectorAll()'. Mais pour répondre directement, pas de '$ (" body.class ")' ou une variante * sauf * '$ (" body ")' n'est pas spécialement géré, donc il sera envoyé au moteur de sélection. –

6

Ceci est directement du source (code):

if (selector === "body" && !context && document.body) { 
    this.context = document; 
    this[0] = document.body; 
    this.selector = "body"; 
    this.length = 1; 
    return this; 
} 

Pour les tags autres que le corps

Si vous creusez un peu plus profond, il se avère qu'ils utiliseront getElementsByTagName si aucun contexte est donné. Cela donnera un bon coup de pouce aux performances par rapport à l'utilisation du moteur Sizzle.

// HANDLE: $("TAG") 
} else if (!context && !rnonword.test(selector)) { 
    this.selector = selector; 
    this.context = document; 
    selector = document.getElementsByTagName(selector); 
    return jQuery.merge(this, selector); 

// HANDLE: $(expr, $(...)) 
} 
+3

** Whoa. ** jQuery a certainement quelques tours soignés dans sa manche. – BoltClock

+0

@BoltClock - C'est en fait une optimisation assez logique. – ChaosPandion

+0

@ChaosPandion - Votre réponse mise à jour est incorrecte, la première version s'exécute si aucun contexte n'est donné, à condition que le '' soit présent (ce serait sur 'document.ready'). –