Hat jQuery cache-Elemente, die intern?
Weiß ich jQuery nicht cache-Kollektionen von element -, f -.ex ruft:
$('.myclass').html('hello');
$('.myclass').html('bye');
Wird jQuery besteigen den DOM zweimal.
Aber, wie etwa Cache-DOM-Knoten?
var elems = document.querySelectorAll('.myclass');
$(elems).html('hello');
$(elems).html('bye');
Wird jQuery cache diese intern, oder werden Sie genauso langsam wie beim ersten Beispiel?
Zu klären: wird jQuery halten eine Referenz auf elems
- und cache - $(elems)
intern, so dass Sie nicht haben, um die gleichen $()
wrapper jedes mal?
Etwas wie:
cache = {}
constructor = function(collection)
if collection in cache
return cache[collection]
else construct(collection)
document.querySelectorAll('.myclass');
gibt ein sofort ausgewertet Sammlung. Es ist das, was verhindert, dass "die Besteigung des DOM zweimal", nichts zu tun mit jQuery.$(..)
übernehmen gerne eine Sammlung von DOM-Knoten (im ersten Beispiel brauchte es einen Selektor).- Ja, ich weiß, es kann dauern, eine Sammlung, aber wird es einen cache der wrapper für den gleichen Sammlung?
- Nein, es wird nicht. Das ist, was ich und pst haben beide gesagt, unsere Antworten. jQuery wird nicht alles tun, mit dem aufeinander abgestimmten Satz über die Aussage zu, dass die aufeinander abgestimmten Satz gilt. Es ist bis zu Ihnen, um einen Verweis auf ein jQuery-Objekt, wenn du gehst zu verwenden es mehrmals.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorausgesetzt, ich habe deine Frage verstanden korrekt, dann nicht, jQuery wird nicht halten eine Referenz auf die ausgewählten Knoten über die Aussage, die Sie verwendet:
Wenn Sie halten eine Referenz auf den ausgewählten Knoten getrennt, es wird schneller sein:
Den Unterschied nicht Massiv sein (es sei denn, Ihr DOM ist sehr kompliziert), aber es wird ein Unterschied:
Update
Nein, es nicht. Wie oben angegeben, wird die Referenz auf die übereinstimmenden Elemente werden nicht gepflegt über die Aussage, auf die es zutrifft. Verbessern Sie die performance Ihres Codes, indem eine Referenz auf jQuery-Objekten, die durchgehend verwendet werden, anstatt die Auswahl jedes mal neu, oder sogar die Verpackung einer gespeicherten Satz von systemeigenen DOM-Knoten in einem jQuery-Objekt jedes mal.
$(elems)
ist nicht intern zwischengespeichert, was bedeutet, dass die jQuery-Schicht wird erneut angewendet, selbst wenn der Knoten sind genau die gleichen?var elems = $(".myclass")
(was ich auch getan habe in der jsperf.com test verlinkt in meiner Antwort).var elems = $(document.querySelectorAll('.myclass')); //Select all .myclass elements and return jQuery object elems.html('hello'); //Change their HTML (no need to call $ again) elems.html('bye'); //Change their HTML (no need to call $ again)
Wenn "cache" bedeutet "halten der DOM-Elemente in die interne Sammlung für , dass jQuery-Objekt" .. dann ja.
Vorstellen
wo
jq[0..jq.length-1]
auswerten bzw. das DOM-element. Zum Beispieljq[0]
wertet die ersten DOM-element, dargestellt durch die jQuery-Objekt, falls vorhanden. Beachten Sie, dass diese Auflistung wird nicht auf Magische Weise geändert, sobald es gebaut wurde (und die Art und Weise, in der es gebaut wurde, spielt keine Rolle).Aber es ist kein "cache" außerhalb von einfach halten Sie die unmittelbaren Ergebnisse für die insbesondere jQuery-Objekt.