2010-12-09 4 views
4

Ich verstehe, dass $("#id") schneller ist, da es eine native JavaScript-Methode zugeordnet ist. Gilt das gleiche für $("body")?

Antwort

10

Nein, es nicht Sizzle nicht verwendet, gibt es eine spezielle Abkürzung für $("body") vorhanden, 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; 
    } 

Beachten Sie, dass dies nicht ist ziemlich die gleiche wie $(document.body), wie der resultierende Kontext $("body") ist document, wobei $(document.body) (wie jeder andere DOM-Knoten) einen Kontext für sich hat.

+0

Verwendet es Sizzle für $ ("body.class")? Sollte ich konsequent $ ("body") verwenden filter (". Class") ... oder so? – Matrym

+0

@Matrym - Neuere Browser sind egal, sie verwenden native Selector-Methoden wie 'querySelectorAll()'. Aber um direkt zu antworten, wird kein '$ (" body.class ")' oder irgendeine Variante * außer * '$ (" body ")' nicht speziell behandelt, also wird es an die Selektor-Engine ausgegeben. –

6

Dies ist direkt aus dem source (code):

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

Für andere Tags als Körper

Wenn Sie ein wenig tiefer graben sich herausstellt, werden sie getElementsByTagName verwenden, wenn kein Zusammenhang gegeben ist. Dies wird der Leistung gegenüber der Sizzle-Engine einen deutlichen Schub verleihen.

// 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 hat sicher einige nette Tricks im Ärmel. – BoltClock

+0

@BoltClock - Es ist eigentlich eine ziemlich logische Optimierung. – ChaosPandion

+0

@ChaosPandion - Ihre aktualisierte Antwort ist falsch, die erste Version wird ausgeführt, wenn kein Kontext angegeben wird, vorausgesetzt, dass '' vorhanden ist (es wäre auf 'document.ready'). –