Erweiterungen mit JavaScript
Überblick
Mit Hilfe von JavaScript können Webseiten durch interaktive und dynamische Effekte erweitert werden. Die Skriptsprache wird von allen üblichen Browsern ohne nötige Erweiterungen unterstützt.
Wichtiger Hinweis zur Barrierefreiheit
Bei der Erstellung von interaktiven und veränderlichen Komponenten sollten Hinweise zur Barrierefreiheit beachtet werden.
Um eigenen JavaScript Code in Ihre Seite einzubinden, können Sie die
Rahmen-Variable $javascript
nutzen, welche ihren Code
im Kopf des Dokuments einfügt.
$javascript[] = "beispiel/code.js";
Einführung in die Erstellung von JavaScript-Code zur DOM-Manipulation
Diese Einführung soll zeigen, dass es mittlerweile sehr leicht möglich ist JavaScript ohne ein Framework, wie zum Beispiel jQuery, zu verwenden. Diese Art der Verwendung, bietet nicht nur den Vorteil, dass die Ausführung schneller ist, sondern auch Unabhängigkeit von externen Ressourcen. Diese verlangsamen das Laden der Seite und stellen potenzielle Fehlerquellen dar, zum Beispiel bei unvollständigem Laden der Seite.
Wenn Sie gar kein Grundwissen über JavaScript verfügen, bieten die "Mozilla Developer Network (MDN) Web Docs" eine gute Einführung [en]. Weitere gute Tutorials bieten auch die Seiten von selfhtml.
Migration zu jQuery unabhängigen Skripten
Falls Scripte so umgeschrieben werden sollen, dass diese auch ohne die jQuery-Bibliothek funktionieren, kann die Seite You might not need jQuery [en] Alternativen zu den jQuery-Funktionsaufrufen bieten.
Hinweis zur Kompatibilität
JavaScript ist eine Skriptsprache und muss daher – bei jedem Aufruf neu – vom Browser interpretiert werden. Die Kompatibilität des geschrieben Codes mit dem jeweils verwendeten Browser ist keine Selbstverständlichkeit. Daher sollten die verwendeten Funktionen immer mit einer Kompatibilitätsliste abgeglichen werden, um möglichst viele Browser zu unterstützen. "Can I Use…?" [en] und die "MDN Web Docs" [en] sind dabei hilfreiche Ratgeber.
Selektoren – DOM-Knoten selektieren
Prinzipiell können Elemente (bzw. DOM-Nodes) ebenso wie mit CSS selektiert werden. Aus Gründen der Performance sollte jedoch versucht werden sich auf Klassen oder IDs zu beschränken.
Selektion eines Elementes anhand seiner ID (hier id
):
var elementWithId = document.getElementById('id');
Bei der Auswahl von Elementen anhand einer Klasse
ist der Rückgabewert immer in Form eines Arrays, da – anders als
bei IDs – Klassen mehrmals vergeben werden dürfen. Ist man sich sicher,
dass nur ein Element mit der angegebenen Klasse existiert, kann man
einfach das erste Element des Arrays speichern. Ebenso verhält es sich
bei der Auswahl von Elementen anhand ihres HTML-Tags mit
getElementsByTagName
.
Die Reihenfolge der Elemente im Array ist immer die gleiche wie die
Reihenfolge der entsprechenden DOM-Knoten im DOM.
Selektion eines Elementes anhand seiner Klasse (hier klasse
):
// Auswahl mehrerer Elemente anhand ihrer Klasse
var elementsWithClass = document.getElementsByClass('klasse');
// Selektion der ersten Auswahl
var firstElementWithClass = document.getElementsByClass('klasse')[0];
// Auswahl anhand des HTML-Tag
var elementsWithTag = document.getElementsByTagName('p');
Wenn Elemente mit einem CSS ähnlichen Selektor ausgewählt werden sollen
gibt es zwei Möglichkeiten. Zum einen querySelector
,
welcher den ersten Treffer zurück gibt, und zum anderen querySelectorAll
,
welcher alle Treffer zurück gibt.
Mehr zu möglichen Selektoren finden Sie im Kapitel
CSS Selektoren der MDN Web Docs [en]
.
Selektion eines Elementes anhand seiner ID und Klasse (hier id
und klasse
):
// Auswahl eines Elementes mit Query-Selektor
var firstElementWithQuery = document.querySelector('#id.klasse');
// Auswahl mehrerer Elemente
var elementWithQuery = document.querySelectorAll('#id.klasse');
Um ein Element oder mehrere Elemente auf der ganzen Seite zu selektieren
verwendet man – wie oben beschrieben – die jeweiligen Methoden des
document
. Hat man ein Element ausgewählt und zwischengespeichert,
kann man in seinen Kindknoten eine weitere Selektion vornehmen und so
die Auswahl verkleinern und somit erleichtern.
Selektion in den Kindknoten eines bereits ausgewählten Elementes:
// Auswahl aller <p> Elemente in firstElementWithQuery
var allPTags = firstElementWithQuery.getElementsByTagName('p');
Nicht vorhandene Elemente
Falls zu den angegebenen Selektoren keine bzw. kein DOM-Knoten
gefunden werden kann, gibt die jeweilige Funktion null
zurück. Daher sollte bei der weiteren Verwendung überprüft werden,
ob die Variable einen anderen Wert als null
hat.
Manipulation
Klassen
Klassen bieten eine einfache Möglichkeit sowohl Elemente zu selektieren
als auch über vorher definierte CSS Regeln das Aussehen von Elementen
zu verändern.
Um mit den Klassen eines Elementes zu operieren bietet sich das
classList
Attribut an.
Rückgabe aller Klassen die das Element exampleDiv
besitzt (als Array):
// Selektion des "exampleDiv"
var exampleDiv = document.getElementByID('example');
// Speichern aller Klassen des "exampleDiv"
var exampleDivClasses = exampleDiv.classList;
Hinzufügen einer Klasse:
exampleDiv.classList.add('testKlasse');
Entfernen einer Klasse:
exampleDiv.classList.remove('testKlasse');
Überprüfen ob Element Klasse besitzt:
if (exampleDiv.classList.contains('testKlasse')) {
console.log('Besitzt Klasse!');
}
CSS-Eigenschaften
Generell sollten Styles zwar mittels CSS
definiert werden, sollte es aber vorkommen, dass es nötig ist, diese
direkt für ein Element zu definieren bieten sich die Methoden des
style
Attributes an. Damit kann man jede im Browser
mögliche Style Information festlegen.
Setzen, speichern und entfernen der Hintergrundfarbe:
exampleDiv.style.setProperty('background-color', '#00FF00');
var exampleDivBackgroundColor = exampleDiv.style.getPropertyValue('background-color');
exampleDiv.style.removeProperty('background-color');
Knoten-Attribute
Beim Umgang mit Attributen gibt es die vier grundlegenden Funktionen
getAttribute
, setAttribute
, removeAttribute
und hasAttribute
.
Um eine komplette Liste der Attribute zu erhalten kann man das attributes
Attribut eines selektierten Elementes verwenden.
Überprüfen ob ein Element ein Attribut besitzt und anschließendes entfernen:
if (exampleDiv.hasAttribute('hidden')) {
exampleDiv.removeAttribute('hidden');
}
Werden eigene Attribute benötigt z. B. um Daten an ein Element zu binden
bieten die data-*
Attribute einen Weg dies mit validem
HTML umzusetzen. Neben den Attributfunktionen kann dann das
dataset
Attribut eines selektierten Elementes verwendet
werden um Inhalt anzufügen oder auszulesen.
Auslesen und setzen von data
Attributen:
exampleDiv.dataset['time'] = Date.now();
console.log('Im Element wurde folgende Zeit gespeichert:', new Date(exampleDiv.dataset['time']));
Das HTML Element mit data
Attribut im DOM:
<div id="example" data-time="1581340000000"></div>
Dynamische Funktionalitäten
Events
Um Aktionen beim Anklicken oder anderen Nutzerinteraktionen auszuführen kann man Events an selektierte Elemente binden. Je nach selektiertem Element gibt es unterschiedliche Event-Typen, in den MDN Web Docs können Sie eine vollständige Übersichtsseite über alle Event-Typen finden. Übliche Events sind:
-
click
: Kann auf fast jedes Element angewandt werden und wird ausgelöst wenn der Nutzer auf das selektierte Element klickt. -
scroll
: Kann auf jedes Element mit "overflow" angewandt werden und wird ausgelöst wenn der Nutzer scrollt. -
focus
: Kann auf jedes fokussierbares Element angewandt werden und wird ausgelöst sobald der Nutzer das Element fokussiert.
Setzen eines Klick-Events auf ein <div>
:
exampleDiv.addEventListener('click', function(event) {
// Aktionen wenn das Element geklickt wurde
});
Soll zum Beispiel die Standardaktion beim Klicken eines
Buttons unterbunden werden, muss die
preventDefault
Funktion des Events
ausgeführt werden.
exampleButton.addEventListener('click', function(event) {
event.preventDefault();
// Aktionen wenn das Element geklickt wurde
});
Falls zu einem späteren Zeitpunkt das Event wieder entfernt werden soll, muss die Event-Funktion vorher gespeichert werden.
function buttonClickFunction(event) {
event.preventDefault();
// Aktionen wenn das Element geklickt wurde
}
exampleButton.addEventListener('click', buttonClickFunction);
exampleButton.removeEventListener('click', buttonClickFunction);
Zeitpunkt der Ausführung
Gerade bei der Manipulation von DOM-Knoten ist es erforderlich, dass
der DOM vollständig vom Browser geladen und berechnet ist. Nur dann
ist gewährleistet, dass alle benötigten Elemente per JavaScript
selektiert und verändert werden können.
Um den richtigen Zeitpunkt der Ausführung des eigenen
Codes zu finden kann man folgende
Hilfsfunktion verwenden:
function executeWhenReady(callback) {
if (
document.readyState === 'complete' ||
document.readyState === 'interactive'
) {
// falls Dokument vollständig geladen & interpretiert rufe callback auf
setTimeout(callback, 1);
} else {
// falls nicht, binde callback an das Ladeevent
document.addEventListener('DOMContentLoaded', callback);
}
}
Diese Funktion führt die übergebene Funktion direkt aus, wenn
der DOM bereit ist und falls nicht, sobald das
DOMContentLoaded
Event
ausgelöst wurde.
Setzen der Hintergrundfarbe wenn der DOM vollständig geladen ist:
executeWhenReady(function() {
exampleDiv.style.setProperty('background-color', '#00FF00');
// weitere Operationen die auf den vollständig
// interpretierten DOM angewiesen sind …
});
jQuery Erweiterung
Webautoren können mit Hilfe der JavaScript-Bibliothek jQuery ziemlich einfach und browserübergreifend dynamische Effekte auf Webseiten programmieren oder Webanwendungen komfortabler gestalten. Des Weiteren bietet jQuery eine einfache Möglichkeit der Selektion von HTML-Elementen und erweitert JavaScript für die Manipulation durch einige nützliche Hilfsfunktionen. Für die Verwendung von jQuery wird mit TUCAL eine stabile Version dieser Bibliothek eingebunden.
Da die Möglichkeiten von jQuery sehr sehr vielfältig sind, sollte für
eine vollständige Beschreibung aller Funktionen ein Blick in die
offizielle Dokumentation
geworfen werden.
jQuery-Datepicker – Datumsauswahl
Im Zuge der Umstellung auf die jQuery-Version 3 wurde der in jQuery-UI enthaltene Datepicker ersetzt. Die dazugehörige Dokumentation befindet sich nun auf der Seite der Erweiterungsmodule.
Wichtiger Hinweis zur API-Version
Beim Erstellen von Scripten sollte darauf geachtet werden, dass die verwendeten Bibliotheksaufrufe zu jQuery 3.4 und späteren Versionen kompatibel sind!
Notation
Um HTML-Elemente zu selektieren wird folgende Syntax verwendet:
// entweder
jQuery(selektor)
// oder
$(selektor)
An selektierten Elementen können dann Funktionen angewandt werden:
$('div.beispiel').removeClass('beispiel');
Ausführung erst bei vollständig geladener Seite
Ein grundsätzliches Problem beim Schreiben von JavaScript Code ergibt sich aus dem Zeitpunkt der Ausführung. Damit gewährleistet ist, dass das HTML-Dokument vollständig geladen und somit alle benötigten Elemente vorhanden sind und angezeigt werden, bevor die Scripte ausgeführt werden, stellt jQuery bereits eine Methode zur Verfügung. Deshalb muss dafür nicht noch eine eigene Funktion definiert werden:
$(function() {
// restlicher Code …
});
jQuery konfliktfrei verwenden
Falls weitere Bibliotheken eingebunden werden, kann es zu Konflikten
mit der von jQuery reservierten Variable $
kommen.
Daher bietet jQuery die Funktion
noConflict()
an, mit der die Variable $
entbunden werden kann.
$.noConflict();
// jQuery kann dann weiter mit "jQuery" aufgerufen werden, z. B.:
jQuery(function() {
var test = jQuery('div.beispiel');
});