Difference between revisions of "JavaScript 1 Fehlerbehandlung"

From Coders.Bay Wiki
Jump to navigation Jump to search
 
(25 intermediate revisions by 2 users not shown)
Line 4: Line 4:
Alle modernen Browser stellen ausgezeichnete Entwickler Tools zu Verfügung.
Alle modernen Browser stellen ausgezeichnete Entwickler Tools zu Verfügung.
*Öffnen der Entwickler Tools (in den gängigen Browsern):
*Öffnen der Entwickler Tools (in den gängigen Browsern):
**Right-Click und auf '''Untersuchen''' klicken, Keyboard Shortcut: '''STRG+Shift+I'''
**Rechts-Click und auf '''Untersuchen''' klicken, Tastaturkürzel: '''STRG + Shift + I'''
[[File:Screenshot-debugger-chrome.png|800px]]
[[File:Screenshot-debugger-chrome.png|800px]]
*Hier ein gutes Video zum JavaScript Debugging in Chrome
*Hier ein gutes Video zum JavaScript Debugging in Chrome
Line 48: Line 48:
*Gibt eine Nachricht auf der Web-Konsole aus.
*Gibt eine Nachricht auf der Web-Konsole aus.
*ist äußerst hilfreich beim Debugging
*ist äußerst hilfreich beim Debugging
*Vorteil zu alert: JavaScript Programm kann ohne Pausieren weiterlaufen (beim alert() Befehl stoppt das Programm)
*Vorteil zu alert: JavaScript Programm kann ohne Pausieren weiterlaufen (beim '''alert()''' Befehl stoppt das Programm)




Line 55: Line 55:
<pre>
<pre>


let test = "Hallo";
let testString = "Hallo";
console.log(test);
console.log(testString);


let obst = ["Apfel", "Banane", "Kiwi"];
let fruits = ["Apfel", "Banane", "Kiwi"];
console.log(obst);
console.log(fruits);
console.log(obst[1]);
console.log(fruits[1]);


let zahl = 10;
let number = 10;


console.log(`Meine Lieblingszahl ist ${zahl}`);
console.log(`Meine Lieblingszahl ist ${number}`);
</pre>
 
==JavaScript und der Webbrowser==
*JavaScript Events bieten die Möglichkeit auf Aktionen, die User im Browser durchführen, zu reagieren
**Wenn Anwender bestimmte Aktion durchführt, löst der Browser entsprechendes Event aus.
 
===Browser-Object-Modell BOM===
*Dient dazu, die grundlegenden Eigenschaften des Browsers zu steuern
*wird auch als Window-Objekt bezeichnet -> bezieht sich auf das Browser-Fenster
*alle globalen Objekte, Funktionen und Variablen sind teil des Window-Objektes
**auch das DOM (Document Object) ist eine Property des Window-Objektes
**Verfügt über grundlegende Eigenschaften des Fensters
***Fenstergröße festlegen (window.innerHeight, window.innerWidth)
***Ein Fenster öffnen '''window.open()'''
***Ein Fenster schließen '''window.close()'''
***Ein Fenster verschieben '''window.moveTo()'''
***Die Fenstergröße verändern '''window.resizeTo()'''
**alert()- und prompt()-Befehl gehören zum window-Objekt
**'''window-Objekt''' muss nicht ausdrücklich im Programm genannt werden ('''alert()''' ist eigentlich '''window.alert()''')
 
 
=====Liste der wichtigsten Browser-Events=====
*'''click''': Klick auf ein beliebiges Element
*'''contextmenu''': Klick mit der rechten Maustaste auf ein beliebiges Element
*'''mouseover''': Cursor wird auf ein Element bewegt
*'''mouseout''': Cursor wird von einem Element entfernt
*'''mousedown''': Maustaste wird gedrückt
*'''mouseup''': Maustaste wird losgelassen
*'''mousemove''': Maus wird bewegt
*'''dblclick''': Doppelklick auf das Element
*'''submit''': Formular wird abgeschickt
*'''focus''': Anwender setzt den Fokus auf ein Element
*'''keydown''': Drücken einer Taste auf der Tastatur
*'''keyup''': Loslassen einer Taste auf der Tastatur
*'''DOMContentLoaded''': Wird ausgelöst, wenn der HTML-Inhalt der Seite geladen ist
*'''transitioned''': Ende einer CSS-Animation
 
 
 
===Auf Events reagieren===
Wenn wir in JavaScript auf ein bestimmtes Event reagieren wollen, müssen wir einen Eventhandler registrieren.
 
 
====Beispiel 1 - Event Handler Attribut im HTML====
Durch das '''onclick''' Attribut wird ein Eventhandler hinzugefügt.
<pre>
<html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <input value="Hier klicken!" onclick="alert('Du hast den Button geklickt!')" type="button">
    </body>
</html>
</pre>
 
====Beispiel 2====
Hier wird bei '''onclick''' die Funktion "verdoppelung()" aufgerufen.
<pre>
<html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <input value="Hier klicken!" onclick="verdopplung()" type="button">
        <script>
            function verdopplung() {
                let zahl = prompt("Gib eine Zahl ein:");
                zahl *= 2;
                alert("Doppelter Wert: " + zahl);
            }
        </script>
    </body>
</html
</pre>
 
====Beispiel 3====
<pre>
<html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <p> Absatz 1</p>
        <p id="absatz">Absatz 2</p>
        <p>Absatz 3</p>
        <script>
            // Name des entsprechenden HTML-Elements nennen
            // nach dem Punkt folgt Art des Events mit vorangestelltem Präfix "on"
            // diesem Ausdruck dann eine Funktion zuweisen
            absatz.onmouseover = function() {
                alert("Hier befindet sich Absatz 2..");
            }
         
          // -------------------------------------
         
          // Variante 2
          function nachricht() {
              alert("Hier befindet sich Absatz 2..");
          }
          absatz.onmouseover = nachricht;
         
          // -------------------------------------
         
          // Variante 3
          function nachricht() {
              alert("Hier befindet sich Absatz 2..");
          }
          // Hier wird die Methode '''.addEventListener()''' verwendet.
          absatz.addEventListener("mouseover", nachricht);
        </script>
    </body>
</html>
</pre>
 
====Beispiel 4 - addEventlistener() Methode====
Die Methode benötigt zwei Parameter:
# die Art des Events auf das reagiert werden soll ("click", "mouseover", ...) -> '''Achtung:''' hier müsst ihr das "on" weglassen, statt "onclick" -> einfach "click"
# die Callback-Funktion, die aufgerufen werden soll. -> immer ohne () -> statt '''nachricht1()''' -> einfach '''nachricht1''';
* Event-Listener können mit '''.removeEventlistener()''' wieder entfernt werden
 
<pre>
<html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <button type="button" id="btn">Klick mich</button>
        <script>
            function nachricht1() {
                alert("Nachricht 1");
                btn.addEventListener("click", nachricht2);
                btn.removeEventListener("click", nachricht1);
            }
            function nachricht2() {
                alert("Nachricht 2");
                btn.addEventListener("click", nachricht1);
                btn.removeEventListener("click", nachricht2);
            }
            btn.addEventListener("click", nachricht1);
        </script>
    </body>
</html>
</pre>
 
===Event Bubbling===
Event Handling ist ziemlich einfach, solange es nur ein Element gibt. Jedoch was passiert, wenn mehrere Eventhandler auf mehreren verschachtelten HTML Elementen registriert sind? Es werden alle Eventhandler aufgerufen, und zwar in aufsteigender Reihenfolge. Zuerst wird der Event-Handler des Elements aufgerufen, dass in der HTML Struktur am tiefsten verschachtelt ist.
In unserem unteren Beispiel: <strong> -> <p> -> <div> -> <body>
 
<pre>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Event Bubbling</title>
</head>
<body>
    <div>
        Das ist ein div-Element
        <p>
            Hier steht ein Text, bei dem ein Teil
            <strong>Fett markiert</strong> ist.
        </p>
    </div>
 
<script>
 
    function bodyTag() {
        alert("Body-Tag");
        this.style.backgroundColor = 'green';
    }
 
    function divTag() {
        alert("Div-Tag");
        this.style.backgroundColor = 'yellow';
    }
 
    function pTag() {
        alert("P-Tag");
        this.style.backgroundColor = 'grey';
    }
 
    function strongTag() {
        alert("strong-Tag");
        this.style.backgroundColor = 'lightblue';
    }
 
    document.body.onclick = bodyTag;
    document.querySelector('div').onclick = divTag;
    document.querySelector('p').onclick = pTag;
    document.querySelector('strong').onclick = strongTag;
 
</script>
</body>
</html>
</pre>
 
'''Hilfestellung dazu:''' https://www.mediaevent.de/javascript/event-handler-default-verhindern.html
b
<pre>
<body id="bodypoint">
        <div>
            <p>Absatz 1</p>
            <p>
                Hier steht ein Text, bei dem ein Teil
                <strong>Fett markiert</strong> ist.
            </p>
            <p>Absatz 3</p>
        </div>
        <script>
            function hintergrund() {
                // target = Zielelement auf das in diesem Beispiel geklickt wird
                // closest = gibt das Element mit der entsprechenden Bezeichnung
                // zurück, das das auslösende Element umfasst
                let p = event.target.closest('p');
                p.style.backgroundColor = 'green';
            }
            bodypoint.onclick = hintergrund;
        </script>
    </body>
</pre>
 
===Mouse- und Keyboard-Events===
*'''onClick''' - eigentlicher Mausklick (ist eine Kombination aus '''onMouseDown''' und '''onMouseUp''')
*'''onMouseDown''' - wenn Maustaste gedrückt wird
*'''onMouseUp''' - wenn Maustaste losgelassen wird
 
 
====Beispiel 1====
<pre>
<body>
    <input value="Hier klick" id="btn" type="button">
    <script>
        function click() {
            alert("Click-Event");
        }
        function mdown() {
            alert('Mousedown-Event');
        }
        function mup() {
            alert("Mouseup-Event");
        }
        btn.onclick = click;
        btn.onmousedown = mdown;
        btn.onmouseup = mup;
    </script>
</body>
</pre>
 
====Beispiel 2====
<pre>
<body>
    <input id="eingabe" type="input">
    <script>
        function tastatureingabe(e) {
            alert("Key: " + e.key + "\nCode: " + e.code);
        }
        eingabe.onkeypress = tastatureingabe;
    </script>
</body>
</pre>
 
 
===Das window-Objekt===
*Grundlage aller weiteren Objekte in JS, daher auch root-Objekt genannt
*Beispiele: alert-, confirm-,prompt-Befehl
*Der confirm-Befehl gibt ein true oder false zurück
 
<pre>
    let zahl = prompt("Gib eine Zahl ein");
    alert("eingegebene Zahl: " + zahl);
    let bestaetigung = confirm(decodeURI("Bestätige die Eingabe"));
    if(bestaetigung) {
        document.write("Eingabe bestätigt");
    } else {
        document.write("Eingabe nicht bestätigt");
    }
</pre>
 
 
====Fenster schließen und neue Fenster öffnen====
*Verhalten nicht vorhersehbar da Befehle bei vielen Browsern starken Einschränkungen unterliegen
*Weitere Befehle:
**window.resizeTo()
**window.resizeBy()
**window.moveTo()
**window.moveBy()
 
<pre>
<!-- Hauptseite -->
<script>
    window.open("stop.html");
</script>
 
 
<!-- stop.html -->
<script>
    window.alert("Stop");
    window.close();
</script>
 
 
<!-- Höhe und Breite abfragen -->
<script>
    let hoehe = window.innerHeight;
    let breite = window.innerWidth;
    document.write(hoehe + "px Höhe<br>" + breite + "px Breite");
</script>
</pre>
 
 
====Den zeitlichen Ablauf steuern====
*Zeitverzögerung durch '''setTimeout()'''
 
====Beispiel 1====
<pre>
//HMTL:
<button onclick="start()">Start</button>
 
//JavaScript:
<script>
    function nachricht() {
        alert("Button vor 2 Sekunden gedrückt");
    }
    function start() {
        setTimeout(nachricht, 2000);
    }
</script>
</pre>
 
====Beispiel 2====
<pre>
//HMTL:
<button onclick="start()">Start</button>
 
//JavaScript
<script>
    function nachricht() {
        alert("Button vor 2 Sekunden gedrückt");
    }
 
    function nachricht2() {
        alert("Button vor 4 Sekunden gedrückt");
    }
 
    function start() {
        setTimeout(nachricht, 2000);
        setTimeout(nachricht2, 4000);
    }
</script>
</pre>
 
====Beispiel 3====
<pre>
//HTML
<button onclick="start()">Start</button>
<button onclick="stop()">Stop</button>
 
//JavaScript
<script>
    let to;
    function f() {
        alert("Button vor 5 Sekunden gedrückt");
    }
    function stop() {
    // Mit clearTimeout() kann Timeout unterbrochen werden
        clearTimeout(to);
    }
    function start() {
        to = setTimeout(f, 5000);
    }
</script>
</pre>
 
====Beispiel 4====
<pre>
<script>
    let i = 1;
    function f() {
        document.write(i + "<br>");
        i++;
    }
    // setInterval() ähnlich, Programm ruft
    // entsprechende Funktion immer wieder
    // aufs Neue auf
    setInterval(f, 1000);
</script>
</pre>
 
<blockquote>
Quelle: JavaScript
Programmieren für Einsteiger
ISBN: 978-3-96645-016-4
</pre>
</pre>

Latest revision as of 10:50, 16 May 2022

Fehlerbehandlung[edit]

The debugger is your friend[edit]

Alle modernen Browser stellen ausgezeichnete Entwickler Tools zu Verfügung.

  • Öffnen der Entwickler Tools (in den gängigen Browsern):
    • Rechts-Click und auf Untersuchen klicken, Tastaturkürzel: STRG + Shift + I

Screenshot-debugger-chrome.png

Try, Catch[edit]

Ausnahmen für Laufzeitfehler erstellen:


  • Im try-Block versucht das Programm die gewünschte Aktion auszuführen
  • Ein try-Block darf niemals allein stehen. Es muss sich ein catch-Block anschließen
  • Bei Laufzeitfehler, erzeugt JavaScript automatisch ein "Error" Objekt, das Details zum auftretenden Problem enthält (siehe 2. catch-Block im Beispiel unten:)


"use strict";

let a = 1.123456789123456789123456789;
let x = prompt("Wie viele Stellen sollen angezeigt werden?");
try {
    // reduziert die Anzahl der Nachkommastellen auf die Zahl
    // die der User eingibt
    let b = a.toPrecision(x);
    document.write("Wert mit der gewünschten Präzision: " + b + "<br>");
}
catch {
    alert("Gib einen Wert zwischen 1 und 100 ein!");
}
document.write("Weitere Inhalte");


//Alternative für catch Block
//Mit err kann auf das Fehler-Objekt zugegriffen werden, Attribute name ist die Bezeichnung des Fehlers
//Attribut message ist die Fehlermeldung

catch(err) {
    alert(err.name);
    alert(err.message);
}

console.log() is your friend[edit]

  • Gibt eine Nachricht auf der Web-Konsole aus.
  • ist äußerst hilfreich beim Debugging
  • Vorteil zu alert: JavaScript Programm kann ohne Pausieren weiterlaufen (beim alert() Befehl stoppt das Programm)


Beispiele für console.log():


let testString = "Hallo";
console.log(testString);

let fruits = ["Apfel", "Banane", "Kiwi"];
console.log(fruits);
console.log(fruits[1]);

let number = 10;

console.log(`Meine Lieblingszahl ist ${number}`);