jQuery
Bibliothek für JavaScript zur Vereinfachung (nutzt selbst JavaScript). Mittlerweile durch Aufgreifen in ES6 immer weniger im Einsatz. Der Einsatz von jQuery schafft viele Möglichkeiten, geht aber zu Lasten der Performance. Es muss stets die gesamte Library geladen werden, obwohl meistens nur kleine Teile der Bibliothek verwendet werden.
Es konnte sogar fertige Programme (Plugins) in ein JavaScript eingefügt werden. Möglichkeit, diese ohne viel Aufwand einzusetzen. Es gab jedoch Inkompatibilitäten, wenn mehrere Plugins gleichzeitig verwendet wurden.
jQuery besteht rein aus Funktionen welche Objekte zurückgeben. Die Aufrufe lassen sich verketten.
*.min.js ist eine minimierte Version der Bibliothek, die vom Browser schneller
zu Laden ist. jQuery arbeitet im strikten Modus, "use strict" muss also
beim Einsatz also nicht mehr selbst angegeben werden (gilt global).
jQuery ist abwärtskompatibel, man versucht also auch ältere JavaScript
Versionen zu unterstützen (man sieht daher oft ältere Syntax z.B. var im Code).
Integration von jQuery in HTML:
<head>
<!-- ... -->
<script src="./libs/jquery-3.7.1.min.js"></script>
</head>
jQuery sollte nicht innerhalb des <body> geladen werden, sondern stets
im <head>.
Important
jQuery sollte stets auf dem eigenen Server liegen und nicht von einem externen Server geladen werden. Generell sollten alle externen Bibliotheken stets auf dem eigenen Server bereitgestellt werden, damit keine Zugriffe auf Bibliotheksseiten und Verletzung des Datenschutzes passieren (oder, falls dies nicht möglich ist, sollte der Nutzer zuerst um Erlaubnis gefragt werden).
Selektoren
$()jQuery()
Beide arbeiten gleich, jedoch ist das $ häufig von anderen Frameworks bereits
in Verwendung und erzeugt einen Konflikt bei dem Versuch der Mehrfachverwendung.
Der konfliktlose Modus ermöglicht über
jQuery.noConflict();
dass das Dollarzeichen nicht mehr eingesetzt werden kann.
Aufruf von jQuery Funktionen
Wird jQuery eingesetzt, muss sich der JS-Code innerhalb einer jQuery Funktion befinden.
Alter Weg (vor HTML 5): einleitender Handler, der darauf wartet, dass DOM fertig geladen
$(document).ready(function() { jQuery-Statements });
Neuer Weg:
jQuery( function() {} );
Beispiel (über $()):
$( function() {
console.log($("#url_llink"));
console.log(document.querySelector("#url_link"));
})
Elemente werden in einem “jQuery”-Objekt zurückgegeben.
Auf HTML-Attribute zugreifen
Über [elem].attr() lässt sich auf ein Attribut eines HTML Elements zugreifen.
Hint
Der Rückgabewert eines Queries ist ein Object, welcher potentiell mehrere
dem Query zutreffende HTML Elemente enthalten könnte. Die selektierten
Elementen befinden mit nummerierten String Keys in (“0”, “1”, … - das erste
Match hat die “0”). Beim Zugriff über [0] wird die Zahl in einen String
implizit umgewandelt und auf das Element zugegriffen.
console.log($("#url_llink")); // das Objekt wird zurückgegeben
console.log(document.querySelector("#url_link"));
console.log($("#url_link")[0] == document.querySelector("#url_link")); // true
console.log($("#url_link")[0]);
// auf HTML-Attribute zugreifen
let link = $("#url_link");
console.log(link.attr("title")); // Attribut ausgeben
console.log(link.attr("title", "Ab jetzt mit jQuery")); // Attribut setzen
console.log(link.attr("title"));
// mehrere Attribute gleichzeitig verändern
link.attr({
title: "jQuery",
href: "https:/jquery.com"
});
Über [elem].removeAttr() wird ein Attribut entfernt:
// Attribute entfernen
console.log(link.removeAttr("title")); // Selektion wird im Objekt zurückgegeben
console.log(link.attr("title")); // undefined
Über [elem].html() wird auf den HTML-Inhalt (inkl. Markups) eines Elements
zugegriffen:
// Zugriff auf Content
let contentH1 = $("h2").html();
console.log(contentH1); // "Inhaltsverzeichnis"
// lesend wird NUR Content des 1. selektierten Elements zurückgegeben
// es hat sich erwiesen das mehr i.d.R. nicht gebraucht wird
let contentP = $("p").html();
console.log(contentP); // "Hey"
// Beim Schreiben werden ALLE selektierten Elemente überschrieben
$("h1").html(contentP); // --> Hey
$("p").html(contentP); // alle p-Elemente --> Hey
Important
Die jQuery-Methoden sind auf Ebene des Objekts, nicht auf den Elementen innerhalb des Objekts. Sind mehrere Elemente im Objekt, werden diese in jQuery in einer Schleife durchlaufen –> es bedarf keiner Schleife in JavaScript um z.B. alle Elemente zu überschreiben.
Über [elem].text() wird auf den HTML-Text (ohne Markups) eines Elements
zugegriffen:
// Content ohne Markups
// lesend werden ALLE selektierten Elements zurückgegeben (im Gegensatz zu .html())
$("p").first().text("<b>Content ohne Markups<(p>");
console.log($("p").text()); // "<b>Content ohne Markups<p>HeyHeyHeyHeyHey"
// ebenso schreibend!
Selektion eingrenzen
Hint
Ältere jQuery-Versionen
:first 1. Element
:last letztes Element
:even alle Elemente an geraden index-Positionen
:odd alle Element an ungerade index-Positionen
:eq(index) Element an übergebener index-Position
:lt(index) Elemente mit niedrigeren als übergebener index-Position
:gt(index) Elemente mit höherer als übergebener index-Position
:nth-of-type(position) Element an Position index + 1
Über $("<tag>:<Eingrenzung>") lässt sich die Selektion eingrenzen.
// Selektion eingrenzen
$("p:first").html(contentH1);
console.log($("p"));
console.log($("p:first"));
Mittlerweile bietet jQuery Selektions-Methoden.
Über [object].first() lässt sich nur das erste Element im Objekt ausgeben:
$("p").first().html(contentH1);
Über [object].last() lässt sich nur das letzte Element im Objekt ausgeben:
$("p").last();
Über [object].eq(index) wird Element an index-Position zurückgegeben:
$("p").eq(2);
Über [object].even(index) werden alle Elemente an geraden index-Position zurückgegeben:
$("p").even();
Über [object].odd(index) werden alle Elemente an ungeraden index-Position zurückgegeben:
$("p").odd();
Über [object].<some_selector>.end() wird eine Unterselektion aufgehoben und
der vorherige Selektion von zutreffenden Elementen zurückgegeben:
$("p").first().end(); // gibt alle <p> Elemente zurück (hebt first() Selektion auf
console.log($("p").first().end().is($("p"))); // true
// Kann auch verkettet werden
$("p").first().end().last(); // gibt letztes <p> Elemente zurück
Hint
Die [match_result].is(selector) Methode vergleicht die Elemente von match_result
zu denen eines selector.
Über [object].has(selector) werden nur die Elemente einer Selektion zurückgegeben,
welche einem weiteren Selektor entsprechen:
$("li").has("#"); // gibt li-Elemente zurück, welche ul-Kinder haben
Über [object].filter(selector) lassen sich die Elemente im Objekt filtern:
$("li").filter(".firstElement");
Über [elem].not(selector) lassen sich Elemente filtern, welche das Kriterium
nicht erfüllen:
$("li").not(".firstElement");
Über [elem].slice(startIndex, endIndex) wird ein Objekt zurückgegeben welches
nur ein Teil der ursprünglichen Menge an Elementen hat. Der endIndex ist
in der Rückgabe nicht enthalten:
$("p").slice(1,4);
Elemente oder DOM-Strings im DOM integrieren
Über [object].<INTEGRATION_METHOD> wird ein weiteres HTML-Element an einer Stelle
in allen Elementen im Objekt angewandt:
.before(): Das Element wird außerhalb des Elements vor das selektierte Element gestellt.prepend(): Das Element wird an den Anfang des selektierten Element gestellt.append(): Das Element wird an das Ende des selektierten Element gestellt.after(): Das Element wird außerhalb des Elements nach das selektierte Element gestellt
// Elemente || DOM-Strings im DOM integrieren
// Hint: Methoden werden auf ALLE Elemente im Objekt angewandt!
let elem = $(".element");
elem.before("<p>before Text</p>");
elem.prepend("<p>prepend Text</p>");
elem.append("<p>append Text</p>");
elem.after("<p>after Text</p>");
Inline-Styles setzen & auslesen
Über [object].css("some-style") können Inline-Styles aus dem ERSTEN Element
im Objekt ausgelesen werden. Wenn ein expliziter Style dafür vorliegt, wird dieser
zurückgegeben, ansonsten der berechnete Style.
// Style des 1. Elementes wird ermittelt
console.log($("p").css("font-size")); // "16px"
Über [object].css("some-style", "some-value") wird ein Inline-Style an ALLE
Elemente im Objekts zugewiesen:
// Einen Style setzen
$("p").css("background-color", "blue");
console.log($("p").css("background-color")); // rgb(0, 0, 255)"
// Mehrere Styles setzen
$("p").css({
backgroundColor: "orange",
"font-size": "20px",
padding: "10px 20px",
border: "1px solid green"
})
Element-Klassen
Alle unten stehende Methoden (bis auf hasClass()) geben das neue Objekt zurück.
Über [object].addClass() lassen sich auf alle Elemente im Objekt ein
weiterer Klassennamen anfügen (arbeitetet im Hintergrund mit classList.add()).
$("p").addClass("fehler");
Über [object].removeClass() wird ein Klassennamen für alle Elemente im Objekt
entfernen:
$("p").removeClass("fehler");
Über [object].toggleClass() wird ein Klassennamen für alle Elemente im Objekt
falls nicht vorhanden, hinzugefügt, ansonsten entfernt:
$("p").toggleClass("fehler");
Über [object].hasClass() wird je Element im Objekt ein Boolean zurückgegeben,
welcher besagt ob dieses Element eine Klasse hat oder nicht (jQuery handelt die
Schleife):
if($("p").hasClass("fehler")) $("p").toggleClass("fehler");
Hier wird für alle p-Elemente ermittelt ob sie die Klasse "fehler" haben.
Falls ja, wird diese über toggleClass() entfernt.
Events
Über [object].on("event", function) wird ein Event-Listener registriert.
$("p").on("click", function() {
alert("Da hat was geklickt!");
});
// Event-Handler werden NICHT überschreiben (wirkungslos)
$("p").on("click", function() {
alert("Da hat doch wirklich was geklickt!");
});
Hint
Früher gab es mouseover und mouseout, statt der neueren on Funktion.
Über [object].off("event") werden alle Event-Listener, welche auf diesem
Event registrieren, entfernt (de-registriert).
$("p").off("click");
Important
Bei JavaScript ist das nicht möglich, weil hier eine Referenz auf das Element mit übergeben werden muss. Bei jQuery verzichtet man auf diese Referenz und wendet die De-Registrierung auf alle Elemente im Objekt an.
Um auf this zuzugreifen, muss es zunächst in ein Objekt überführt werden
(über $(this)), um mit jQuery-Methoden zu arbeiten:
$(".bild").on("mouseover", function() {
$(this).attr("src", "./img/2.jpg");
});
$(".bild").on("mouseout", function() {
$(this).attr("src", "./img/1.jpg");
});
Important
Verkettung von jQuery-Methoden
Die on Methode liefert abermals das veränderte Objekt zurück, so dass direkt
mit dieser Selektion weitergearbeitet werden kann:
$(".bild").on("mouseover", function() {
$(this).attr("src", "./img/2.jpg");
}).on("mouseout", function() {
$(this).attr("src", "./img/1.jpg");
});
Effekte
Effekte werden innerhalb einer Funktion eines Event-Listerners definiert.
Über [object].hide() Methode lässt sich ein Element ausblenden:
$("#bild-ausblenden").on("click", function() {
$(".bild").hide();
return false; // deaktivieren des Standard-Verhaltens (springt zum Seitenstart)
});
Es lässt sich ein Argument in hide() übergeben, welcher die Geschwindigkeit
des Ausblendens regelt (gleiches gilt für show()):
$(".bild").hide(); // sofortiges Ausblenden ("kein Effekt")
$(".bild").hide("fast"); // schnelles Ausblenden
$(".bild").hide("slow"); // langsames Ausblenden
$(".bild").hide(5000); // 5000 ms
Über [object].show() Methode lässt sich ein Element ausblenden:
$("#bild-einblenden").on("click", function() {
$(".bild").show();
return false; // deaktivieren des Standard-Verhaltens (springt zum Seitenstart)
});
Weitere Effekte: fadeIn(), fadeOut(), slideUp(), slideDown()
Eigene Effekte erzeugen
Über [object].animate(object, time) wird definiert, wie das Objekt am Ende des
Effekts aussehen soll. Vom derzeitigen Zustand wird der Übergang von jQuery berechnet.
$("#animate").on("click", function() {
$("#container").animate({
width: "450px",
fontSize: "4em",
opacity: "50%"
}, 2500)
})
Dieser Effekt wendet mehrere CSS-Styles auf die Elemente an, innerhalb einer Zeit von 2500 ms.
Über Style-Objekte lassen sich ebenfalls Animationen definieren. Hier wird das Objekt aus dem sichtbaren Bereich entfernt und innerhalb von 5 Sekunden von links in den sichtbaren Bereich verschoben.
const styleStart = {
position: "relative",
left: "-2000px",
opacity: 0,
backgroundColor: "blue",
color: "#fff",
padding: "10px 20px"
};
const styleEnd = {
left: 0, // "0px"
opacity: 1
};
// Start and End in one line
$(".element").css(styleStart).animate(styleEnd, 5000);