Das DOM und native Browser-APIs haben sich seit der Veröffentlichung von jQuery im Jahr 2006 sprunghaft verbessert. Leute schreiben seit 2013 Artikel wie „You Might Not Need jQuery“ (siehe diese klassische Seite und dieses klassische Repo). Ich möchte kein altes Gebiet wieder aufwärmen, aber seit dem letzten Artikel „You Might Not Need jQuery“, auf den Sie vielleicht gestoßen sind, hat sich in der Browserwelt einiges getan. Browser implementieren weiterhin neue APIs, die die Entwicklung ohne Bibliotheken erleichtern, viele davon direkt von jQuery kopiert.
Lassen Sie uns einige *neue* Vanilla-Alternativen zu jQuery-Methoden durchgehen.
Ein Element von der Seite entfernen
Erinnern Sie sich an die wahnsinnig umständliche Art, wie man mit nativem DOM ein Element von der Seite entfernen musste? el.parentNode.removeChild(el);? Hier ist ein Vergleich der jQuery-Methode und der neuen verbesserten Vanilla-Methode.
jQuery
var $elem = $(".someClass") //select the element
$elem.remove(); //remove the element
Ohne jQuery
var elem = document.querySelector(".someClass"); //select the element
elem.remove() //remove the element
Für den Rest dieses Beitrags gehen wir davon aus, dass $elem eine mit jQuery ausgewählte Elementmenge ist und elem ein natives JavaScript-ausgewähltes DOM-Element ist.
Ein Element voranstellen
jQuery
$elem.prepend($someOtherElem);
Ohne jQuery
elem.prepend(someOtherElem);
Ein Element vor einem anderen Element einfügen
jQuery
$elem.before($someOtherElem);
Ohne jQuery
elem.before(someOtherElem);
Ein Element durch ein anderes ersetzen
jQuery
$elem.replaceWith($someOtherElem);
Ohne jQuery
elem.replaceWith(someOtherElem);
Den nächsten Vorfahren finden, der mit einem gegebenen Selektor übereinstimmt
jQuery
$elem.closest("div");
Ohne jQuery
elem.closest("div");
Browser-Unterstützung für DOM-Manipulationsmethoden
Diese Methoden haben jetzt ein gutes Maß an Browserunterstützung
Diese Browserunterstützungsdaten stammen von Caniuse, wo Sie weitere Details finden. Eine Zahl bedeutet, dass der Browser die Funktion ab dieser Version unterstützt.
Desktop
| Chrome | Firefox | IE | Edge | Safari |
|---|---|---|---|---|
| 54 | 49 | Nein | 17 | 10 |
Mobil / Tablet
| Android Chrome | Android Firefox | Android | iOS Safari |
|---|---|---|---|
| 127 | 127 | 127 | 10.0-10.2 |
Sie werden auch derzeit in Edge implementiert.
Ein Element einblenden
jQuery
$elem.fadeIn();
Durch das Schreiben unseres eigenen CSS haben wir viel mehr Kontrolle darüber, wie wir unser Element animieren. Hier mache ich ein einfaches Ausblenden.
.thingy {
display: none;
opacity: 0;
transition: .8s;
}
elem.style.display = "block";
requestAnimationFrame(() => elem.style.opacity = 1);
Einen Event-Handler-Callback nur einmal aufrufen
jQuery
$elem.one("click", someFunc);
Früher mussten wir bei der Verwendung von reinem JavaScript removeEventListener innerhalb der Callback-Funktion aufrufen.
function dostuff() {
alert("some stuff happened");
this.removeEventListener("click", dostuff);
}
var button = document.querySelector("button");
button.addEventListener("click", dostuff);
Jetzt sind die Dinge viel sauberer. Sie haben vielleicht den dritten optionalen Parameter gesehen, der manchmal an addEventListener übergeben wird. Es ist ein Boolean, um zwischen Event Capturing und Event Bubbling zu wählen. Heutzutage kann das dritte Argument jedoch alternativ ein Konfigurationsobjekt sein.
elem.addEventListener('click', someFunc, { once: true, });
Wenn Sie weiterhin Event Capturing verwenden und der Callback nur einmal aufgerufen werden soll, können Sie dies auch im Konfigurationsobjekt angeben.
elem.addEventListener('click', myClickHandler, {
once: true,
capture: true
});
Animation
JQuerys Methode .animate() ist ziemlich begrenzt.
$elem.animate({
width: "70%",
opacity: 0.4,
marginLeft: "0.6in",
fontSize: "3em",
borderWidth: "10px"
}, 1500);
Die Dokumentation besagt: „Alle animierten Eigenschaften sollten auf einen einzelnen numerischen Wert animiert werden, außer wie unten angegeben; die meisten nicht-numerischen Eigenschaften können mit grundlegender jQuery-Funktionalität nicht animiert werden.“ Dies schließt Transformationen aus, und Sie benötigen ein Plugin, nur um Farben zu animieren. Mit der neuen Web Animations API wären Sie viel besser dran.
var elem = document.querySelector('.animate-me');
elem.animate([
{
transform: 'translateY(-1000px) scaleY(2.5) scaleX(.2)',
transformOrigin: '50% 0',
filter: 'blur(40px)',
opacity: 0
},
{
transform: 'translateY(0) scaleY(1) scaleX(1)',
transformOrigin: '50% 50%',
filter: 'blur(0)',
opacity: 1
}
], 1000);
Ajax
Ein weiteres wichtiges Verkaufsargument von jQuery in der Vergangenheit war Ajax. jQuery abstrahierte die Hässlichkeit von XMLHttpRequest
$.ajax('https://some.url', {
success: (data) => { /* do stuff with the data */ }
});
Die neue Fetch API ist ein überlegener Ersatz für XMLHttpRequest und wird jetzt von allen modernen Browsern unterstützt.
fetch('https://some.url')
.then(response => response.json())
.then(data => {
// do stuff with the data
});
Zugegebenermaßen kann Fetch etwas komplizierter sein als dieses kleine Codebeispiel. Zum Beispiel wird das von fetch() zurückgegebene Promise bei HTTP-Fehlercodes nicht zurückgewiesen. Es ist jedoch weitaus vielseitiger als alles, was auf XMLHttpRequest aufbaut.
Wenn wir jedoch einfache Bedienung wünschen, gibt es eine einfachere Option, die an Popularität gewonnen hat – sie ist jedoch nicht nativ im Browser verfügbar, was mich zu... bringt.
Der Aufstieg der Mikro-Bibliothek
Axios ist eine beliebte Bibliothek für Ajax. Sie ist ein großartiges Beispiel für eine Mikro-Bibliothek – eine Bibliothek, die nur eine Sache tun soll. Während die meisten Bibliotheken nicht so gut getestet sind wie jQuery, können sie oft eine attraktive Alternative zum jQuery-Koloss sein.
(Fast) Alles kann polyfillt werden
Sie wissen also jetzt, dass das DOM heutzutage recht angenehm zu bearbeiten ist! Aber vielleicht haben Sie diese Entwicklungen nur betrachtet und gedacht: „Na ja, ich muss immer noch IE 9 unterstützen, also benutze ich besser jQuery.“ Meistens spielt es keine Rolle, was *Can I Use* über ein bestimmtes Feature sagt, das Sie nutzen möchten. Sie können alles verwenden, was Sie möchten, und Polyfills können die Lücken füllen. Es gab eine Zeit, in der man, wenn man ein schickes neues Browser-Feature nutzen wollte, ein Polyfill finden und es auf seiner Seite einbinden musste. Dies für alle fehlenden Features in IE9 zu tun, wäre eine mühsame Aufgabe. Jetzt ist es so einfach
<script src="https://cdn.polyfill.io/v2/polyfill.min.js"></script>
Dieses einfache Skript-Tag kann fast alles polyfillen. Wenn Sie noch nichts von diesem Polyfill-Service von der Financial Times gehört haben, können Sie ihn unter Polyfill.io lesen.
NodeLists in 2017 durchlaufen
Die massive Verbreitung von jQuery wurde nicht nur durch die beruhigende Glättung von Browserfehlern und Inkonsistenzen in IE-Relikten gefördert. Heute hat jQuery einen einzigen verbleibenden Verkaufspunkt: **Iteration**.
Iterierbare NodeLists sind für die Qualität des DOM von fundamentaler Bedeutung. Wenig überraschend verwende ich heute stattdessen für die meisten meiner Programmieraufgaben React. — John Resig (@jeresig) 29. April 2016
Es widerspricht jeder Vernunft, dass NodeLists nicht iterierbar sind. Entwickler mussten sich Mühe geben, damit sie es werden. Eine klassische For-Schleife mag der performanteste Ansatz sein, aber sie ist sicher nichts, was ich gerne tippe. Und so landeten wir bei dieser Hässlichkeit.
var myArrayFromNodeList = [].slice.call(document.querySelectorAll('li'));
Oder
[].forEach.call(myNodeList, function (item) {...}
In jüngerer Zeit konnten wir Array.from verwenden, eine kürzere, elegantere Methode, um eine NodeList in ein Array umzuwandeln.
Array.from(querySelectorAll('li')).forEach((li) => /* do something with li */);
Die große Neuigkeit ist jedoch, dass NodeLists jetzt standardmäßig iterierbar sind.
Es ist höchste Zeit, dass wir iterierbare NodeLists haben! https://#/nIT5uHALpW 🎉🎉🎉 Habe das jahrelang gefordert! https://#/edb0TTSdop
— John Resig (@jeresig) 29. April 2016
Jetzt tippen Sie einfach
document.querySelectorAll('li').forEach((li) => /* do some stuff */);
Edge ist der letzte moderne Browser, der keine iterierbaren NodeLists unterstützt, aber daran wird derzeit gearbeitet.
Ist jQuery langsam?
jQuery mag schneller sein als schlecht geschriebenes Vanilla JS, aber das ist nur ein guter Grund, JavaScript besser zu lernen! Paul Irish war ein Mitwirkender am jQuery-Projekt und kam zu dem Schluss
Leistungsempfehlung: Verwenden Sie niemals die Methode hide() von jQuery. Niemals. https://#/zEQf6F54p6
Klassen sind Ihr Freund.— Paul Irish (@paul_irish) 8. Februar 2015
Hier ist, was der Erfinder von jQuery über das Erlernen des nativen DOM in seinem (absolut wesentlichen) JavaScript-Buch Secrets of the JavaScript Ninja sagt:
„Warum müssen Sie verstehen, wie es funktioniert, wenn die Bibliothek sich darum kümmert? Der überzeugendste Grund ist die *Performance*. Das Verständnis, wie DOM-Modifikation in Bibliotheken funktioniert, kann Ihnen ermöglichen, besseren und schnelleren Code zu schreiben.“
Was mir an jQuery missfällt
Anstatt nur die verbleibenden hässlichen Teile bestimmter Browser-APIs zu glätten, versucht jQuery, sie *alle* pauschal zu ersetzen. Indem ein jQuery-Objekt anstelle einer NodeList zurückgegeben wird, sind eingebaute Browser-Methoden im Wesentlichen nicht mehr zugänglich, was bedeutet, dass Sie auf die jQuery-Methode für alles festgelegt sind. Für Anfänger ist das, was einst Front-End-Scripting zugänglich machte, jetzt ein Hindernis, da es im Wesentlichen zwei doppelte Möglichkeiten gibt, alles zu tun. Wenn Sie den Code anderer Leute leicht lesen und sich sowohl für Stellen bewerben möchten, die Vanilla JS erfordern, als auch für Stellen, die jQuery erfordern, müssen Sie doppelt so viel lernen. Es gibt jedoch Bibliotheken, die eine API übernommen haben, die für jQuery-Süchtige beruhigend vertraut ist, aber eine NodeList anstelle eines Objekts zurückgibt ...
Kann nicht ohne $ leben?
Vielleicht haben Sie sich an das jQuery $ gewöhnt. Bestimmte Mikro-Bibliotheken haben versucht, die jQuery-API zu emulieren.
- Lea Verou, eine eingeladene Expertin der W3C CSS Working Group, die selbst den Artikel jQuery Considered Harmful verfasst hat, ist die Autorin von Bliss.js. Bliss verwendet eine vertraute $ Syntax, gibt aber eine NodeList zurück.
- Paul Irish hat unterdessen Bling.js veröffentlicht, „*weil man das $ von jQuery ohne das jQuery haben möchte*“.
- Remy Sharp bot eine ähnliche Mikro-Bibliothek an, passend benannt min.js.
Ich bin kein Anti-jQuery-Snob. Manche großartigen Entwickler entscheiden sich immer noch dafür, es zu verwenden. Wenn Sie sich mit der Verwendung vertraut und mit seiner API vertraut sind, gibt es keinen *riesigen* Grund, es aufzugeben. Letztendlich gibt es Leute, die jQuery verwenden und wissen, was eine Closure ist und die unternehmensweite Webanwendungen schreiben, und Leute, die Vanilla JS verwenden und das nicht tun. Viele Jobs listen es immer noch als geforderte Fähigkeit auf. Für jeden, der anfängt, sieht es jedoch wie eine zunehmend schlechte Wahl aus. Internet Explorer 11 ist glücklicherweise die letzte Version dieses Höllenapparats. Sobald IE stirbt, wird die gesamte Browserlandschaft immergrün sein, und jQuery wird zunehmend als Relikt aus der Vergangenheit des DOMs betrachtet werden.
Also, wie immer, kann man das in IE nicht tun. Also können meine Firma und ich es nicht verwenden.
Wir verwenden zumindest Angular und können das neue Verhalten (irgendwie) auf diese Weise nutzen.
Klar kannst du das! Dafür sind Polyfills da. Immer noch kleiner als das Laden einer Bibliothek wie jQuery, und man bekommt all den modernen Luxus auch in älteren Browsern.
Man kann nicht... was?
Das geht schon. Man muss nur die Polyfills bereitstellen. Zum Beispiel für iterierbare
NodeList-Objekte könnte man das so machen:NodeList.prototype.forEach = Array.prototype.forEach;
Ja, Sie erweitern den Prototyp einer nativen Klasse. Aber genau so hat die W3C ihn erweitert, daher besteht keine Kollisionsgefahr.
Natürlich möchte man das nicht für alle gewünschten Funktionen tun. Deshalb gibt es polyfill.io, wie im Artikel erwähnt.
Ich werde es tun. Ob zufällig oder absichtlich, es wird definitiv passieren.
Ich gehöre zu den Leuten, die gelernt haben, jQuery zu schreiben, aber ohne StackOverflow keinen einzigen Satz reines JavaScript schreiben könnten. Ich mag es, dass diese Methoden so „lesen“, dass sie für mich vertraut und sinnvoll sind. Das macht die Lernkurve etwas einfacher, wissen Sie?
Aber ich bin innerlich gestorben, als ich sah, dass es derzeit keine native Unterstützung für Microsoft Internet Explorer / Edge gibt. Ich kann mir kein einziges Projekt vorstellen, das ich aktuell oder in den letzten 5 Jahren auf meiner Liste hatte, das IE einfach komplett ignorieren könnte. Und wenn ich mich auf ein Polyfill verlassen muss, um die Lücke zu überbrücken... ich meine, warum nicht gleich bei jQuery bleiben?
Weil das Polyfilling nur der benötigten Funktionen in nur den Browsern, die sie benötigen, leichter ist, als ganz jQuery für alle Browser zu laden.
Ich stimme zu, dass es schön wäre, jQuery abzuschaffen, aber die Cross-Browser-Unterstützung, die es bietet, ist unschätzbar wertvoll.
Ich benutze jQuery viel und kann nur wenig JavaScript, genug, um zurechtzukommen.
Ich habe vollständige Plugins in jQuery geschrieben und wüsste nicht, wo ich mit JavaScript anfangen soll.
Im Großen und Ganzen stimme ich Ihnen zu, aber ich glaube nicht, dass es bereits das Niveau von jQuery erreicht hat.
Es mag schockierend sein, aber jQuery *ist* JavaScript.
Es ist verwirrend, wie Leute das verwechseln. Aber wirklich, JavaScript selbst ist eine sehr einfache, aber erweiterbare Sprache, und jQuery ist das Ergebnis dieser Erweiterbarkeit. Was Sie *nicht* wissen, ist die Fülle an nativen und Browser-APIs. Und wahrscheinlich die gesamte neue ES6+-Syntax.
Machen Sie weiter so, jQuery ist im Niedergang und Sie verpassen etwas!
Ich denke, wahrscheinlich versteht jeder hier, dass jQuery eine Erweiterung von JavaScript ist. Aber das macht jQuery nicht genau gleichwertig mit JavaScript.
Ich ging in diesen Artikel und erwartete mehr absolutistische Konferenzblasen-jQuery-Hass. Was ich bekam, war ein sehr aufschlussreicher und angenehmer Artikel.
Mir gefiel die Zusammenfassung in „Was mir an jQuery missfällt“. Das ist das eigentliche Problem mit jQuery für die Zukunft, nicht seine Paradigma, sondern dass es nicht nahtlos mit Vanilla JavaScript wie neuere Frameworks funktioniert.
Mir gefiel auch der Abschnitt „Kann nicht ohne $ leben?“. Wahr ist, dass document.querySelector schmerzhaft hässlich und umständlich ist, besonders für etwas, das man dutzende Male verwenden muss.
Ich finde es seltsam, wie oft ich höre, wie schrecklich jQuery ist, aber Vanilla JavaScript viele Konzepte daraus übernommen hat, wie in diesem Artikel schön gezeigt.
jQuery hat großartige Dinge für das Internet getan. Ich freue mich, dass ein Artikel über Alternativen zu jQuery ohne Hass spricht.
Bezüglich dieses Teils: „Wahr ist, dass document.querySelector schmerzhaft hässlich und umständlich ist, besonders für etwas, das man dutzende Male verwenden muss.“
Obwohl ich zustimme, dass es nicht am einfachsten zu lesen/schreiben ist, finde ich es sehr hilfreich,
querySelectorundquerySelectorAllzu nehmen und sie in wiederverwendbare Funktionen zu verwandeln. Mit ES6-Pfeilfunktionen und impliziten Rückgaben können beide klar und prägnant gestaltet werden.Als ich das letzte Mal nachsah, lag Internet Explorer bei etwa 10 % Marktanteil, fiel aber schnell. In zwei Jahren (Mitte 2019) wird er im 1 %-Bereich liegen.
Das ist schwer zu sagen. StatCounter und W3Counter sehen IE+Edge bei etwa 8 % Marktanteil, NetMarketShare schätzt es auf etwa 18 %.
Was wirklich zählt, sind die Browser, die Ihre Zuschauer verwenden. Diese Statistiken sind Durchschnittswerte und repräsentieren nicht unbedingt das, was Sie sehen werden, wenn Ihre Besucher auf einen bestimmten Ort konzentriert sind oder wenn ihr Hintergrund besonders technisch/nicht-technisch ist usw.
Zum Beispiel: Ein Nachtclub, dessen Website ich verwalte, sieht über 50 % seines Traffics von Safari. Das würde man nicht erwarten, wenn man den Marktanteil von Safari betrachtet... aber ihr Publikum sind jüngere Clubgänger, die zufällig eher iPhones besitzen und somit eher Safari verwenden.
Manchmal sind nicht die tatsächlichen Benutzer, sondern der KUNDE, um den man sich Sorgen machen muss. Ich habe mehrere, die sich weigern, Browser zu aktualisieren oder zu wechseln, wegen alter Systeme, die sie verwenden müssen (Computer und/oder Software), oder aus reiner Sturheit.
Ich benutze hauptsächlich jQuery, da ich an WordPress-Plugins arbeite und es dort vorinstalliert ist. Ich halte Vanilla JS für wichtig zu lernen, also habe ich jetzt etwas Neues zu arbeiten!
Das war auch mein Gedanke. Bei all dem Gerede über WordPress, das in Zukunft auf React oder Vue setzt (zumindest im Adminbereich), frage ich mich, ob sie in Erwägung ziehen, jQuery irgendwann automatisch einzubinden?
Ein Gedanke weiter: Das würde wahrscheinlich *viele* Themes kaputt machen.
Ich habe gerade das Fade-In-Beispiel ausprobiert. Wenn ich nichts übersehe, gibt es eigentlich keine Fading-Effekte.
https://codepen.io/alexmccabe/pen/ZyVZyj
Ich würde argumentieren, dass man sowieso Klassen verwenden sollte, um den Status zu ändern.
Es scheint, als ob Firefox (55) kein Übergang von
display: none;zudisplay: block;mag, selbst wennrequestAnimationFrame()involviert ist.Es funktioniert gut
* in Chrome (naja, Vivaldi 1.8)
* in Firefox mit
setTimeout()* in Firefox, wenn
display: block;gesetzt wird, bevor der Event-Handler ausgeführt wird.Paul, dasselbe, aber ich wollte nur etwas ausprobieren, das im Artikel stand.
Funktioniert auch in Chrome nicht.
Ich hatte dieses Problem schon einmal. Normalerweise würde ich es lösen, indem ich eine Verzögerung zwischen dem Block und der Opazität einfüge, da dies es aufhebt.
Man könnte es so machen, aber es könnte hässlich sein
Mit
pointer-events: noneersetzt
display: nonejQuery ist wie eine treue alte Decke... Selbst wenn man eine schicke neue Bettdecke hat – man will immer noch die alte Decke.
Für einen Großteil der Nicht-Ajax-API kann man die
$-Syntax beibehalten, indem man ihr den Wert derquerySelector-Funktion zuweist.sollte eigentlich
window.$ = document.querySelectorAllseinNein, sollte es nicht:
removeist keine Methode vonNodeList-Objekten.Ich habe vergessen, wo ich es gehört habe, aber es wurde gesagt, dass jQuery ein großer Erfolg war, in dem Sinne, dass es sein ultimatives Ziel erreichte. Es wurde erstellt, weil die Browser-APIs zu der Zeit schlecht waren, und diente als öffentliches Testgelände, damit Entwickler nach und nach die genauen APIs verfeinern konnten, die sie zur Verfügung haben wollten. Jetzt, da die meisten davon nativ übernommen wurden, kann jQuery mit voller Ehre in den Ruhestand versetzt werden, als das Projekt, das Browser-APIs so gut gemacht hat.
Warum integrieren sie jQuery nicht einfach in die Browser? Wäre das nicht einfacher, als darauf zu warten, dass JavaScript mehr wie jQuery wird?
Das meiste davon hat eine ausgezeichnete Browserunterstützung, wie queryselector ist solide grün bis zurück zu ie9. Und man würde sowieso zu es5 transpilieren, mit einem polyfill-Loader, so dass mangelnde Unterstützung wirklich kein Problem mehr ist.
Heute wird die Abhängigkeit von jQuery in einem Vorstellungsgespräch zu einer Ablehnung führen. Lernen Sie, ohne jQuery zu leben, je früher, desto besser.
Sie könnten sofort abgelehnt werden, wenn derjenige, der Sie interviewt, ein schlechter Entwickler ist. jQuery ist nicht von Natur aus schlecht.
Wie im Artikel erwähnt, gibt es Probleme mit Vanilla JS/Browser-APIs im Zusammenhang mit der Iteration von NodeLists und Objekten. jQuery bietet einige hilfreiche Wrapper dafür mit robuster Browserunterstützung, sodass die Verwendung davon, je nach Art der unterstützten Websites und Kunden, eine Selbstverständlichkeit ist.
Die meiste Kritik an jQuery kommt von schlechten Entwicklern, die darin schlechte Dinge tun. Aufgeblähten Code schreiben. Manche Leistungsprobleme im Zusammenhang mit der Verwendung von jQuery nicht verstehen, wenn es bessere Ansätze gibt.
Natürlich brauchst du jQuery nicht. Du brauchst Angular nicht, du brauchst React nicht, du brauchst Ember nicht. Aber es macht die Dinge verdammt viel einfacher und schneller zu schreiben. Was ist mit dynamischer, sauberer HTML-Generierung? Was ist die Alternative zu
$('<div />',{text: test, style: 'margin-top:30px', class: 'testclass' });? Das Iterieren einer NodeList sollte so einfach sein wie $(nodeList).each(function(i,item){ //tu was }); jQuery wird immer einfacher zu benutzen sein als Vanilla JS. Warumdocument.querySelector()tippen, wenn man einfach$()benutzen kann?Nun, du hast Recht, du solltest document.querySelector nicht überall tippen. Aber du kannst Folgendes tun
const dsq = document.querySelector.bind(document);und damit ist es erledigt. Du könntest das sogar $ zuweisen, wenn du wolltest. Oder
const dsq = document.querySelector.bind(document);const $ = (s) => Array.from(dsq(s));
(Denn NodeLists könnten forEach handhaben, aber nicht map, filter und every.)
In ES6 kannst du das mit Template-Strings und innerHTML machen
Wenn du es richtig machen willst, könntest du deine eigene kleine Utility-Funktion schreiben
Oder eine Mikrolibrary wie hyperx oder virtual-dom/h verwenden, um eine JSX-ähnliche Funktionalität zu erhalten.
Guter Artikel, der Purist in mir, der Vanilla JS liebt, freut sich zu sehen, dass die DOM-APIs gut mithalten.
Ein cleverer Trick, den ich benutze, ist;
Das mit einer Bibliothek wie 'h' ist meine Standardmethode, um Vanilla-JS-Websites zu erstellen.
Nur als Nebenbemerkung, du solltest keine Event-Listener zu jedem Element hinzufügen. Das führt zu schlechter Leistung und funktioniert nicht mit dynamisch eingefügten Knoten. Stattdessen sollte es auf einen übergeordneten Knoten (oder das gesamte
document) angewendet werden, der diese Elemente enthält.… es bedeutet im Wesentlichen, dass es zwei doppelte Wege gibt, alles zu tun
Ich sehe das eher als Vorteil denn als Nachteil. Es ist JQuerys Art zu tun, was (teilweise) diese neuen DOM-Methoden antreibt, und es ist gut, dass neue Konzepte/Methoden/Wege in jQuery erforscht und verfeinert werden können, bevor sie dem DOM hinzugefügt werden.
Ich liebe YMNNJQ! Tolle Seite, tolles Open-Source-Projekt, das sich ständig weiterentwickelt. Ich benutze es fast so oft wie JQuery.
for…of kann durch eine NodeList iterieren.
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/for…of
Wie die anderen Beispiele, wenn es ein Polyfill benötigt, aber wenn du Babel oder einen beliebigen ES6-Transpiler verwendest, kannst du es benutzen. :D
https://cdn.polyfill.io ist als Konzept sehr gut.
Leider hat es immer noch zu viele Fehler und funktioniert selbst in IE11 nicht wie erwartet. Es kann nicht zuverlässig in der Produktion verwendet werden.
Wenn Jquery nicht bereits im Framework (bootstrap) vorinstalliert ist, verwende ich tendenziell umbrella.js, das alles tut, was ich brauche https://umbrellajs.com/
Wow… wusste nichts von UmbrellaJS. Das sieht ziemlich großartig aus!
Persönlich werde ich wahrscheinlich trotzdem nativ + Polyfill verwenden, aber für jemanden, der versucht, sich von jQuery wegzubewegen, ist das eine großartig aussehende Mikrolibrary!
Gibt es eine Offline-Möglichkeit, polyfill.io zu verwenden? Ich arbeite gerade an einem Intranet-Projekt für einen Kunden, und er hat nicht immer (direkten) Internetzugang, und es ist ein mühsamer Prozess, eine Domain genehmigen zu lassen…
Ich habe kürzlich etwas Code geschrieben und frage mich, ob ich ihn mithilfe der oben genannten Methoden refaktorieren kann. Mein Code sieht eine Div mit der ID "about" vor, entfernt alle Absätze darin und erstellt dann neue Absätze darin. Jegliche Verbesserungen wären willkommen.
Alsooo, die Quintessenz ist: Benutze kein jQuery mehr, weil Vanilla JavaScript immer mehr wie jQuery wird.
Ich stimme einer Reihe von Leuten hier zu, dass jQuery viel einfacher zu schreiben ist. Es ergab für mich sofort Sinn, als ich es um 2008 entdeckte, während JavaScript immer seltsam und unübersichtlich schien. Aber wenn Vanilla JavaScript immer mehr wie jQuery wird, dann hat jQuery vielleicht in dieser Hinsicht seinen Zweck erfüllt.
Ollie, guter Artikel.
Aber ich muss immer noch für IE entwickeln, und es gibt IMMER NOCH KEINE UNTERSTÜTZUNG für diese DOM-Methoden. Also werde ich weiterhin JQuery benutzen, danke sehr. Da es ALLE von mir benötigten Browser unterstützt.
Ihre Prämisse, dass wir JQuery "vielleicht" nicht mehr verwenden müssen, wird durch Ihre Browser-Supporttabelle beantwortet. Ja, wir müssen JQuery IMMER NOCH benutzen, wenn wir IE-Benutzer unterstützen wollen.
jQuery IST JavaScript, also… ja, Vanilla JavaScript unterstützt IE (ich weiß, das ist ein aufdringliches, semantisches Argument).
Wie weit zurück sprichst du? IE9+ deckt 99,6 % der weltweiten Browsernutzung ab. IE8 unterstützt auch
document.querySelector. Einige der neueren Dinge, die oben aufgeführt sind, haben relativ einfache alternative Ansätze mit breiterer Browserunterstützung.Und ein paar einfache Polyfills können die Unterstützung für viele dieser Dinge bis zurück zu IE7 verbessern.
Eine Sache, die ich überraschend finde, dass sie im Artikel nicht erwähnt wurde, ist die Leistung von Vanilla JS im Vergleich zu jQuery. Es gibt ein Dutzend Tests auf jsperf und esbench, die einfache alltägliche Dinge testen, die man mit jQuery im Vergleich zu Vanilla-Alternativen macht, und die Ergebnisse sind erstaunlich. Ein paar Beispiele
https://jsperf.com/jquery-hide-vs-javascript-hide
https://jsperf.com/jquery-loop-appending/
https://jsperf.com/jquery-vs-native-balf
https://esbench.com/bench/574fab8ddb965b9a00965ace
Glücklicherweise verwenden wenige meiner Benutzer IE oder Edge – und ich habe kein Problem damit, diesen wenigen zu sagen, dass sie etwas Besseres verwenden sollen.
Ich würde niemals für einen bestimmten Browser programmieren; aber für den Standard zu programmieren und Leute, die einen Mist-Browser benutzen, aufzufordern, zu wechseln, ist etwas anderes.
Ich verstehe, dass nicht jeder in einer so glücklichen Position ist.
Guter Artikel, guter Standpunkt.
Der schwächste Punkt, meiner bescheidenen Meinung nach, ist die Abhängigkeit von polyfill.io.
Ich möchte mich nicht auf etwas verlassen, das Zugang zu einem anderen externen Server für meine gesamte Website benötigt, damit sie funktioniert. Das verdoppelt sofort die Fehlerchancen (sei es Serverausfälle oder Netzwerkfehler).
Ich möchte mich niemals auf etwas verlassen, das auf der Überprüfung des User-Agent-Headers basiert! Ernsthaft, im Jahr 2017 mit all den verschiedenen Geräten und Browsern, Handys, Uhren, IoT-Peripheriegeräten, sollten wir uns auf den User-Agent-String verlassen? Nein danke. Das haben wir 1990 nicht getan, und wir werden jetzt auch nicht damit anfangen. Das ist es, was polyfill.io tut.
Ich würde mich nicht auf etwas verlassen, das nicht völlig stabil ist. Selbst wenn sie den Code verbessern und Fehler beheben, kann diese Korrektur einige Verhaltensweisen ändern, auf die ich leider angewiesen bin. Wenn ich Bibliotheken aktualisiere, von denen meine Website abhängt, weiß ich davon und kann alles noch einmal testen. Wenn polyfill.io etwas ändert, warnt es mich nicht, also wird niemand testen. Möglicherweise werden auch neue Fehler erzeugt, vielleicht für eine kleine Plattform, und in diesem Fall würde es niemand wissen.
Polyfills sind gut, aber ich mag sie auf die altbewährte Art, auf meinem eigenen Server und basierend auf der Funktionalität, nicht auf dem User-Agent.
Leider bedeutet dies, dass Sie sie selbst installieren, alles über alle möglichen Browser und Ausfälle wissen müssen, die behoben werden müssen, um sicherzustellen, dass alles zu 100 % auf Ihren Zielen funktioniert. Es impliziert Forschung und Zeit, um alle möglichen fehlenden Funktionen zu finden. Da ist jQuery praktisch, es funktioniert einfach (ich werde es wahrscheinlich nicht von einem CDN ziehen, wie Sie sich vorstellen können).
Für Projekte, die wenige moderne und stabile Browser benötigen, sind einige alternative Bibliotheken oder gar keine in Ordnung, und mit der Zeit werden sie vielleicht zur Norm. Nur noch nicht.
Sie brauchen nicht einmal JavaScript, um ein Element auszublenden, das können Sie mit CSS erreichen.
Ich kann ehrlich sagen, dass Leistungsprobleme auf Websites, an denen ich gearbeitet habe, noch nie durch jQuery verursacht wurden. Wenn es Leistungsprobleme gibt, ist es entweder ein Missbrauch von jQuery und/oder Probleme, die nichts mit dem Skript zu tun haben.
Es ist cool, dass natives JS jetzt viele der Gründe bietet, die mich dazu motiviert haben, mit der Verwendung von jQuery zu beginnen, und vielleicht werde ich im Laufe der Zeit einige davon verwenden, aber jQuery funktioniert und verlangsamt die Websites nicht, daher sehe ich keinen Grund, es aufzugeben.
In der Vergangenheit haben Polyfills, wenn ich sie verwendet habe, meine Websites auf einigen Browsern kaputt gemacht. Ich halte mich generell von ihnen fern. Sicher, die Fehler werden behoben, aber dann werden neue eingeführt, und es scheint, dass sie, bis sie wirklich gut genug für die Produktion funktionieren, nicht mehr benötigt werden.
Danke für die Erwähnung von Secrets of the JavaScript Ninja! Aber hier ist ein Link zur 2. Auflage (statt zur 1. Auflage).
Ich warte auf die Artikel "React – gilt als schädlich" und "Man braucht vielleicht kein React". Ich schätze, ich werde einfach die obligatorischen zehn Jahre warten müssen.
Hallo
Das ist großartig. Ich benutze seit einem Jahr JS… vorher war ich ActionScript-Entwickler (ja, es gibt uns noch ein paar!!) – habe versucht, jQuery zu vermeiden, da ich wissen wollte, was unter der Haube passiert.
Zu lernen, wie JQuery funktioniert, ist sehr nützliches Wissen für einen JS-Entwickler.
@Michael. Wahr, aber es gibt viel zu lernen und ich muss Prioritäten setzen.
Ich konzentriere mich hauptsächlich auf die OOP-Seite von JavaScript, anstatt auf DOM-Manipulation.
Wir verwenden Angular v4 bei der Arbeit und installieren jQuery nicht mit (ich glaube, das ist auch bei React der Fall). Ich muss CSS, OOP-JavaScript kennen und den HTML/DOM/JavaScriptVM/Rendering-Zyklus verstehen. Wir deployen mit webpack, npm, git und verwenden node.js (express.js serverseitig), MongoDB. Dann gibt es noch die Besonderheiten des UI-Frameworks – ngrx, Komponentenlebenszyklus, Änderungserkennung, AOT-Kompilierung, serverseitiges Rendering, Integration von Drittanbieterbibliotheken, TypeScript…… und das war's. Einfach, einfach :-)
@Brian – aber mein Punkt ist, dass JQuery mehr als nur DOM-Manipulation ist. Es ist eine ganze Lektion über OOP in JS. Viele der Entwurfsmuster, die man als Entwickler lernen muss, werden in diesem Framework verwendet.
Wenn Sie also OOP lernen wollen, dann steht mein Vorschlag, sich mit JQuery zu beschäftigen, immer noch.
Das ist der Hammer…
https://polyfill.io/v2/docs/
Nur die Polyfills, die Sie für Ihre Website benötigen, zugeschnitten auf jeden Browser. Kopieren Sie den Code, um die Magie zu entfesseln
https://cdn.polyfill.io/v2/polyfill.min.js
Polyfill.io liest den User-Agent-Header jeder Anfrage und gibt Polyfills zurück, die für den anfragenden Browser geeignet sind. Passen Sie die Antwort an die Features an, die Sie in Ihrer App verwenden, und sehen Sie sich unsere Live-Beispiele an, um schnell loszulegen.