Ich habe beim Überwachen / Beantworten allgemeiner jQuery-Fragen festgestellt, dass es bestimmte Praktiken gibt, bei denen Javascript anstelle von jQuery verwendet wird, sodass Sie tatsächlich weniger schreiben und ... genau die gleiche Menge tun können . Und kann auch Leistungsvorteile bringen.
Ein konkretes Beispiel
$(this)
vs. this
Innerhalb eines Klickereignisses, das auf die ID der angeklickten Objekte verweist
jQuery
$(this).attr("id");
Javascript
this.id;
Gibt es andere gängige Praktiken wie diese? Wo bestimmte Javascript-Operationen einfacher ausgeführt werden könnten, ohne jQuery in den Mix aufzunehmen. Oder ist das ein seltener Fall? (einer jQuery "Verknüpfung", die tatsächlich mehr Code benötigt)
EDIT: Während ich die Antworten bezüglich der Leistung von jQuery im Vergleich zu einfacher Javascript-Leistung schätze, suche ich tatsächlich nach viel quantitativeren Antworten. Bei der Verwendung von jQuery sind Fälle, in denen es tatsächlich besser wäre (Lesbarkeit / Kompaktheit), einfaches Javascript anstelle von zu verwenden $()
. Zusätzlich zu dem Beispiel, das ich in meiner ursprünglichen Frage gegeben habe.
quelle
this.id
?Antworten:
this.id
(wie du weißt)this.value
(Bei den meisten Eingabetypen. Ich kenne nur IE, wenn für seine Elemente<select>
keinevalue
Eigenschaften festgelegt<option>
sind, oder Funkeingänge in Safari.)this.className
um eine ganze "Klasse" -Eigenschaft abzurufen oder festzulegenthis.selectedIndex
gegen a<select>
, um den ausgewählten Index zu erhaltenthis.options
gegen a<select>
, um eine Liste der<option>
Elemente zu erhaltenthis.text
gegen einen<option>
, um seinen Textinhalt zu bekommenthis.rows
gegen ein<table>
, um eine Sammlung von<tr>
Elementen zu erhaltenthis.cells
gegen a<tr>
, um seine Zellen zu bekommen (td & th)this.parentNode
einen direkten Elternteil zu bekommenthis.checked
um den überprüften Status einescheckbox
Thanks @Tim Down zu erhaltenthis.selected
um den ausgewählten Status einesoption
Thanks @Tim Down zu erhaltenthis.disabled
um den deaktivierten Status einesinput
Thanks @Tim Down zu erhaltenthis.readOnly
um den readOnly-Status einesinput
Thanks @Tim Down zu erhaltenthis.href
gegen ein<a>
Element, um seine zu bekommenhref
this.hostname
gegen ein<a>
Element, um die Domäne seiner zu erhaltenhref
this.pathname
gegen ein<a>
Element, um den Weg seiner zu bekommenhref
this.search
gegen ein<a>
Element, um den Querystring seiner zu bekommenhref
this.src
gegen ein Element, bei dem es gültig ist, a zu habensrc
... Ich denke du kommst auf die Idee.
Es wird Zeiten geben, in denen Leistung entscheidend ist. Wenn Sie beispielsweise mehrmals eine Schleife ausführen, möchten Sie möglicherweise jQuery loswerden.
Im Allgemeinen können Sie ersetzen:mit:Oben war schlecht formuliert.
getAttribute
ist kein Ersatz, ruft jedoch den Wert eines vom Server gesendeten Attributs ab und wird durch den entsprechenden WertsetAttribute
festgelegt. In einigen Fällen notwendig.Die folgenden Sätze deckten es irgendwie ab. Siehe diese Antwort für eine bessere Behandlung.
... um direkt auf ein Attribut zuzugreifen. Beachten Sie, dass Attribute nicht mit Eigenschaften identisch sind (obwohl sie sich manchmal gegenseitig spiegeln). Natürlich gibt es
setAttribute
auch.Angenommen, Sie hatten eine Situation, in der Sie eine Seite erhalten haben, auf der Sie alle Tags eines bestimmten Typs auspacken müssen. Mit jQuery ist es kurz und einfach:
Wenn es jedoch viele gibt, möchten Sie möglicherweise eine kleine native DOM-API ausführen:
Dieser Code ist ziemlich kurz, bietet eine bessere Leistung als die jQuery-Version und kann problemlos zu einer wiederverwendbaren Funktion in Ihrer persönlichen Bibliothek gemacht werden.
Es mag scheinen , als ob ich eine Endlosschleife mit dem äußeren habe
while
wegenwhile(spans[0])
, sondern weil wir mit einer „Live - Liste“ zu tun hat es aktualisiert wird , wenn wir das tunparent.removeChild(span[0]);
. Dies ist eine ziemlich raffinierte Funktion, die wir verpassen, wenn wir stattdessen mit einem Array (oder einem Array-ähnlichen Objekt) arbeiten.quelle
this.value
wenn in bestimmten Fällen einige Browser-Macken auftreten. Es hängt alles von Ihren Bedürfnissen ab. Es gibt viele nette Techniken, die ohne jQuery einfach sind, besonders wenn die Leistung entscheidend ist. Ich werde versuchen, an mehr zu denken.attr()
wird massiv überbeansprucht. Wenn Sie nur mit einem Element arbeiten, brauchen Sie es seltenattr()
. Zwei meiner Favoriten sind die Verwirrung um diechecked
Eigenschaft von Kontrollkästchen (alle Arten von mystischen Beschwörungen um , dass man:$(this).attr("checked", "checked")
,$(this).is(":checked")
etc.) und in ähnlicher Weise dieselected
Eigenschaft der<option>
Elemente.getAttribute()
. Sie brauchen es fast nie : Es ist im IE kaputt, spiegelt nicht immer den aktuellen Status wider und es ist sowieso nicht das, was jQuery tut. Verwenden Sie einfach Eigenschaften. stackoverflow.com/questions/4456231/…Die richtige Antwort lautet, dass Sie bei Verwendung von jQuery anstelle von "einfach altem" nativem JavaScript immer einen Leistungsverlust erleiden. Das liegt daran, dass jQuery eine JavaScript-Bibliothek ist. Es ist keine schicke neue Version von JavaScript.
Der Grund, warum jQuery leistungsstark ist, besteht darin, dass es einige Dinge macht, die in einer browserübergreifenden Situation übermäßig langwierig sind (AJAX ist eines der besten Beispiele), die Inkonsistenzen zwischen den unzähligen verfügbaren Browsern glättet und eine konsistente API bereitstellt. Es erleichtert auch leicht Konzepte wie Verketten, implizite Iteration usw., um das gemeinsame Arbeiten an Gruppen von Elementen zu vereinfachen.
Das Erlernen von jQuery ist kein Ersatz für das Erlernen von JavaScript. Sie sollten eine feste Basis in letzterem haben, damit Sie voll und ganz verstehen, was das Wissen um Ersteres für Sie einfacher macht.
- Bearbeitet, um Kommentare zu umfassen -
Da die Kommentare schnell darauf hinweisen (und ich stimme 100% zu), beziehen sich die obigen Aussagen auf den Benchmarking-Code. Eine "native" JavaScript-Lösung (vorausgesetzt, sie ist gut geschrieben) übertrifft eine jQuery-Lösung, die in fast allen Fällen dasselbe erreicht (ich würde gerne ein anderes Beispiel sehen). jQuery beschleunigt die Entwicklungszeit, was ein bedeutender Vorteil ist, den ich nicht herunterspielen möchte. Es ermöglicht einfach zu lesenden und leicht zu verfolgenden Code, der mehr ist, als manche Entwickler selbst erstellen können.
Meiner Meinung nach hängt die Antwort davon ab, was Sie erreichen wollen. Wenn Sie, wie ich aufgrund Ihres Hinweises auf Leistungsvorteile vermutet habe, die bestmögliche Geschwindigkeit für Ihre Anwendung erreichen möchten, führt die Verwendung von jQuery bei jedem Anruf zu einem Overhead
$()
. Wenn Sie Lesbarkeit, Konsistenz, browserübergreifende Kompatibilität usw. anstreben, gibt es sicherlich Gründe, jQuery gegenüber "nativem" JavaScript zu bevorzugen.quelle
$()
. Wenn Sie diesen Anruf nicht tätigen, sparen Sie Zeit.Es gibt einen Rahmen namens ... oh weißt du was?
Vanilla JS
. Ich hoffe, Sie verstehen den Witz ...: D Es beeinträchtigt die Lesbarkeit des Codes für die Leistung ... Wenn Sie ihn mit dem folgenden vergleichenjQuery
, können Sie feststellen, dass das Abrufen einesDOM
Elements mitID
fast 35-mal schneller ist. :) :)Wenn Sie also Leistung wünschen, sollten Sie Vanilla JS ausprobieren und Ihre eigenen Schlussfolgerungen ziehen. Möglicherweise wird JavaScript bei intensivem Code wie in einer
for
Schleife nicht die Java-Benutzeroberfläche des Browsers hängen / den UI-Thread blockieren.Auf ihrer Homepage gibt es einige perfekte Vergleiche:
quelle
Es gibt bereits eine akzeptierte Antwort, aber ich glaube, dass keine direkt hier eingegebene Antwort in der Liste der nativen Javascript-Methoden / -Attribute, die praktisch die browserübergreifende Unterstützung garantiert haben, umfassend sein kann. Dafür darf ich Sie in den Quirksmode umleiten:
http://www.quirksmode.org/compatibility.html
Es ist vielleicht die umfassendste Liste dessen, was in welchem Browser irgendwo funktioniert und was nicht. Achten Sie besonders auf den DOM-Bereich. Es ist viel zu lesen, aber es geht nicht darum, alles zu lesen, sondern es als Referenz zu verwenden.
Als ich anfing, ernsthaft Web-Apps zu schreiben, druckte ich alle DOM-Tabellen aus und hängte sie an die Wand, damit ich auf einen Blick weiß, was sicher zu verwenden ist und was Hacks erfordert. In diesen Tagen google ich einfach so etwas wie
quirksmode parentNode compatibility
wenn ich Zweifel habe.Wie alles andere ist das Urteil meistens eine Frage der Erfahrung. Ich würde Ihnen nicht wirklich empfehlen, die gesamte Site zu lesen und sich alle Probleme zu merken, um herauszufinden, wann Sie jQuery und wann Sie einfaches JS verwenden. Sei dir nur der Liste bewusst. Es ist einfach genug zu suchen. Mit der Zeit werden Sie einen Instinkt entwickeln, wann einfaches JS vorzuziehen ist.
PS: PPK (der Autor der Seite) hat auch ein sehr schönes Buch, das ich zum Lesen empfehle
quelle
Wann:
Verwenden Sie JavaScript. Verwenden Sie andernfalls jQuery (wenn Sie können).
Bearbeiten : Diese Antwort gilt sowohl für die Verwendung von jQuery insgesamt als für das Auslassen, als auch für die Verwendung von Vanilla JS in jQuery. Wählen Sie zwischen
attr('id')
und.id
lehnen Sie sich für JS, während Sie sich zwischenremoveClass('foo')
und.className = .className.replace( new Regexp("(?:^|\\s+)"+foo+"(?:\\s+|$)",'g'), '' )
lehnen Sie sich für jQuery.quelle
.classList.remove('foo')
scheint in neueren BrowsernDie Antworten anderer haben sich auf die allgemeine Frage "jQuery vs. plain JS" konzentriert. Nach Ihrem OP zu urteilen, haben Sie sich wohl nur gefragt, wann es besser ist, Vanilla JS zu verwenden, wenn Sie sich bereits für jQuery entschieden haben. Ihr Beispiel ist ein perfektes Beispiel dafür, wann Sie Vanilla JS verwenden sollten:
$(this).attr('id');
Ist sowohl langsamer als auch (meiner Meinung nach) weniger lesbar als:
this.id
.Es ist langsamer, weil Sie ein neues JS-Objekt hochfahren müssen, um das Attribut auf jQuery-Weise abzurufen. Wenn Sie jetzt
$(this)
andere Vorgänge ausführen möchten, speichern Sie das jQuery-Objekt auf jeden Fall in einer Variablen und arbeiten Sie damit. Ich bin jedoch auf viele Situationen gestoßen, in denen ich nur ein Attribut aus dem Element (wieid
odersrc
) benötige .Ich denke, der häufigste Fall ist der, den Sie in Ihrem Beitrag beschreiben. Personen, die sich
$(this)
unnötig in ein jQuery-Objekt einwickeln . Ich sehe das am häufigsten mitid
undvalue
(stattdessen mit$(this).val()
).Edit: Hier ist ein Artikel, der erklärt , warum jQuery im
attr()
Fall langsamer ist. Geständnis: hat es aus dem Tag-Wiki gestohlen, aber ich denke, es ist erwähnenswert für die Frage.Erneut bearbeiten: Angesichts der Lesbarkeits- / Leistungsauswirkungen des direkten Zugriffs auf Attribute würde ich sagen, dass eine gute Faustregel wahrscheinlich darin besteht, zu versuchen, diese nach
this.<attributename>
Möglichkeit zu verwenden. Es gibt wahrscheinlich einige Fälle, in denen dies aufgrund von Browser-Inkonsistenzen nicht funktioniert, aber es ist wahrscheinlich besser, dies zuerst zu versuchen und auf jQuery zurückzugreifen, wenn es nicht funktioniert.quelle
this.style.display = 'none'
. Ist das besser als$(this).hide()
? Ich würde argumentieren, dass Letzteres besser lesbar ist, Ersteres jedoch wahrscheinlich schneller. Es tut nicht weh, selbst zu experimentieren, um festzustellen, ob bestimmte Aktionen in Browsern ohne jQuery funktionieren. Dies ist normalerweise der Fall, bevor ich ein Element in ein jQuery-Objekt einbinde, um eine Operation auszuführen.Wenn Sie sich hauptsächlich um die Leistung sorgen, trifft Ihr Hauptbeispiel den Nagel auf den Kopf. Das unnötige oder redundante Aufrufen von jQuery ist meiner Meinung nach die zweite Hauptursache für langsame Leistung (die erste ist eine schlechte DOM-Durchquerung).
Es ist nicht wirklich ein Beispiel für das, wonach Sie suchen, aber ich sehe dies so oft, dass es erwähnt werden muss: Eine der besten Möglichkeiten, die Leistung Ihrer jQuery-Skripte zu beschleunigen, besteht darin, jQuery-Objekte zwischenzuspeichern und / oder Verkettungen zu verwenden:
quelle
var something
musste ich das jQuery-Objekt nicht wirklich zwischenspeichern (da ich die Verkettung verwendet habe), aber ich mache es trotzdem aus Gewohnheit.$('.something')
bedeutet, dass jQuery das DOM zweimal durchlaufen muss, um nach allen Elementen mit diesem Selektor zu suchen.$(this)
reduziert das Caching die Aufrufe der jQuery-Funktion. Dies gibt Ihnen den größten Gewinn in einem Schleifenszenario.element
gleich ist$(this)
. Das enthält nicht mehrere Elemente.Ich habe festgestellt, dass es sicherlich Überschneidungen zwischen JS und JQ gibt. Der Code, den Sie gezeigt haben, ist ein gutes Beispiel dafür. Ehrlich gesagt ist der beste Grund, JQ über JS zu verwenden, einfach die Browserkompatibilität. Ich neige immer zu JQ, auch wenn ich in JS etwas erreichen kann.
quelle
Dies ist meine persönliche Ansicht, aber da jQuery sowieso JavaScript ist, denke ich, dass es theoretisch nicht besser als Vanilla JS sein kann.
Praktisch kann es jedoch eine bessere Leistung als handgeschriebenes JS erbringen, da der handgeschriebene Code möglicherweise nicht so effizient ist wie jQuery.
Fazit: Für kleinere Dinge verwende ich eher Vanilla JS, für JS-intensive Projekte verwende ich gerne jQuery und erfinde das Rad nicht neu - es ist auch produktiver.
quelle
Die Liste der Live-Eigenschaften der ersten Antwort
this
als DOM-Element ist vollständig.Vielleicht finden Sie auch einige andere interessant.
Wenn dies das Dokument ist:
this.forms
um einesHTMLCollection
der aktuellen Dokumentformulare zu erhalten,this.anchors
umHTMLCollection
von all demHTMLAnchorElements
mitname
gesetzt zu werden,this.links
umHTMLCollection
von allenHTMLAnchorElement
s mithref
gesetzt zu werden,this.images
umHTMLCollection
von allenHTMLImageElement
s zu bekommenthis.applets
Wenn Sie mit arbeiten
document.forms
, erhalten Siedocument.forms[formNameOrId]
das so genannte oder identifizierte Formular.Wenn dies ein Formular ist:
this[inputNameOrId]
um das so genannte oder identifizierte Feld zu erhaltenWenn dies ein Formularfeld ist:
this.type
um den Feldtyp zu erhaltenBeim Erlernen von jQuery-Selektoren überspringen wir häufig das Erlernen bereits vorhandener HTML-Elementeigenschaften, auf die so schnell zugegriffen werden kann.
quelle
document.embeds
unddocument.plugins
werden auch weitgehend unterstützt (DOM 0).document.scripts
ist auch eine praktische Sammlung, die in der HTML5-Spezifikation definiert und weitgehend unterstützt wird (und Firefox 9+ ).Wie immer komme ich zu spät zu dieser Party.
Es war nicht die zusätzliche Funktionalität, die mich dazu bewogen hat, jQuery zu verwenden, so attraktiv das auch war. Schließlich hindert Sie nichts daran, eigene Funktionen zu schreiben.
Es war die Tatsache, dass beim Ändern des DOM so viele Tricks zu lernen waren, um Speicherlecks zu vermeiden (ich spreche von Ihrem IE). Eine zentrale Ressource zu haben, die all diese Probleme für mich bewältigte und von Leuten geschrieben wurde, die viel bessere JS-Codierer waren als ich, die ständig überprüft, überarbeitet und getestet wurden, war von Gott gesandt.
Ich denke, diese Art von fällt unter das Argument der browserübergreifenden Unterstützung / Abstraktion.
Und natürlich schließt jQuery die Verwendung von Straight JS nicht aus, wenn Sie es benötigen. Ich hatte immer das Gefühl, dass die beiden nahtlos zusammenarbeiten.
Wenn Ihr Browser von jQuery nicht unterstützt wird oder Sie eine Low-End-Umgebung (älteres Telefon?) Unterstützen, kann eine große .js-Datei möglicherweise ein Problem darstellen. Erinnerst du dich, als jQuery noch winzig war?
Normalerweise ist der Leistungsunterschied jedoch kein Problem. Es muss nur schnell genug sein. Da Gigahertz an CPU-Zyklen jede Sekunde verschwendet werden, geht es mir mehr um die Leistung meiner Codierer, der einzigen Entwicklungsressourcen, deren Leistung sich nicht alle 18 Monate verdoppelt.
Das heißt, ich beschäftige mich derzeit mit Barrierefreiheitsproblemen und anscheinend ist .innerHTML ein bisschen ein Nein Nein damit. jQuery hängt natürlich von .innerHTML ab, daher suche ich jetzt nach einem Framework, das von den etwas langwierigen Methoden abhängt, die zulässig sind. Und ich kann mir vorstellen, dass ein solches Framework langsamer als jQuery läuft, aber solange es gut genug funktioniert, bin ich glücklich.
quelle
Hier ist eine nicht technische Antwort: Viele Jobs erlauben möglicherweise bestimmte Bibliotheken nicht, z. B. jQuery.
Tatsächlich lässt Google jQuery in keinem seiner Codes zu (und auch nicht in React, da es Facebook gehört), was Sie möglicherweise erst gewusst haben, wenn der Interviewer sagt: "Entschuldigung, aber Sie können jQuery nicht verwenden, es ist nicht aktiviert." die genehmigte Liste bei der XYZ Corporation ". Vanilla JavaScript funktioniert absolut überall und jedes Mal und wird Ihnen dieses Problem niemals bereiten. Wenn Sie sich auf eine Bibliothek verlassen, erhalten Sie zwar Geschwindigkeit und Leichtigkeit, aber Sie verlieren die Universalität.
Apropos Interview: Der andere Nachteil ist, dass Sie, wenn Sie sagen, dass Sie eine Bibliothek verwenden müssen, um ein JavaScript-Problem während eines Code-Quiz zu lösen, das Problem nicht wirklich verstehen, was irgendwie schlecht aussieht. Wenn Sie es dagegen in rohem Vanille-JavaScript lösen, zeigt es, dass Sie tatsächlich jeden Teil des Problems verstehen und lösen können, das sie vor Ihnen werfen.
quelle
$(this)
ist anders alsthis
:Durch die Verwendung stellen
$(this)
Sie sicher, dass der jQuery-Prototyp an das Objekt übergeben wird.quelle