Angaben gemäß § 5 TMG

Jan Maslov
Gerresheimer Straße 140
40233 Düsseldorf

Kontakt

Telefon: +49 157 87000011
E-Mail: info (at) maslov.io

Warnhinweis zu Inhalten

Die Inhalte dieser Webseite wurden mit größtmöglicher Sorgfalt erstellt. Ich übernehme jedoch keine Gewähr für die Richtigkeit und Aktualität der bereitgestellten Inhalte. Die Nutzung dieser Webseite erfolgt auf eigene Gefahr. Allein durch den Aufruf der Webseite und der Inhalte kommt kein Vertragsverhältnis zwischen dir und mir zustande.

Verlinkungen

Meine Webseite enthält Verlinkungen zu anderen Webseiten ("externe Links"). Diese Webseiten unterliegen der Haftung der jeweiligen Seitenbetreiber. Bei Verknüpfung der externen Links waren keine Rechtsverstöße ersichtlich. Auf die aktuelle und künftige Gestaltung der verlinkten Seiten habe ich keinen Einfluss. Die permanente Überprüfung der externen Links ist für mich ohne konkrete Hinweise auf Rechtsverstöße nicht zumutbar. Bei Bekanntwerden von Rechtsverstößen lösche ich die betroffenen externen Links.

Urheberrecht/Leistungsschutzrecht

Die auf dieser Webseite durch mich veröffentlichten Inhalte unterliegen dem deutschen Urheberrecht und Leistungsschutzrecht. Die vom deutschen Urheber- und Leistungsschutzrecht nicht zugelassene Verwertung bedarf meiner, oder des jeweiligen Rechteinhabers, vorherigen schriftlichen Zustimmung. Dies gilt vor allem für Vervielfältigung, Bearbeitung, Übersetzung, Einspeicherung und Verarbeitung der Inhalte in Datenbanken oder anderen elektronischen Medien und Systemen.

Werbung

Die Verwendung der Kontaktdaten des Impressums zur gewerblichen Werbung ist ausdrücklich unerwünscht, es sei denn ich hatte zuvor meine schriftliche Einwilligung erteilt oder es besteht bereits eine Geschäftsbeziehung. Der Anbieter und alle auf dieser Webseite genannten Personen widersprechen hiermit jeder kommerziellen Verwendung und Weitergabe der Daten.

Besondere Nutzungsbedingungen

Soweit besondere Bedingungen für einzelne Nutzungen dieser Website von den vorgenannten Punkten abweichen, wird an entsprechender Stelle ausdrücklich darauf hingewiesen. Es gelten dann im jeweiligen Einzelfall die besonderen Bedingungen.

Datenschutzerklärung

Diese Datenschutzerklärung klärt dich über die Art, den Umfang und Zweck der Verarbeitung von personenbezogenen Daten (nachfolgend kurz "Daten") innerhalb meines Onlineangebotes und der mit ihm verbundenen Webseiten, Funktionen und Inhalte sowie externen Onlinepräsenzen, wie z.B. meiner Social Media Profile auf (nachfolgend gemeinsam bezeichnet als "Onlineangebot"). Im Hinblick auf die verwendeten Begrifflichkeiten, wie z.B. "Verarbeitung" oder "Verantwortlicher" verweise ich auf die Definitionen im Art. 4 der Datenschutzgrundverordnung (DSGVO).

Verantwortlicher

Jan Maslov
Gerresheimer Straße 140
40233 Düsseldorf
Deutschland

E-Mail: info (at) maslov.io

Arten der verarbeiteten Daten:

Kategorien betroffener Personen

Besucher und Nutzer meines Onlineangebotes (Nachfolgend bezeichne ich die betroffenen Personen zusammenfassend als "Nutzer").

Zweck der Verarbeitung

Verwendete Begrifflichkeiten

"Personenbezogene Daten" sind alle Informationen, die sich auf eine identifizierte oder identifizierbare natürliche Person (im Folgenden "betroffene Person") beziehen. Als identifizierbar wird eine natürliche Person angesehen, die direkt oder indirekt, insbesondere mittels Zuordnung zu einer Kennung wie einem Namen, zu einer Kennnummer, zu Standortdaten, zu einer Online-Kennung (z.B. Cookie) oder zu einem oder mehreren besonderen Merkmalen identifiziert werden kann, die Ausdruck der physischen, physiologischen, genetischen, psychischen, wirtschaftlichen, kulturellen oder sozialen Identität dieser natürlichen Person sind.
"Verarbeitung" ist jeder mit oder ohne Hilfe automatisierter Verfahren ausgeführte Vorgang oder jede solche Vorgangsreihe im Zusammenhang mit personenbezogenen Daten. Der Begriff reicht weit und umfasst praktisch jeden Umgang mit Daten.
"Pseudonymisierung" ist die Verarbeitung personenbezogener Daten in einer Weise, dass die personenbezogenen Daten ohne Hinzuziehung zusätzlicher Informationen nicht mehr einer spezifischen betroffenen Person zugeordnet werden können, sofern diese zusätzlichen Informationen gesondert aufbewahrt werden und technischen und organisatorischen Maßnahmen unterliegen, die gewährleisten, dass die personenbezogenen Daten nicht einer identifizierten oder identifizierbaren natürlichen Person zugewiesen werden.
Als "Verantwortlicher" wird die natürliche oder juristische Person, Behörde, Einrichtung oder andere Stelle, die allein oder gemeinsam mit anderen über die Zwecke und Mittel der Verarbeitung von personenbezogenen Daten entscheidet, bezeichnet.

"Auftragsverarbeiter" eine natürliche oder juristische Person, Behörde, Einrichtung oder andere Stelle, die personenbezogene Daten im Auftrag des Verantwortlichen verarbeitet.

Maßgebliche Rechtsgrundlagen

Nach Maßgabe des Art. 13 DSGVO teile ich die die Rechtsgrundlagen meiner Datenverarbeitungen mit. Sofern die Rechtsgrundlage in der Datenschutzerklärung nicht genannt wird, gilt Folgendes: Die Rechtsgrundlage für die Einholung von Einwilligungen ist Art. 6 Abs. 1 lit. a und Art. 7 DSGVO, die Rechtsgrundlage für die Verarbeitung zur Erfüllung meiner Leistungen und Durchführung vertraglicher Maßnahmen sowie Beantwortung von Anfragen ist Art. 6 Abs. 1 lit. b DSGVO, die Rechtsgrundlage für die Verarbeitung zur Erfüllung meiner rechtlichen Verpflichtungen ist Art. 6 Abs. 1 lit. c DSGVO, und die Rechtsgrundlage für die Verarbeitung zur Wahrung meiner berechtigten Interessen ist Art. 6 Abs. 1 lit. f DSGVO. Für den Fall, dass lebenswichtige Interessen der betroffenen Person oder einer anderen natürlichen Person eine Verarbeitung personenbezogener Daten erforderlich machen, dient Art. 6 Abs. 1 lit. d DSGVO als Rechtsgrundlage.

Sicherheitsmaßnahmen

Ich treffe nach Maßgabe des Art. 32 DSGVO unter Berücksichtigung des Stands der Technik, der Implementierungskosten und der Art, des Umfangs, der Umstände und der Zwecke der Verarbeitung sowie der unterschiedlichen Eintrittswahrscheinlichkeit und Schwere des Risikos für die Rechte und Freiheiten natürlicher Personen, geeignete technische und organisatorische Maßnahmen, um ein dem Risiko angemessenes Schutzniveau zu gewährleisten. Zu den Maßnahmen gehören insbesondere die Sicherung der Vertraulichkeit, Integrität und Verfügbarkeit von Daten durch Kontrolle des physischen Zugangs zu den Daten, als auch des sie betreffenden Zugriffs, der Eingabe, Weitergabe, der Sicherung der Verfügbarkeit und ihrer Trennung. Des Weiteren habe ich Verfahren eingerichtet, die eine Wahrnehmung von Betroffenenrechten, Löschung von Daten und Reaktion auf Gefährdung der Daten gewährleisten. Ferner berücksichtige ich den Schutz personenbezogener Daten bereits bei der Entwicklung, bzw. Auswahl von Hardware, Software sowie Verfahren, entsprechend dem Prinzip des Datenschutzes durch Technikgestaltung und durch datenschutzfreundliche Voreinstellungen (Art. 25 DSGVO).

Zusammenarbeit mit Auftragsverarbeitern und Dritten

Sofern ich im Rahmen meiner Verarbeitung Daten gegenüber anderen Personen und Unternehmen (Auftragsverarbeitern oder Dritten) offenbare, sie an diese übermittle oder ihnen sonstigen Zugriff auf die Daten gewähre, erfolgt dies nur auf Grundlage einer gesetzlichen Erlaubnis (z.B. wenn eine Übermittlung der Daten an Dritte, wie an Zahlungsdienstleister, gem. Art. 6 Abs. 1 lit. b DSGVO zur Vertragserfüllung erforderlich ist), du eingewilligt hast, eine rechtliche Verpflichtung dies vorsieht oder auf Grundlage meiner berechtigten Interessen (z.B. beim Einsatz von Beauftragten, Webhostern, etc.).
Sofern ich Dritte mit der Verarbeitung von Daten auf Grundlage eines sog. „Auftragsverarbeitungsvertrages“ beauftrage, geschieht dies auf Grundlage des Art. 28 DSGVO.

Übermittlungen in Drittländer

Sofern ich Daten in einem Drittland (d.h. außerhalb der Europäischen Union (EU) oder des Europäischen Wirtschaftsraums (EWR)) verarbeite oder dies im Rahmen der Inanspruchnahme von Diensten Dritter oder Offenlegung, bzw. Übermittlung von Daten an Dritte geschieht, erfolgt dies nur, wenn es zur Erfüllung meiner (vor)vertraglichen Pflichten, auf Grundlage deiner Einwilligung, aufgrund einer rechtlichen Verpflichtung oder auf Grundlage meiner berechtigten Interessen geschieht. Vorbehaltlich gesetzlicher oder vertraglicher Erlaubnisse, verarbeite oder lasse ich die Daten in einem Drittland nur beim Vorliegen der besonderen Voraussetzungen der Art. 44 ff. DSGVO verarbeiten. D.h. die Verarbeitung erfolgt z.B. auf Grundlage besonderer Garantien, wie der offiziell anerkannten Feststellung eines der EU entsprechenden Datenschutzniveaus (z.B. für die USA durch das "Privacy Shield") oder Beachtung offiziell anerkannter spezieller vertraglicher Verpflichtungen (so genannte "Standardvertragsklauseln").

Rechte der betroffenen Personen

Du hast das Recht, eine Bestätigung darüber zu verlangen, ob betreffende Daten verarbeitet werden und auf Auskunft über diese Daten sowie auf weitere Informationen und Kopien der Daten entsprechend Art. 15 DSGVO.

Du hast entsprechend Art. 16 DSGVO das Recht, die Vervollständigung der dich betreffenden Daten oder die Berichtigung der dich betreffenden unrichtigen Daten zu verlangen.
Du hast nach Maßgabe des Art. 17 DSGVO das Recht zu verlangen, dass betreffende Daten unverzüglich gelöscht werden, bzw. alternativ nach Maßgabe des Art. 18 DSGVO eine Einschränkung der Verarbeitung der Daten zu verlangen.
Du hast das Recht zu verlangen, dass die dich betreffenden Daten, die du mir bereitgestellt hast nach Maßgabe des Art. 20 DSGVO zu erhalten und deren Übermittlung an andere Verantwortliche zu fordern.
Du hast ferner gem. Art. 77 DSGVO das Recht, eine Beschwerde bei der zuständigen Aufsichtsbehörde einzureichen.

Widerrufsrecht

Du hast das Recht, erteilte Einwilligungen gem. Art. 7 Abs. 3 DSGVO mit Wirkung für die Zukunft zu widerrufen.

Widerspruchsrecht

Du kannst der künftigen Verarbeitung der dich betreffenden Daten nach Maßgabe des Art. 21 DSGVO jederzeit widersprechen. Sende mir dazu einfach eine Mail.

Cookies und Widerspruchsrecht bei Direktwerbung

Als "Cookies" werden kleine Dateien bezeichnet, die auf dem Gerät des Nutzer gespeichert werden, wenn dieser mein Onlineangebot in Anspruch nimmt. Innerhalb der Cookies können unterschiedliche Angaben gespeichert werden. Ein Cookie dient primär dazu, die Angaben zu einem Nutzer (bzw. dem Gerät auf dem das Cookie gespeichert ist) während oder auch nach seinem Besuch innerhalb eines Onlineangebotes zu speichern. Als temporäre Cookies, bzw. "Session-Cookies" oder "transiente Cookies", werden Cookies bezeichnet, die gelöscht werden, nachdem ein Nutzer ein Onlineangebot verlässt und seinen Browser schließt. In einem solchen Cookie kann z.B. der Inhalt eines Warenkorbs in einem Onlineshop oder ein Login-Status gespeichert werden. Als "permanent" oder "persistent" werden Cookies bezeichnet, die auch nach dem Schließen des Browsers gespeichert bleiben. So kann z.B. der Login-Status gespeichert werden, wenn die Nutzer diese nach mehreren Tagen aufsuchen. Als "Third-Party-Cookie" werden Cookies bezeichnet, die von anderen Anbietern als dem Verantwortlichen, der das Onlineangebot betreibt, angeboten werden (andernfalls, wenn es nur dessen Cookies sind spricht man von "First-Party Cookies").

Ich setze ein permanentes Cookie zur Speicherung deiner ausgewählten Sprachoption ein und kläre hierüber im Rahmen meiner Datenschutzerklärung auf. Falls du nicht möchtest, dass Cookies auf deinem Rechner gespeichert werden, bitte ich dich die entsprechende Option in den Einstellungen deines Browsers zu deaktivieren. Gespeicherte Cookies können in den Einstellungen des Browsers gelöscht werden. Der Ausschluss von Cookies kann zu Funktionseinschränkungen meines Onlineangebotes führen.

Löschung von Daten

Die von mir verarbeiteten Daten werden nach Maßgabe der Art. 17 und 18 DSGVO gelöscht oder in ihrer Verarbeitung eingeschränkt. Sofern nicht im Rahmen dieser Datenschutzerklärung ausdrücklich angegeben, werden die bei mir gespeicherten Daten gelöscht, sobald sie für ihre Zweckbestimmung nicht mehr erforderlich sind und der Löschung keine gesetzlichen Aufbewahrungspflichten entgegenstehen. Sofern die Daten nicht gelöscht werden, weil sie für andere und gesetzlich zulässige Zwecke erforderlich sind, wird deren Verarbeitung eingeschränkt. D.h. die Daten werden gesperrt und nicht für andere Zwecke verarbeitet. Das gilt z.B. für Daten, die aus handels- oder steuerrechtlichen Gründen aufbewahrt werden müssen.
Nach gesetzlichen Vorgaben in Deutschland, erfolgt die Aufbewahrung insbesondere für 10 Jahre gemäß §§ 147 Abs. 1 AO, 257 Abs. 1 Nr. 1 und 4, Abs. 4 HGB (Bücher, Aufzeichnungen, Lageberichte, Buchungsbelege, Handelsbücher, für Besteuerung relevanter Unterlagen, etc.) und 6 Jahre gemäß § 257 Abs. 1 Nr. 2 und 3, Abs. 4 HGB (Handelsbriefe).

Geschäftsbezogene Verarbeitung

Zusätzlich verarbeite ich

von meinen Kunden, Interessenten und Geschäftspartnern zwecks Erbringung vertraglicher Leistungen, Service und Kundenpflege.

Agenturdienstleistungen

Ich verarbeite die Daten meiner Kunden im Rahmen unserer vertraglichen Leistungen zu denen konzeptionelle und strategische Beratung, Software- und Designentwicklung/-beratung oder Pflege, Umsetzung von Kampagnen und Prozessen, Handling, Serveradministration und Datenanalyse/Beratungsleistungen gehören.
Hierbei verarbeite ich Bestandsdaten (z.B., Kundenstammdaten, wie Namen oder Adressen), Kontaktdaten (z.B., E-Mail, Telefonnummern), Inhaltsdaten (z.B., Texteingaben, Fotografien, Videos), Vertragsdaten (z.B., Vertragsgegenstand, Laufzeit), Zahlungsdaten (z.B., Bankverbindung, Zahlungshistorie), Nutzungs- und Metadaten (z.B. im Rahmen der Auswertung und Erfolgsmessung von Marketingmaßnahmen). Besondere Kategorien personenbezogener Daten verarbeite ich grundsätzlich nicht, außer wenn diese Bestandteile einer beauftragten Verarbeitung sind. Zu den Betroffenen gehören meine Kunden, Interessenten sowie deren Kunden, Nutzer, Websitebesucher oder Mitarbeiter sowie Dritte. Der Zweck der Verarbeitung besteht in der Erbringung von Vertragsleistungen, Abrechnung und meinem Kundenservice. Die Rechtsgrundlagen der Verarbeitung ergeben sich aus Art. 6 Abs. 1 lit. b DSGVO (vertragliche Leistungen), Art. 6 Abs. 1 lit. f DSGVO (Analyse, Statistik, Optimierung, Sicherheitsmaßnahmen). Ich verarbeite Daten, die zur Begründung und Erfüllung der vertraglichen Leistungen erforderlich sind und weise auf die Erforderlichkeit ihrer Angabe hin. Eine Offenlegung an Externe erfolgt nur, wenn sie im Rahmen eines Auftrags unbedingt erforderlich ist. Bei der Verarbeitung der mir im Rahmen eines Auftrags überlassenen Daten handle ich entsprechend den Weisungen der Auftraggeber sowie der gesetzlichen Vorgaben einer Auftragsverarbeitung gem. Art. 28 DSGVO und verarbeite die Daten zu keinen anderen, als den auftragsgemäßen Zwecken und grundsätzlich mit größtmöglicher Sorgfalt.
Ich lösche die Daten nach Ablauf gesetzlicher Gewährleistungs- und vergleichbarer Pflichten. Die Erforderlichkeit der Aufbewahrung der Daten wird alle drei Jahre überprüft; im Fall der gesetzlichen Archivierungspflichten erfolgt die Löschung nach deren Ablauf (6 Jahre, gem. § 257 Abs. 1 HGB, 10 Jahre, gem. § 147 Abs. 1 AO). Im Fall von Daten, die mir im Rahmen eines Auftrags durch den Auftraggeber offengelegt wurden, lösche ich die Daten entsprechend den Vorgaben des Auftrags, grundsätzlich nach Ende des Auftrags.

Kontaktaufnahme

Bei der Kontaktaufnahme mit mir (z.B. per Kontaktformular, E-Mail, Telefon oder via sozialer Medien) werden die Angaben des Nutzers zur Bearbeitung der Kontaktanfrage und deren Abwicklung gem. Art. 6 Abs. 1 lit. b) DSGVO verarbeitet.
Ich lösche die Anfragen, sofern diese nicht mehr erforderlich sind. Ich überprüfen die Erforderlichkeit alle zwei Jahre; Ferner gelten die gesetzlichen Archivierungspflichten.

Hosting und E-Mail-Versand

Die von mir in Anspruch genommenen Hosting-Leistungen dienen der Zurverfügungstellung der folgenden Leistungen: Infrastruktur- und Plattformdienstleistungen, Rechenkapazität, Speicherplatz und Datenbankdienste, E-Mail-Versand, Sicherheitsleistungen sowie technische Wartungsleistungen, die ich zum Zwecke des Betriebs dieses Onlineangebotes einsetze.
Hierbei verarbeite ich, bzw. mein Hostinganbieter Bestandsdaten, Kontaktdaten, Inhaltsdaten, Vertragsdaten, Nutzungsdaten, Meta- und Kommunikationsdaten von Kunden, Interessenten und Besuchern meines Onlineangebotes auf Grundlage meiner berechtigten Interessen an einer effizienten und sicheren Zurverfügungstellung dieses Onlineangebotes gem. Art. 6 Abs. 1 lit. f DSGVO i.V.m. Art. 28 DSGVO (Abschluss Auftragsverarbeitungsvertrag).

Erhebung von Zugriffsdaten und Logfiles

Ich, bzw. mein Hostinganbieter, erhebt auf Grundlage unserer berechtigten Interessen im Sinne des Art. 6 Abs. 1 lit. f. DSGVO Daten über jeden Zugriff auf den Server, auf dem sich dieser Dienst befindet (sogenannte "Serverlogfiles"). Zu den Zugriffsdaten gehören:

Logfile-Informationen werden aus Sicherheitsgründen (z.B. zur Aufklärung von Missbrauchs- oder Betrugshandlungen) für die Dauer von maximal 7 Tagen gespeichert und danach automatisch gelöscht. Daten, deren weitere Aufbewahrung zu Beweiszwecken erforderlich ist, sind bis zur endgültigen Klärung des jeweiligen Vorfalls von der Löschung ausgenommen.

Einbindung von Diensten und Inhalten Dritter

Ich setze innerhalb meines Onlineangebotes auf Grundlage meiner berechtigten Interessen (d.h. Interesse an der Analyse, Optimierung und wirtschaftlichem Betrieb unseres Onlineangebotes im Sinne des Art. 6 Abs. 1 lit. f. DSGVO) Inhalts- oder Serviceangebote von Drittanbietern ein, um deren Inhalte und Services, wie z.B. Videos oder Schriftarten einzubinden (nachfolgend einheitlich bezeichnet als "Inhalte").

Dies setzt immer voraus, dass die Drittanbieter dieser Inhalte die IP-Adresse des Nutzers wahrnehmen, da sie ohne die IP-Adresse die Inhalte nicht an deren Browser senden könnten. Die IP-Adresse ist damit für die Darstellung dieser Inhalte erforderlich. Ich bemühe mich nur solche Inhalte zu verwenden, deren jeweilige Anbieter die IP-Adresse lediglich zur Auslieferung der Inhalte verwendet. Drittanbieter können ferner so genannte Pixel-Tags (unsichtbare Grafiken, auch als "Web Beacons" bezeichnet) für statistische oder Marketingzwecke verwenden. Durch die "Pixel-Tags" können Informationen, wie der Besucherverkehr auf den Seiten dieser Website ausgewertet werden. Die pseudonymen Informationen können ferner in Cookies auf dem Gerät des Nutzers gespeichert werden und unter anderem technische Informationen zum Browser und Betriebssystem, verweisende Webseiten, Besuchszeit sowie weitere Angaben zur Nutzung meines Onlineangebotes enthalten, als auch mit solchen Informationen aus anderen Quellen verbunden werden.

Youtube

Ich binde Videos der Plattform "YouTube" des Anbieters Google LLC, 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA, ein. Datenschutzerklärung: https://www.google.com/policies/privacy/, Opt-Out: https://adssettings.google.com/authenticated.

Google ReCaptcha

Ich binde z.B. beim Kontaktformular die Funktion "ReCaptcha" des Anbieters Google LLC, 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA, zur Erkennung von Bots ein. Datenschutzerklärung: https://www.google.com/policies/privacy/, Opt-Out: https://adssettings.google.com/authenticated.

Vom Websiteinhaber angepasst
Erstellt mit Datenschutz-Generator.de von RA Dr. Thomas Schwenke

98% Google PageSpeed Insights score output engulfed in raging flames

No More jQuery

May 30, 2019 - 7 minutes reading time

jQuery is a neat thing. It has lots of useful little things like DOM-manipulation, AJAX and bad-performing animations. I used jQuery since my early days of developing frontends because it allowed me an easy foot in, and there were always tons and tons of plugins that used jQuery.

For many things that in jQuery were solved with a single line, browsers didn't have an equivalent alternative. That is completely ignoring cross-browser compatibility. jQuery united all browsers into one codebase. You didn't have to implement certain things in a certain way for the script to work same in Safari as it did in Firefox. An example for making code more understandable is AJAX, asynchronous exchange of data between browser and server. Let's look at an example of sending the contents of a form and reacting to the response:

// Post form data in native JavaScript via XMLHttpRequest
document.getElementById('button-submit').addEventListener('click', function(e){
	var formData = new FormData(document.getElementById('form-signin'));
	var xhr = new XMLHttpRequest();
	xhr.open('POST', 'https://example.com/signin');
	xhr.onreadystatechange = function(){
		if(xhr.readyState === 4 && xhr.status === 200){
			console.log(xhr.responseText); // When all wenn through
		}
	}
	xhr.send(formData);
});

Das selbe dann nochmal mit jQuerys POST-Methode:

// Post form data via jQuery
$('#button-submit').click(function(e){
	$.post('https://example.com/signin', $('#form-signin').serialize())
	.success(function(data){
		console.log(data); // When all wenn through
	});
});

The jQuery solution is not only shorter, but easier to understand, because there's a clean API that shows us what will happen in what order. Additionally, jQuery will automatically detect an XML or JSON-formatted response from the server. In the data-variable we get a JavaScript Object with which we can work without parsing it manually.

Generally speaking jQuery is a win-win: You don't reinvent the wheel and get lots of small helpful pieces of code for shorter notation for often-used functions. It's also so widely used, that caching the .js file is no problem by linking to jQuery hosted on an often-used CDN, like Google's.

That's all well and good, but still my website didn't reach 100 points for mobile devices in the Google PageSpeed Insights test. Granted, 98 is almost perfect, but a lightweight page such as mine should be able to make it to 100. So I went on the search for a solution.

Searching for a solution

Google Chrome waterfall graph of the loading process of the jQuery library

I quickly noticed that jQuery was taking a pretty long time loading from Google's servers, at least relatively compared to the rest of the page. The at this point dated version 3.3.1 weighs around 30KB compressed with gzip, uncompressed it's about 85KB. First of all this is not a trivial amount of code that the browser has to parse on every page load. And secondly, including jQuery from Google's CDN incurs a hefty overhead in form of the additional DNS request and SSL handshake.

For the latter issue there's a solution: Just host jQuery myself, or don't use jQuery. The second solution solves both issues. When there's no jQuery, there's no large script that needs to be parsed.

GitHub famously has refactored its frontend to free itself from jQuery and has reimplemented the functions through native JavaScript. And so I've decided to try out a life without jQuery.

Replacing jQuery

But jQuery has such neat advantages! Well, yeah, but the JavaScript implementations in modern browsers have evolved, and the things I used jQuery the most for, have been implemented in the most widely used browser (versions). And for the rest there are wrappers and libraries now that will be much smaller than jQuery. I'm basically tree shaking jQuery at this point.

What I liked the most about jQuery was the simple way of defining events, the easy DOM node selection, the class utilities and AJAX.

Events

I think jQuery has a great API for event definition, especially for binding multiple events to multiple elements, and event delegation. As an example, here I'd like to give text input fields a red border when they're empty. I created a CSS class for that, which I want to apply based on the text field's contents.

The following code block in jQuery:

// Defining multiple events on multiple elements via jQuery
$('#name,#message').on('change input blur', function(e){
	var el = $(e.target);
	if(el.val === ''){
		el.addClass('form-control-error');
	}else{
		el.removeClass('form-control-error');
	}
});

Turns into:

// Defining multiple events on multiple elements in native JavaScript
document.querySelectorAll('#name,#message').forEach(function(el){
	['change','input','blur'].forEach(function(event){
		el.addEventListener(event, function(){
			if(this.value === ''){
				this.classList.add('form-control-error');
			}else{
				this.classList.remove('form-control-error');
			}
		});
	});
});

For this simple action I need two for-loops. I know that there's actually no difference, jQuery's API just hides those loops and string operations behind this inconspicuous call. Generally, jQuery is not a lot slower than the native solution.

But jQuery also does event delegation. This only works if you differentiate the clicked element manually in the event handler. If you don't want to do that, you can check out events.js by Chris Ferdinandi. It's 1.24KB in size and makes defining events much easier. I chose not to include it, because my website is small and I could solve it that way in that one specific case.

Class Utilities

This one's pretty simple. The solution is called ClassList and can be used in relatively modern browsers. The API is similar to jQuery as you can see above. $(element).addClass('example') turns into element.classList.add('example') ClassList works with limitations in Internet Explorer 10, and poses no problem to newer browsers.

AJAX

As can be seen in the code example above, AJAX via XMLHttpRequest in native JavaScript is not very pretty.

Behind the contact form on my website I have a server-side API that tells whether the user has typed in a real email address, and if so, whether this email address is from a disposable email provider. Here I used a wrapper for XMLHttpRequest by Fernando Daciuk called ajax.js that is 1.97KB in size. It works similarly to jQuery's $.get(), $.post() and $.ajax() functions. The corresponding AJAX call looks like this:

// AJAX Get via ajax.js
ajax().get('/contact/checkmail', {
	email: email.value
}).then(function(data){
	if(data == true){
		// Email address is allowed
	}else{
		// Email address is not allowed
	}
});

There's also an alternative, the relatively new Fetch API. The example above is written in mostly the same way. Using the Fetch API is only slightly more complicated:

// AJAX Get via Fetch API
fetch('/contact/checkmail', {
	cache: 'no-cache',
	body: JSON.stringify({email:email.value})
}).then(function(response){
	response.json().then(function(data){
		if(data.json == true){
			// Email address is allowed
		}else{
			// Email address is not allowed
		}
	});
});

The Fetch API only sends plain text, so the server has to parse the JavaScript Object coming in. The Fetch API lets you decide what format you want to transform the server's response into, for example via response.json().then(). Personally I wanted to be on the safe side and took ajax.js to support more browsers.

Result

The result is pretty obvious: By removing jQuery I reduced the amount of data transferred on page load, removed one request (including the DNS and SSL overhead) and a large script that in large parts goes unused. My homepage now reaches 100 points in the PageSpeed Insights test.

With jQuery:

Google PageSpeed Insights score page for mobile devices with 98% score

Without jQuery:

Google PageSpeed Insights score page for mobile devices with 100% score

It's noticeable how Google assumes that mobile devices with their slower processors will take longer to parse the page and show stuff on the screen, when jQuery is linked, versus when it's not. Especially the time to Firs Meaningful Paint has been reduced by a second. The First Meaningful Paint indicates the point in time at which all visible elements and webfonts have been loaded and rendered. This metric is important not only for the user experience of a website, but also for rankings in search engines.

In tangible numbers, here's the timeline of loading the homepage:

With jQuery:

Google Chrome waterfall graph of the page loading process with jQuery. Finishes in 292ms

Without jQuery:

Google Chrome waterfall graph of the page loading process without jQuery. Finishes in 228ms

A last optimization I did was that I included webfonts as inline CSS in the <head> part of every page. Through http2 the webfonts are loaded in parallel with the rest of the pages now, and don't have to wait for main.css to load first. Aside from the 30KB saved from removing jQuery, I saved around 10% of loading time for newly arriving visitors (where the DNS lookup and SSL handshake has to be done) until everything is displayed on screen. When reloading the page, or visiting another page, the savings are slightly higher.

All in all nothing really necessary for my website, but I'm happy about the little 100 and the realization that jQuery thankfully is not really needed these days.

I think I'll try not to use jQuery in future projects. Can't hurt in any case.