10. Globale objectenNaar boven10.1. Het window-objectHet window-object gebruik je veel maar dat merk je nooit. Het eigenaardige aan dit object is namelijk dat dit het enige geval is waarbij je de objectnaam en dan de punt mag weglaten. Zo heb je de functie alert() al vaak gebruikt, maar eigenlijk is dat een methode van window terwijl je niet hoeft te typen window.alert() (wat overigens wel mag). Je mag de naam window dus weglaten. Je hoeft het enkel te weten om te snappen waarom ergens soms window.alert() of window.document.getElementById() staat in plaats van gewoon alert() of document.getElementById(). Zelf hoef je nooit window. te typen, tenzij je dat natuurlijk overzichtelijker vindt. Het window-object bevat nog twee handige methoden die je vaak zult gebruiken, window.setTimeout() en window.setInterval() Of zoals je het dus ook kan noemen: setTimeout() en setInterval(). Ze hebben beide 2 argumenten nodig, het eerste is een string die een stukje JavaScript bevat, het tweede een aantal milliseconden. Vervolgens wordt het stukje JavaScript in de string na het gegeven aantal milliseconden uitgevoerd. In het gevan van setTimeout() wordt het eenmalig uitgevoerd, in het geval van setInterval() wordt het elke keer weer opnieuw uitgevoerd na het gegeven aantal milliseconden. JavaScript:setTimeout('alert("Mij zie je na 5 seconden!");', 5000); // 5000 ms = 5s setInterval('alert("Mij zie je elke 3.5 seconden!");', 3500); // 3500 ms = 3.5s
Soms wil je een time-out of interval stoppen. Zeker bij een interval kan dat handig zijn. Zodra je een van die twee functies aanroept geeft die een ID terug, dat ID kun je dan opslaan in een variabele en kun je later weer gebruiken om de timer te stoppen. Merk op dat als je de timer stopt de code dus niet meer uitgevoerd wordt. Het stoppen van die timer gaat met clearTimeout() voor time-outs en clearInterval() voor een interval. Als argument geef je dan het ID van de time-out of interval die je wilt stoppen aan de functie mee. JavaScript:var id = setTimeout('alert("Mij zie je na 5 seconden!");', 5000); // Sla het ID op in een variabele clearTimeout(id); // Stop de timer
Naar boven10.2. Het document-objectHet document-object heb je ook al eens gebruikt. Het is deel van het window-object, maar zoals beschreven in H10.2 hoef je window niet te noemen. Je kan dus window.document typen, maar ook document. Het document-object stelt het gehele HTML-document voor. Dus alle HTML-tags, plaatjes, links, formulieren, noem maar op. Het document-object bevat dan ook methodes en eigenschappen om die dingen op te vragen en te bewerken. Zo bevat document altijd vier arrays: Naam array | Zo gebruik je hem | Bevat | anchors | document.anchors | Alle anchors uit het HTML-document (a-elementen met het attribuut name). | images | document.images | Alle img-elementen uit het HTML-document. | forms | document.forms | Alle form-elementen uit het HTML-document. | links | document.links | Alle links (dat kunnen a-elementen en area-elementen zijn) uit het HTML-document. |
Zo kun je bijvoorbeeld aangeven hoeveel plaatjes er op je webpagina staan. JavaScript:function telPlaatjes() { alert("Deze pagina bevat " + document.images.length + " plaatjes."); } window.onload = telPlaatjes; // Omdat de HTML eerst geladen moet worden voordat de JavaScript uitgevoerd kan worden (gezien de JavaScript de HTML gebruikt)
HTML:<img src="img/plaatje.png" alt="Een plaatje" /><br /> <img src="img/plaatje2.png" alt="Nog een plaatje" />
Aangezien die arrays HTML-elementen bevatten kan je die HTML-elementen ook aanpassen via die array. JavaScript:function veranderTekst() { for(var i=0; i<document.anchors.length; ++i) { document.anchors[i].innerHTML = "Hello world!"; // Pas de tekst van het a-element aan } alert("In alle anchors staat nu de tekst Hello world!"); } window.onload = veranderTekst;
HTML:<a name="een naam">Tekst</a><br /> <a href="pagina.html">Nog wat tekst</a><br /> <a name="nog een naam" href="pagina2.html">En nog wat tekst!</a>
De eigenschap body is ook wel noemenswaardig, document.body verwijst gewoon naar de body van de HTML. Dus het body-element. Verder bevat hij de volgende handige methodes: Methode | Zo gebruik je hem | Wat doet hij | getElementById() | document.getElementById("id"); | Returnt het HTML-element met het gegeven id, als dit element niet bestaat wordt de waarde null terug gegeven. | getElementsByTagName() | document.getElementsByTagName("tag-naam"); | Returnt een array van alle HTML-elementen in het document met de gegeven naam (bijvoorbeeld alle b-elementen), als er geen zijn zal de array leeg zijn. |
Wat je allemaal met een HTML-element in JavaScript kan wordt uitgelegd in H10.5. Een ding ken je al: innerHTML. JavaScript:function veranderTeksten() { var alleSpans = document.getElementsByTagName("span"); for(var i=0; i<alleSpans.length; ++i) // Eerst vullen we alle span-elementen met de tekst "How are you?" { alleSpans[i].innerHTML = "How are you?"; } document.getElementById("mijnID").innerHTML = "Hello world!"; // Daarna veranderen we de tekst van alleen het HTML-element met het id "mijnID" in "Hello world!" } window.onload = veranderTeksten;
HTML:<span id="mijnID">Lorem ipsum</span> <span>dolor sit amet</span>
Ook hier geldt weer dat er meer methodes bestaan, daarvoor verwijs ik wederom naar een naslagwerk: W3Schools JavaScript - Het document-object Naar boven10.3. Het Math-objectMet het Math object kun je wiskundige functies en constanten (zoals π) gebruiken. Deze website is niet bedoeld om wiskunde uit te leggen, dus er wordt alleen genoemd wat welke methode doet of wat een eigenschap voorstelt. Er wordt niet uitgelegd wat je er wiskundig mee kan. Methode | Wat doet het | abs(x) | Geeft absolute waarde van x | acos(x) | Geeft de boogcosinus van x in radialen (ook bekend als de inverse cosinus) | asin(x) | Geeft de boosinus van x, in radialen (ook bekend als de inverse sinus) | atan(x) | Geeft de boogtangens van x in radialen tussen -π/2 en π/2 | atan2(x, y) | Geeft de boogtangens van de quotiënt van zijn argumenten | ceil(x) | Geeft x, naar boven afgerond | cos(x) | Geeft de cosinus van x, in radialen | exp(x) | Geeft Ex | floor(x) | Geeft x, naar beneden afgerond | log(x) | Geeft het natuurlijke logaritme (basis: E) van x | max(a, b, c, ..., z) | Geeft het argument met de hoogste waarde terug (aantal argumenten maakt niet uit) | min(a, b, c, ..., z) | Geeft het argument met de laagste waarde terug (aantal argumenten maakt niet uit) | pow(x, n) | Geeft xn | random() | Geeft een willekeurig getal tussen 0 en 1 | round(x) | Geeft x, afgerond naar het dichtsbijzijnde gehele getal | sin(x) | Geeft de sinus van x, in radialen | sqrt(x) | Geeft de vierkantswortel van x | tan(x) | Geeft de tangens van x, in radialen |
De eigenschappen van het Math object zijn constant, dat wil zeggen dat je ze niet aan kan passen. Eigenschap | Wat stelt het voor | Is ongeveer | E | Eulers constante | 2.718 | LN2 | Natuurlijk logaritme van 2 | 0.693 | LN10 | Natuurlijk logaritme van 10 | 2.302 | LOG2E | Logaritme van E, met basis 2 | 1.442 | LOG10E | Logaritme van E, met basis 10 | 0.434 | PI | π | 3.14159 | SQRT1_2 | Vierkantswortel van 1/2 | 0.707 | SQRT2 | Vierkantswortel van 2 | 1.414 |
Voorbeeld van gebruik van het Math object: JavaScript:var x = prompt("Geef een getal op", ""); alert("De wortel van " + x + " is " + Math.sqrt(x));
Naar boven10.4. Standaard HTML-Element-objectWanneer je een variabele in JavaScript hebt die naar een HTML-element verwijst (bijvoorbeeld verkregen van document.getElementById()) dan kun je dat HTML-element aanpassen via die variabele. Zo'n HTML-element is in JavaScript namelijk ook gewoon een object met methodes en eigenschappen. Voor een aantal HTMl elementen zijn natuurlijk specifieke eigenschappen (zoals bijvoorbeeld bij een img-tag het attribuut src ). Maar HTML-elementen hebben ook veel gemeen, in deze paragraaf worden een aantal handige methodes en eigenschappen beschreven die elk HTML-element in JavaScript heeft. Zoals je al eerder hebt gezien kun je de inhoud van het element aanpassen via innerHTML. Dit vervangt de gehele inhoud, dus ook de tags die er in staan. JavaScript:function veranderTekst() { var span = document.getElementById("spanTag"); span.innerHTML="Hallo <i>wereld!</i>"; } window.onload = veranderTekst;
HTML:<span id="spanTag">Hello <b>world!</b></span>
De CSS-stijl van het element kan ook aangepast worden, via style. Dit is alsof je gewoon CSS zou neerzetten het style-attribuut van dat element. Zo kun je bijvoorbeeld de tekstkleur veranderen wanneer er met de muis overheen gegaan wordt. JavaScript:function veranderTekstKleur() { this.style.color = "#f00"; // Verander de tekst-kleur van het element waar vanuit de event getriggerd is in rood } function maakEvents() { var spans = document.getElementsByTagName("span"); for(var i = 0; i < spans.length; ++i) { spans[i].onmouseover = veranderTekstKleur; } } window.onload = maakEvents;
HTML:<span>Dit is een beetje tekst</span><br /> <span>Nog wat tekst</span><br /> <span>Het laatste beetje tekst</span>
Het gebruik is dus simpel: element.style.CssStijlNaam = "CSS waarde";, dit zou dan gelijk zijn aan style="CssStijlNaam: CSS waarde;" in het gekozen element. Alleen zijn er in CSS ook stijl namen met een - er tussen (zoals bijvoorbeeld background-color), en in een naam in JavaScript kan geen - zitten want dat is al een minteken. Daarom laat je dan de - weg, en begin je het woord na de - met een hoofdletter: element.style.backgroundColor = "#f00";. Voor een volledig overzicht van alle CSS stijlen die via style aan te passen zijn, zie: W3Schools JavaScript - style Merk op dat je in CSS vaak een eenheid erbij moet geven, bijvoorbeeld: width: 20px;, de waarde is dan dus 20px en niet alleen 20 en dus zonder ; (die geeft enkel aan dat de waarde daar eindigt, maar is dus geen deel van de waarde). Dus in JavaScript moet dat dan ook: element.style.width = "20px"; worden, waarbij dus die ; niks met de CSS te maken heeft maar enkel het einde van het statement aan geeft (zie H3.1). Via elke JavaScript-verwijzing naar een HTML-element kan het id of de class van dat HTML-element opgevraagd of gewijzigd worden. Dat kan via element.id of element.className. Zo kun je bijvoorbeeld met JavaScript alle spans selecteren die de class abc hebben. JavaScript:function veranderSpans() { var spans = document.getElementsByTagName("span"); // Selecteer alle spans in het document for(var i=0; i<spans.length; ++i) // Doorloop al die spans { if(spans[i].className == "abc") // Als de huidige span de class "abc" heeft { spans[i].style.color = "#f00"; // Pas de stijl van de huidige span aan, maak de tekst rood } } } function maakEvents() { document.getElementById("veranderABC").onclick = veranderSpans; } window.onload = maakEvents;
HTML:<span class="abc">Deze span heeft de class "abc"</span><br /> <span class="abc">Deze ook...</span><br /> <span>Maar deze niet!</span><br /> <button id="veranderABC">Kleur alle abc-spans rood</button>
NodesIn HTML staan alle elementen in elkaar: HTML:<div id="deDiv">Ik ben een div-element <span id="deSpan">En ik ben een span element in het div-element <b id="deB">Met daar in weer een b-element...</b> <i id="deI">en een i-element!</i> </span> </div>
Als je met JavaScript een verwijzing naar een element hebt, kun je ook een verwijzing naar zijn parent krijgen. Zijn parent is het element waar hij in staat. Dus in het geval van de span hierboven, zou dat de div zijn. Die verwijzing kan met de eigenschap parentNode worden opgevraagd. Een element kan altijd maar 1 parent hebben, maar kan meerdere childs (kinderen) hebben. Zoals de span in het bovenstaande voorbeeld, die heeft een b en een i als child, merk op dat de b en i wel indirect childs zijn van de div maar niet direct. Al die directe childs kun je verkrijgen met de eigenschap childNodes, dat is dus een array van alle HTML-elementen die direct in dat element zitten (kan dus ook leeg zijn). Nou kan er ook nog tekst in een element staan, dit telt ook als child. Zelfs de enter en de paar spaties aan het eind van de div met het id deDiv (dus tussen </span> en </div>) in het bovenstaande stukje HTML tellen als tekst, ook al zie je ze niet in het resultaat! JavaScript:function laatKinderenZien() { var div = document.getElementById("deDiv"); alert("Het div-element bevat " + div.childNodes.length + " childs"); var span = div.childNodes[1]; // Het span-element is 2e (na het stukje tekst) child van de div alert("Het span-element bevat " + span.childNodes.length + " childs"); for(var i=0; i<span.childNodes.length; ++i) { alert("Het " + (i+1) + "e element is een " + span.childNodes[i].nodeName + "-element"); } } window.onload = laatKinderenZien;
HTML:<div id="deDiv">Ik ben een div-element <span id="deSpan">En ik ben een span element in het div-element <b id="deB">Met daar in weer een b-element...</b> <i id="deI">en een i-element!</i> </span> </div>
In het bovenstaande stukje code zie je ook nodeName staan (regel 9). Dit is ook een eigenschap die elk HTML-element bevat, en is niks anders dan de naam van het element (DIV, SPAN, B, I, etc) in hoofdletters. Wederom zijn er veel meer eigenschappen en methodes dan in deze paragraaf besproken zijn, daarvoor verwijs ik weer naar W3Schools JavaScript - Eigenschappen en methodes van alle HTML-elementen Naar boven10.5. Een HTML-Table-objectZoals in H10.5 al is gezegd, hebben een aantal HTML-elementen nog wat specifieke eigenschappen. Zo heeft ook een tabel een aantal handige eigenschappen die ik hier nog wel wil bespreken. Je zal deze namelijk vaak nodig hebben. Als je bijvoorbeeld een spelletje maakt, dan gebruik je vaak een tabel als speelbord of level. Elke tabel-object in JavaScript heeft een eigenschap rows, dit is een array van alle rijen in die tabel. Deze array kan dus leeg zijn. Elk element in die array is dus een verwijzing naar een tr-element. De rijen staan in de array op dezelfde volgorde als ze in de HTML voorkomen. Elke rij, dus elk tr-element, bevat weer een een eigenschap genaamd cells. Dat is een array van alle cellen (dus td's) in die rij, ook weer in dezelfde volgorde als voorkomen in de HTML. Op die manier kun je bijvoorbeeld een blokje door een tabel laten bewegen. JavaScript:var x = 2; // De x-coordinaat van het zwarte wordt in deze variabele bijgehouden var y = 2; // De y-coordinaat van het zwarte wordt in deze variabele bijgehouden function beweeg(event) { var table = document.getElementById("gameboard"); table.rows[y].cells[x].style.backgroundColor = "#fff"; // Maak het huidige zwarte vakje wit, we gaan immers hier vandaan verplaatsen // Als er geen pijltjes toets ingedrukt is blijven de coordinaten ongewijzigd // en zal het vakje dus opnieuw zwart worden gemaakt aan het einde van deze functie if(event.keyCode == 37){ // Pijltje naar links if(--x < 0){ // Trek 1 van x af, als het resultaat kleiner is dan 0 (dus buiten de tabel valt) x = 4; // Spring dan weer naar rechts } } if(event.keyCode == 38){ // Pijltje naar boven if(--y < 0){ // Trek 1 van y af, als het resultaat kleiner is dan 0 (dus buiten de tabel valt) y = 4; // Spring dan weer naar onder } } if(event.keyCode == 39){ // Pijltje naar rechts if(++x > 4){ // Tel 1 bij x op, als het resultaat groter is dan 4 (dus buiten de tabel valt) x = 0; // Spring dan weer naar links } } if(event.keyCode == 40){ // Pijltje naar onder if(++y > 4) { // Tel 1 bij y op, als het resultaat groter is dan 4 (dus buiten de tabel valt) y = 0; // Spring dan weer naar boven } } table.rows[y].cells[x].style.backgroundColor = "#000"; // Maak het vakje met de nieuwe coordinaten zwart } function maakEvents() { document.body.onkeydown = beweeg; } window.onload = maakEvents;
HTML:<table id="gameboard" style="empty-cells:show;width:250px;height:250px;"> <tr><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td style="background-color:#000;"></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td></tr> </table> Bestuur het zwarte vakje met de pijltjes
Naar boven10.6. Opdrachten- Maak een soort timer. De gebruiker wordt gevraagd over hoeveel seconden de timer af moet gaan (ga er vanuit dat er een geldig getal ingevoerd wordt). Na zoveel seconden moet er dan een berichtje verschijnen met de tekst: "Timer afgelopen!". (H10.2)
Antwoord - Als opdracht 1, maar maak er nu een knop bij waarmee de timer gestopt kan worden voordat deze afgelopen is. (H10.2)
Antwoord - Maak een pagina met daarop jouw naam en ernaast een knopje (of linkje) "Geef details weer". Als daarop geklikt wordt verandert de tekst van dit linkje in "Verberg details" en moet onder jouw naam je geboortedatum en woonplaats verschijnen.
Als er op "Verberg details" geklikt wordt moeten je geboortedatum en woonplaats weer verdwijnen (je naam blijft altijd staan) en moet de tekst op de knop/link weer veranderen in "Geef details weer".
Gebruik het style-attribuut om iets te verbergen: style="display:none;". De waarde van display moet op block worden ingesteld om een element weer zichtbaar te maken, (H10.2) Antwoord - Maak een tabel waarin elke keer dat de muiscursor over een cel heen beweegt
de achtergrond daarvan zwart wordt en de waarde in de cel (in eerste instantie 0) opgehoogd wordt.
Bij het verlaten van de cel moet de achtergrond weer wit worden.
Maak gebruik van this. (H10.4) Antwoord - Maak een boter, kaas en eieren spelletje.
De spelers mogen om de beurt klikken, alleen als er op een leeg vakje geklikt wordt zal er een x of o verschijnen (afhankelijk van wie aan de beurt is).
Er hoeft geen bericht te verschijnen als er iemand gewonnen heeft. (H10.4) Antwoord
|