Introduction ============ * 3 Schichten; HTML (semantisch), CSS (Layout), JavaScript (funktional) * Über Konsole ist alles erreichbar -> sensible Daten gehören nicht ins Front-End * Front-End JavaScript hat keinen Zugang zum Dateisystem, nur zur DOM Geschichte von JavaScript ------------------------- * 1995: Sprache schaffen zum Einbinden von JavaApplets in Netscape Navigator Mocca -> LiveScript -> JavaScript * 1996 Internet Explorer: JScript -> doppelter Aufwand für Programmierer * ECMA wollte einheitlichen Standard schaffen -> Wie soll was funktionieren? -> ECMA Script -> ES (derzeit ES6) * Macromedia half bei Einführung von ES4 (ActionScript) -> wurde zu ES5 * 2015: ES5 -> ES6 war großer Schritt (Vereinfachung) -> "bestes ES seit ES3" * erst seit IE tot war, war der Weg frei für ES6 (keine "Polyfills" mehr -> dem Browser Funktionalität beibringen, die es noch nicht kann) ES5 noch immer stark verbreitet (oft gemischt mit ES6) * seitdem jährlicher ECMA Release, aber Änderungen nicht in jedem Browser verfügbar (nur Kern ist garantiert) -> JS stets auf unterschiedlichen Browsern testen: Chrome, Firefox, Safari, Opera, Edge JavaScript mit VS Code ---------------------- .. note:: VS Code ist in JavaScript mit Hilfe von Node.JS geschrieben (daher Einstellungen in JSON Format) **Empfohlene Extensions** * `Auto Rename Tag`_ * `ESLint`_ * `German Language Pack for Visual Studio Code`_ * `Live Server`_ -> Ansicht im Browser (NodeJS Express Server), Änderungen im Browser ohne Reload, Ajax .. attention:: *Live Server* benötigt für jedes Projekt einen eigenen Ordner Jeden Tag * ein neues Projekt * Unterlagen werden vom Dozenten hochgeladen .. _Auto Rename Tag: https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag .. _ESLint: https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint .. _German Language Pack for Visual Studio Code: https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-de .. _Live Server: https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer Einbinden von JavaScript ------------------------ HTML Grundgerüst über *emets* (bei VS Code): >>> html >>> ! JavaScript direkt ins HTML `````````````````````````` -> gilt nur für diese eine Seite .. code-block:: html Verweis auf externe JS Datei in HTML ```````````````````````````````````` .. code-block:: html --> ``script.js`` wird hier eingelesen --> Datei überschreibt explizites JS falls hier zusätzlich (hier: alert) definiert --> Pfad stets relativ zur HTML Datei Asynchrones Laden ````````````````` Interpreter wartet nicht auf vollständiges Laden des Skripts .. code-block:: html ``defer`` Skripte dürfen erst ausgeführt wenn DOM fertig geladen ist: .. code-block:: html * ``async`` bedeutet, dass das Skript parallel zum Parsen des Dokuments geladen wird * ``defer`` bedeutet, dass das Script erst nachdem das Dokument geparst wurde, geladen wird Beste Möglichkeit: Skript ans Ende des HTML packen So erspart man sich ``async`` und ``defer`` oder es macht nichts, wenn man diese aus Versehen vergisst. .. code-block:: html
// the entire body Dadurch sollten alle Elemente im DOM sein. Mehrere Skript-Tags mit Dateien in ein HTML Seite einfügen: .. code-block:: html // the entire body Dabei werden in dieser Reihenfolge abgearbeitet -> darauf achten Strict-Mode =========== Generell eine gute Idee, besonders zum Lernen. - Teilmenge von JS - performanter - **jeder** (Syntax-)Fehler wird angezeigt - wird z.B. bei JQuery immer angewandt (automatisch) - jeder moderne Browser unterstützt diesem Modus über .. code-block:: javascript 'use strict'; zu Beginn eines Dokuments. Kommentare ========== .. code-block:: javascript // einzeiliger Kommentar /* mehrzeiliger Kommentar */ Schreibregeln & Konventionen ============================ Bei JavaScript - gilt case sensitive (username != USERNAME) - beginnt Zählung bei 0 - gilt englische Schreibweise (Dezimaltrennzeichen = ``.`` nicht ``,``) Nicht relevant für Interpreter, aber Programmierer, dient der Lesbarkeit von Code - ein Statement pro Zeile - jede Zeile mit Semikolon beenden (obwohl nicht notwendig) - Bezeichner sollten sprechend sein (keine Chiffren) **Regeln für Bezeichner** - beginnt mit einem Buchstaben, Underscore, Dollar-Zeichen oder Hashtag (jedoch haben diese oft andere Konventionen) - danach sind auch Ziffern erlaubt - sonst keine Sonderzeichen und Umlaute - keine Leerzeichen - keine reservierten Wörter verwenden (https://www.w3schools.com/Js/js_reserved.asp) - keine Bezeichner von vordefinierten Funktionen oder Objekten verwenden **Konventionen für Bezeichner** - für Variablen, Konstanten und Funktionen: lower camel case (lowerCamelCase) - für Konstruktor-Funktionen: upper camel case (UpperCamelCase) - für Konstanten zur Konfiguration: screaming snake case (SCREAMING_SNAKE_CASE) Anweisungsblöcke {} zum Gruppieren mehrerer Anweisungen: .. code-block:: javascript if (true) { var x = 2; let y = 2; } -> Interpreter weiß, dass alle Anweisungen gemeinsam ausgeführt werden müssen Vordefinierte Funktionen ======================== .. code-block:: javascript // Basics alert("Hi"); // pausiert das Skript, User muss Alert-Dialog bestätigen, um fortzusetzen confirm("Bist du sicher?"); // pausiert das Skript, User kann mit 'OK' True zurückgeben oder mit 'Cancel' False prompt("Wer bist du?", "Niemand"); // Zeigt Eingabefenster (mit Standardwert) -> gibt 'null' (Cancel) oder String mit Eingabe zurück (OK, falls leere Eingabe ->