jQuery und reines Javascript
als Präsentation ▻Im ersten Teil des Buches, in den Kapiteln Formular und Javascript, Javascript DOM und jQuery wurde Javascript und jQuery bereits vorgestellt.
Nun wollen wir dieselben Themen nocheinmal genauer betrachten.
▻das jQuery Objekt
Alle Funktionen die wir hier disskutieren werden geben immer ein jQuery Objekt zurück, dass eine Liste von Nodes anhalten kann. Manchmal ist diese Liste leer, manchmal enthält sie nur ein Element, manchmal mehrere.
Wenn man mit einem jQuery Objekt arbeitet muss man sich also bewusst sein, arbeitet man immer in der Mehrzahl, nie in der Einzahl.
Um die jQuery Objekte besser von anderen Javascript Variablen unterscheiden zu können werden wir ihre Variablennamen immer mit einem Dollar beginnen.
▻Javascript Code von jQuery zu DOM und umgekehrt: Eine Node
// von Javascript zu jQuery // Eine Node nach ID auswählen node = document.getElementById("id"); // jQuery Objekt konstruieren $q = $(node);
// von jQuery nach Javascript // Eine Node mit ID auswählen $q = $("#idname"); // DOM-Node extrahieren: node = $q.get(0); node = $q[0];
Wenn mehrere Nodes gefunden werden muss das in jQuery nicht besonders behandelt werden, in reinem Javascript schon:
Javascript Code von jQuery zu DOM und umgekehrt: mehrere Nodes
// plain Javascript // Nodes mit CSS-Selektor auswählen arr = document .querySelectorAll(".class"); // wie viele sind es? if( arr.length > 1 ) { console.log("mehrere"); } // in jQuery-Objekt $q = $(arr);
// jQuery // Nodes mit CSS-Selektor auswählen $q = $(".class"); // wie viele sind es? if( $q.length > 1 ) { console.log("mehrere"); } // extrahieren var i=0, arr=Array(); while( i < $q.length ) { arr[i] = $q.get(i); }
Selektieren
Wie wählt man Nodes aus der DOM aus?
Javascript Code DOM Selektieren
// plain Javascript // Eine Node nach ID auswählen node = document.getElementById("id"); // Erste Node auswählen node = document.querySelector("h2"); // Alle Nodes auswählen arr= document.querySelectorAll("h2");
// jQuery // Eine Node nach ID auswählen $q = $("#id"); // Erste Node auswählen $q = $("h2:first"); $q = $("h2").first(); // Alle Nodes auswählen $q = $("h2");
Traversieren
Wie wandert man durch den DOM-Baum?
Javascript Code DOM Traversieren
// plain Javascript // hinauf zur Eltern-Node p = node.parentNode; // Kinder sind im Array children var i = 0; while( i < node.children.length ) { node.children[0]; }
// jQuery // hinauf zur Eltern-Node (Mehrzahl!) $p = $q.parent(); // Kinder $c = $q.children(); $c = $q.children(':selected'); // Nachfahren $n = $q.find(); $n = $q.find(':selected'); // Geschwister $n = $q.next('p');
Attribute
Wie liest man Attribute aus, wie setzt man sie? Das ist in reinem Javascript sogar etwas einfacher als mit jQuery: die Attribute sind einfach Eigenschaften des jeweiligen Nodes und könnnen direkt manipuiert werden.
jQuery erleichtert einerseits das Verarbeiten einer ganzen Liste von Nodes, und bietet andererseites ein paar besser verständliche Werte für Attribute:
Javascript Code Attribute lesen und setzen
// plain Javascript - nur erstes h2! document.querySelector('h2').align; document.querySelector('h2') .align = 'center'; // Form-Element deaktivieren document.querySelector('input') .disabled = true; // existiert nicht
// jQuery - alle h2! $('h2').attr('align'); $('h2') .attr('align', 'center'); // Form-Element deaktivieren $('input') .attr('disabled', true); // Node nach Attribut auswählen: // Input-Tag mit ID und Attribut // 'name' das auf '_no' endet $('input[id][name$=_no]')
Bei der Manipulation von CSS ist zu beachten: die Schreibweise
von CSS-Eigenschaften mit einem Minus-Zeichen lässt sich nicht
nach Javascript übertragen. In Javscript wird deswegen aus
background-color
die Eigenschaft backgroundColor
.
Javascript Code Style setzen
// Style setzen - Schreibweise! document.querySelector('h2') .style.backgroundColor = "yellow";
// Style setzen $('h2') .css('background-color', 'yellow'); // mehrere Eigenschaften setzen $('h2') .css({backgroundColor: 'yellow', color: 'red'});
Statt den Style direkt zu manipulieren sollte man Klassen setzen:
Javascript Code Klassen setzen
// Klassen setzen var cl = d.querySelector('#foo') .classList; cl.add('bar'); cl.remove('bar'); cl.toggle('bar'); // Klassen abfragen cl.contains('bar');
// Klassen setzen $('#foo').addClass('bar'); $('#foo').removeClass('bar'); $('#foo').toggle('bar'); // Klassen abfragen $('#foo').hasClass('bar');
HTML einfügen
Wie fügt man eine Node in die DOM ein?
Javascript Code Node in die DOM einfügen
// plain Javascript // Text einfügen t= document.createTextNode("Hello"); node.appendChild(t); // Tag einfügen l = document.createElement("a"); l.setAttribute('href', 'page.html'); l.appendChild(t); node.appendChild(t); // hack node.innerHTML = "<a href='page.html'>Hallo</a>";
// jQuery // Text einfügen $n.append("Hallo"); // Tag einfügen $l = $( "<a href='page.html'>Hallo</a>" ); $n.append($l); // oder $l = $("<a>") .attr('href', 'page.html') .text('Hallo'); $n.append($l);
Clonen
Wie kopiert oder verschiebt man eine vorhandene Node?
Javascript Code Node clonen
// plain Javascript // dolly kopieren und einfügen var d2 = document .getElementById('dolly') .cloneNode(); document.getElementById('da') .appendChild(d2); // kirk ans ziel verschieben var beam = document .getElementById('kirk') .removeChild(); document.getElementById('da') .appendChild(beam);
// jQuery // dolly kopieren und einfügen $('#dolly').clone().appendTo('#da'); // kirk ans ziel verschieben $('#da').append($('kirk').remove());
Event-Listener
Wie fügt man einen Event-Handler ein?
Javascript Code Events
// plain Javascript node.addEventListener("click", f);
// jQuery $n.on("click", f);
Wann brauche ich jQuery? Wann brauche ich ein Framework?
Als jQuery im Jahre 2006 erschien brachte es große Fortschritte gegenüber “reinem Javascript”. In den Jahren seither hat jQuery die Weiterentwicklung von Javascript beeinflusst: so wurde querySelector und querySelectorAll erst nach jQuery in den Javascript Standard aufgenommen, und landet z.B. in Firefox 3.5 im Juni 2009.
Die “reine Javascript” Lösung bringt bessere Performance, besonders auf mobilen Endgeräten, wo das Laden der Liberary und der Speicherverbrauch durch die Libraray größere Auswirkungen haben als am Desktop.
Siehe auch