…) of attribuut in de stamboom kan vanuit een scripting- en of programmeertaal geselecteerd en aangepast worden. Er bestaan drie versies van de DOM: 1 Core DOM: model voor elk gestructureerd document. 2 XML DOM: model voor XML-documenten en XHTML 3 HTML DOM: model voor HTML-documenten Het HTML-dom is aldus een onafhankelijke en open standaard voor het selecteren, aanpassen, toevoegen of verwijderen van HTML-elementen in een HTML-document. Elke element in een webpagina wordt beschouwd als een ‘knoop/knooppunt’ (node). De DOM-API bepaalt op welke wijze je bepaalde elementen kunt selecteren (opvragen) om ze aan te passen. Dit kan op verschillende manieren: 1 Via de boomstructuur kan van elk element in het document opgevraagd worden wat het bovenliggende (parentnode) of de onderliggende (childnodes) ‘objecten’ (elementen) zijn.
de basisingrediënten van een online gui
25
Document
Root element:
Element:
), links (), etc. Via de waarde van de attributen. De meest gebruikte manier is het opvragen van de id (identiteit) van een element. Een id is immers uniek in het document, bijvoorbeeld enz. De tekst "Wat is de Dom?" in het element Document Object Model... ) opvragen. GeselecteerdElement.appendChild(node) -element met id "intro". Vervolgens geven we de inhoud van dit element weer in twee alert-vensters. Hello World!
In het onderstaande voorbeeld is de root-node van het document. Het is de document-node. De document-node heeft 2 childnodes nl. en . is op zijn beurt de parentnode van en
is niet de waarde van
, maar wordt eveneens als een childnode van
beschouwd. Dit "text"-node is toegankelijk via de innerHTML-eigenschap van het element
.
Wat is de Dom?
hoofdstuk 1
26
1 2 3 4 5 6 7 8 9
Het hele document is de document-node. Ieder HTML-element is een element-node. De tekst in een HTML-element zijn text-nodes. Een HTML-attribuut is een attribute-node. Commentaarregels zijn comment-nodes. Ieder element kan maximaal één parent node hebben. Ieder element kan meerdere child nodes hebben. Een ‘leaf’ is een element zonder child nodes. ‘Siblings’ zijn elementen met dezelfde parent node.
GeselecteerdElement.innerHTML
De tekstinhoud (waarde van de textnode) van het element. De innerHTML-eigenschap hoort niet bij de specificaties van de DOM, maar wordt door alle browsers wel ondersteund. Je kunt er de HTMLinhoud van een element mee opvragen of wijzigen.
GeselecteerdElement.nodeName
De naam van het element opvragen.
GeselecteerdElement.nodeValue
De waarde van het element opvragen.
GeselecteerdElement.parentNode
De parent node van het element opvragen.
GeselecteerdElement.childNodes
Alle child nodes van het element opvragen.
GeselecteerdElement.attributes
Alle aanwezige attributen van een element opvragen.
GeselecteerdElement.getElementById(id)
Een element selecteren met behulp van het idattribuut.
GeselecteerdElement.getElementsByTagName(name) Alle elementen van een bepaalde tag (bijvoorbeeld
Een element toevoegen als child node voor het geselecteerde element.
GeselecteerdElement.removeChild(node)
Een child node verwijderen van een geselecteerd element.
Voor elk document kun je een aantal eigenschappen bewerken: tekst, stijl (CSS), events (hoe reageert het element op gebeurtenissen zoals een muisklik), functies (bijvoorbeeld toevoegen of verwijderen van child nodes). In het onderstaande voorbeeld selecteren we het
de basisingrediënten van een online gui
27
Een model met een verleden Legacy DOM Voor er sprake was van een gestandaardiseerd model, bevatten de browsers slechts de mogelijkeid om formulierelementen, afbeeldingen en links op te vragen. Aanvankelijk konden alleen formulierelementen, afbeeldingen en links via DOM aangesproken worden. Hiermee kon men een eenvoudige formuliervalidatie doen of aan afbeeldingen een ‘rollover’-effect toevoegen: – via naam: document.formName.inputName – via index: document.forms[0].elements[0] Intermediate Dom Vanaf 1997 begonnen browserfabrikanten aan de implementatie van eigen technieken om onderdelen van een ingelezen document te wijzigen. Die technieken kregen de verzamelnaam Dynamic HTML (DHTML) maar waren vaak incompatibel tussen de verschillende browsers. Dom Level 1, 2, 3 Het W3C bracht browserfabrikanten samen om een standaard voor scriptingtalen te ontwikkelen: ECMAscript. javascript (Netscape) en JScript (Microsoft) implementeerden ECMAscript voor grotere compatibiliteit. Het W3C begon eveneens te werken aan de DOM. DOM Level 1 bevatte al technieken waarbij elk onderdeel van een HTML- of XML-document bewerkt kon worden. Bij DOM Level 2 (2000) werd het bekende getElementById geïntroduceerd. Dom Level 3 (2004) biedt ondersteuning voor XPath, keyboard event handling en serializing van XML-documenten. Vanaf 2005 worden grote delen van DOM ondersteund door ECMAscriptcompatibele browsers zoals IE6, Opera, Safari en Gecko-browsers (Mozilla, Firefox, SeaMonkey en Camino).
1.9
Browsers en hun kuren
Voor heel wat ontwikkelaars is het slikken als ze bedenken dat hun beoogde webapplicatie moet functioneren in alle denkbare browsers. Toch is dit niet zo’n groot probleem als het op het eerste zicht lijkt. Ook al bestaan er veel onderlinge verschillen tussen de browsers, toch kunnen we de browsers indelen in vier grote groepen. Heel wat browsers maken intern immers gebruik van dezelfde rendering engine, de motor voor het omzetten van HTML en CSS in een leesbare weergave. Van veel groter belang in deze tijd is de ondersteuning voor webstandaarden en de snelheid van de ingebouwde javascript-interpreter.
hoofdstuk 1
28
Hieronder vind je een beknopt overzicht van de belangrijkste rendering engines: Rendering engine
Browsers
Beschrijving
WebKit
Webkit is door Apple afgeleid engine achter Google Chrome, Safari, Mobile Safari en de van KHTML, de rendering van browser van Google Android engine van de open source browser Konqueror uit de KDE-desktop op Linux
Gecko of NGLayout
Open source layout-engine van Netscape/Mozilla
engine achter Mozilla Suite Mozilla Firefox, AOL, Beonex Communicator, Camino, CompuServe 7.0, DocZilla, Epiphany, Flock, Galeon, IBM Web Browser, K-Meleon, Kazehakase, Netscape 6.0 en latere versies, Salamander Web Browser, SeaMonkey, Skipstone
Presto
Layout-engine van Opera Software ter vervanging van de oude Elektra-engine
Opera 7 en later, Opera Mobile, Opera Mini, Nintendo DS Browser, Nintendo DSi Browser, Nokia 770 browser, Sony Mylo COM-1 browser, Wii Internetkanaal, Macromedia/Adobe Dreamweaver MX tot en met CS3, Adobe Creative Suite 2 en 3
Trident
Rendering engine voor Microsoft Internet Explorer vanaf versie 4
Internet Explorer
Op http://en.wikipedia.org/wiki/Comparison_of_web_browser_engines vind je een uitgebreide lijst van browser en hun specifieke rendering engines.
1.10 Modernizr Niet alle browsers (en zeker niet de oudere) ondersteunen de nieuwe input-types en attributen. Op www.modernizr.com vind je een geavanceerde javascriptbibliotheek die voor de gebruikte browser controleert welke nieuwe HTML5-elementen, HTML5-attributen en CSS3opties ondersteund worden. Download het script en link het aan de -tag van je webpagina’s. <script src="modernizr-1.7.min.js">
Let op: afhankelijk van de gedownloade versie moet je natuurlijk de naam van het script aanpassen. Je kunt het script ook in een andere map bewaren. Dan moet je niet alleen de naam, maar ook de map invoeren bij het attrbuut ‘src’. Voeg nu het attribuut class "no-js" toe aan de -tag.
Modernizr controleert niet alleen welke HTML5 en CSS3-opties door de gebruikte browser ondersteund worden. Het vervangt de naam van de class door js en voegt een extra class toe
de basisingrediënten van een online gui
29
voor elke optie die ondersteund wordt. Wat niet ondersteund wordt, krijgt het voorvoegsel no-. Bijvoorbeeld:
Het voordeel is dat je in je CSS aparte klassen kunt definiëren. Wanneer je in de body van je webpagina een
/* De HTML krijgt van Modernizr de klasse audio*/
width:40px; height:20px; }
De nieuwe types invoervelden krijgen geen aparte class van Modernizr. Immers, een browser die ze niet herkent, geeft ze gewoon weer als een standaard tekstveld. Modernizr maakt het mogelijk om te controleren of een invoertype door je browser wordt ondersteund. Zo niet, dan kan je met behulp van een andere javascript-bibliotheek een eigen element voorzien. Bijvoorbeeld:
In de head voeg je toe: <script type="text/javascript"> if(!Modernizr.inputtypes.date){ //geen ondersteuning? Maak dan een 'datepicker' aan voor het element met ID 'verjaardag' maakKalender(document.getElementById('verjaardag')); } function maakKalender(idVanElement){ //uw code }
hoofdstuk 1
30
In plaats van Modernizr.inputtypes.date kun je date vervangen door elk nieuw type invoerveld: search, tel, url, email, datetime, month, week, time, datetime-local, number, range, color. Je kunt Modernizr ook laten controleren of de nieuwe attributen ondersteund worden. Bijvoorbeeld:
In de head voeg je toe: <script type="text/javascript"> if (!Modernizr.input.required){ // use a input hint script controleerInvoer(document.getElementById('gebruikersnaam')); } function controleerInvoer(idVanElement){ //uw code die controleert of het veld ingevuld is of niet... }
In plaats van Modernizr.input.required kun je required vervangen door elk nieuw type invoerveld: autocomplete, autofocus, list, placeholder, max, min, multiple, pattern, step.
1.11
Frameworks brengen browsers dichter bij elkaar
De tijd dat een ontwikkelaar elke javascript-functie zelf moest schrijven en de werking ervan in elke browser moest uittesten, is definitief voorbij dankzij de komst van geavanceerde javascript-bibliotheken en frameworks. Zulke frameworks maken niet alleen het selecteren en on-the-fly aanpassen van de diverse pagina-elementen onwaarschijnlijk eenvoudig. Ze beschikken ook over al dan niet uitgebreide User Interface-uitbreidingen. Voor de meest populaire frameworks bestaan er bovendien honderden plugins en user-generated uitbreidingen. Een javascript-bibliotheek bevat een aantal functies voor het ontwikkelen van webapplicaties. Ze bieden tal van voordelen: – Cross-browser: javascript mag dan wel browseronafhankelijk zijn, toch wordt het niet altijd op dezelfde manier geïmplementeerd door de verschillende browserfabrikanten. Een framework neemt werk alvast uit handen van de ontwikkelaar. – Voor programmeurs bieden de frameworks class-based inheritance terwijl javascript zelf gebruikmaakt van protype-based inheritance. Het framework neemt de vertaalslag voor zijn rekening. – Code reuse: frameworks maken het hergebruik van code uiterst eenvoudig. Dit zorgt voor enorme tijdwinst bij het ontwikkelen van een webapplicatie en bespaart ook massa’s frustratie… of heb je tijdens het computerwerk nog nooit woedeaanvallen gekregen?
de basisingrediënten van een online gui
31
Tot de meest populaire frameworks behoren onder andere – Dojo Toolkit: http://dojotoolkit.org/ – ExtJS: http://www.sencha.com/ – jQuery: www.jquery.com – MochiKit: http://mochi.github.com/mochikit/ – Mootools: http://mootools.net/ – Prototype: http://www.prototypejs.org/ – script.aculo.us: http://http://script.aculo.us/ – Yahoo! UI Library (YUI): http://developer.yahoo.com/yui/
1.12 Elementen selecteren met jQuery Een van de meeste populaire javascript-frameworks is zonder twijfel jQuery van John Resig. jQuery is open source en kan dus vrij gebruikt worden in al je projecten. Het grootste voordeel is de lage leercurve en het feit dat het crossbrowser werkt. De ontwikkelaar hoeft zich dus geen zorgen meer te maken over de diverse browser-implementaties van de DOM of javascript. jQuery heeft de volgende eigenschappen: – AJAX (XHR-requests) – animaties – crossbrowser selecteren van DOM-elementen – CSS-manipulatie – DOM wijzigen – effecten – event-handling – plugin-architectuur Net zoals dat met alle andere javascript-bibliotheken het geval is, moet je het jQuery-script linken in de van je webpagina’s. Je hoeft het bestand zelfs niet op je eigen server plaatsen, maar je kunt een verwijzing opnemen naar het script op de jQuery-site. Op de site googleapis.com host Google een hele reeks frameworks. Je kunt die op de volgende manier in je pagina’s integreren: <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js">
Vervolgens moet je een eigen script toevoegen. De document-ready-functie van jQuery is een sublieme vervanger voor de window.onload-functie van javascript. <script type="text/javascript"> $(document).ready(function(){ //hier komt uw code });
hoofdstuk 1
32
Selecteren van DOM-elementen in jQuery id
var MijnSelectie= $("#idVanElement");
selecteer het element met een bepaald id
class
var MijnSelectie= $(".EenKlasse");
selecteer alle elementen met een bepaalde klasse
tag
var MijnSelectie= $("a");
selecteer alle tags van een bepaalde soort (vb. )
…
…
…
1.13 Javascript User Interfaces De meeste javascript frameworks bieden naast een core-script voor het manipuleren van de DOM ook een User Interface-bibliotheek aan. Die bibliotheek bestaat meestal uit een reeks componenten of ‘widgets’ die met een eenvoudig functie-aanroep in een webpagina geïntegreerd kunnen worden. Ruwweg kunnen deze componenten in twee categorieën worden ingedeeld: – layout-widgets: voor het vormgeven en vergemakkelijken van de bediening van een webapplicatie; – form-widgets: voor het vergemakkelijken van de invoer in formulierelementen (bijvoorbeeld een kleur kiezen, een datumkiezer etc.) De meest voorkomende componenten zijn accordeon, tabs, knoppen, ‘extended’ invoervelden (o.a. autocomplete), knoppenbalken, uitrolmenu’s, dialoogvensters, boomstructuren, kalenders, tooltips, teksteditors… Als je bij jQuery naast de code ook gebruik wilt maken van de UI-componenten, moet je een tweede script aan de van je webpagina’s linken. De UI-bibliotheek bestaat vaak uit meer dan één bestand. Dit betekent dat een reeks bestanden op de server zal moeten worden geplaatst (http://jqueryui.com/). In het onderstaande voorbeeld maken we gebruik van de tabs-component van jQuery UI. De component transformeert bestaande HTML-code in tabbladen. Daarvoor moet de ontwikkelaar in zijn code een