Lab Webdesign: Javascript 21 april 2008



Vergelijkbare documenten
Lab Webdesign: Javascript 7 april 2008

Foutcontrole met Javascript

Hell is other browsers - Sartre. JavaScript Events. Peter-Paul Koch (ppk) Kings of Code, 27 mei 2008

HTML. Formulieren. Hans Roeyen V 3.0

Les 9: formulier controle met javascript.

Formulieren maken met Dreamweaver CS 4/CS 5

Lab Webdesign: Javascript 25 februari 2008

HTML in Outlook Hoe zorgt u ervoor dat uw goed in beeld komt?

Web building gevorderden: CSS & JavaScript. Karel Nijs 2008/11

Voor vragen: of mail naar

Dieper in Visual Basic.Net

formulieren met gedragingen en

De principes van unobtrusive JavaScript. Peter-Paul Koch (ppk) PFCongrez, 12 april 2008

Hand-out Introduction to Programming, werkcollege 7 Alex Reuneker 2013

HTML Editor: de eerste stappen

Websitecursus deel 3 JavaScript

Gebruikershandleiding voor: Beperkte Password protectie met JavaScript

DOM: attributen, styling, classes, events, timeouts en intervallen, willekeurige getallen en forms

Interactieve formulieren met gedragingen en Spry

Klik en er gaat iets moois gebeuren...

Een eerste applicatie

De categorie Forms in het paneel Insert

Een imagemap of klikkaart is een standaard afbeelding (jpg, gif of png) waarop bepaalde zones aanklikbaar worden gemaakt.

Lab Webdesign: Javascript 11 februari 2008

Tutorial 1, Delphi: Geldspraak

Deel 3: PowerPoint. Klikoefeningen

Een ASP.NET applicatie opzetten. Beginsituatie:

JavaScript. 0 - Wat is JavaScript? JavaScript toevoegen

oefeningen opstellen met GeoGebra en javascript

Variabelen en statements in ActionScript

Info-books. Toegepaste Informatica. Deel 35: XML - XSL HO35. Jos Gils Erik Goossens

Hoofdstuk 4: Nieuwe objecten

Javascript oefenblad 1

<input type="text" name="veldnaam" size="20" maxlength="30" value="inhoud veld">

Informatietechnologie 2. JavaScript. Functies, Objecten en toegang tot de DOM. Kristof Michiels

Klassen & objecten, overerving, abstracte klassen, debuggen, interfaces, formulieren, polymorfie, statische methoden, event-handlers

Bewerk uw eigen Digibordbij boek

Formulier maken en opvangen met php

WEBDESIGN. html tags. Neem de grondbeginselen van html door via de online cursus op de informaticasite of via instruct-online

Cursus Onderwijs en ICT. Programmeren met Visual Basic

Interactie: Document Object Model en JavaScript. Hoorcollege Webdesign 7 23 mei 2014 Christof van Nimwegen

GoogleMapsGoogleMapsGoogleMaps GoogleMapsGoogleMapsGoogleMaps GoogleMapsGoogleMapsGoogleMaps

Formulieren maken met Dreamweaver CS 4

Algemene basis instructies

WEBSITE-DESIGN CHRIS VERMAAS & FJODOR VAN SLOOTEN B

PHP-OPDRACHT SITE BOUWEN

In het CMS is het mogelijk om formulieren aan te maken. Voorafgaand een belangrijke tip:

Eigen Widgets in CRM. Introductie. Limitering. Widgets beschikbaar stellen. Tips & Tricks Eigen Widgets in CRM

NACSPORT TAG&GO HANDLEIDING Eigenschappen knop

HTML Graphics. Hans Roeyen V 3.0

Les W-04: Een introductie in PHP

Je hoeft je maar met twee bestanden bezig te houden:

Access voor beginners - hoofdstuk 25

FrontPage. Kies Bestand, nieuw en kies vervolgens Website met één pagina: Kies bij voorkeur een locatie:

Het Wepsysteem. Het Wepsysteem wordt op maat gebouwd, gekoppeld aan de gewenste functionaliteiten en lay-out van de site. Versie september 2010

Handleiding. Serviceportal. Versie 1.2 Datum

RIE Vragenlijst Editor


Cliënten handleiding PwC Client Portal

INRICHTEN VAN DAXIS CLOUD

6.2 VBA Syntax. Inleiding Visual Basic

Bij het opstarten van Small Basic verschijnt er de onderstaande werkomgeving.

6,9. Werkstuk door een scholier 6492 woorden 30 november keer beoordeeld. Informatica. Inleiding

Handleiding Zorgverzekeraar Winmens versie 7.29

Handleiding helpdesk. Datum: Versie: 1.0 Auteur: Inge van Sark

Handleiding voor Zotero versie 2.0

Selenium IDE Webdriver. Introductie

Datum, Tijd en Timer-object

2. Wanneer moet ik een afbeelding verkleinen?

6.3 VBA Syntax Instructie. Wij gaan de Visual Basic Editor opnieuw openen, om de instructie die wij zojuist getypt hebben, nader te bekijken.

Central Station. CS website

Internet Explorer 7 (IE7)

U kunt de helpbestanden op verschillende manieren openen. Standaard activeert u de helpbestanden via de toets F1.

Introductie testtooling Wink

Derde Delphi Programma verkenning

Handleiding website. Inloggen Start uw internet browser en ga naar

Internet_html.doc 1/6

De tekstverwerker. Afb. 1 de tekstverwerker

Delmation Products BV Tel: +31 (0)

HANDLEIDING DOIT BEHEER SYSTEEM

Formulieren en waarden posten naar een view

II. ZELFGEDEFINIEERDE FUNCTIES

Trainingsmateriaal Osiris 6. Admission Office International Office

Dynamische Websites. Week 2

Handleiding RS Form! 1.0.4

Quick Guide VivianCMS

Ik zal je nu stap voor stap laten zien hoe je je product op je website als betaalde download kunt aanbieden.

ideal Betaal Formulier (Ondersteund o.a. ideal, MisterCash, Direct E-Banking en Credit Card)

HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS)

Oplossingen overzicht PHP. Oplossing KPN opgave, zonder testen van POST

1 Werken met (keuze)lijstjes: de control listbox

Snel aan de slag met BasisOnline en InstapInternet

Handleiding wordpress

Trippeltrap Content Management System

Documentatiebundel Sfta Versturen en ontvangen van grote mails door gebruik te maken van "sfta.vmm.be"

HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS)

HTML elementen en attributen (volgens de Strict DTD)

AJAX (XMLHttpRequest)

BEGINNER JAVA Inhoudsopgave

Transcriptie:

H9: EVENTS In dit hoofdstuk zullen we uitgebreid ingaan op events en de "event handlers" die we gebruiken om op gebeurtenissen te reageren. PROGRAMMEREN MET BEHULP VAN EVENTS Vroeger werkten programma's zeer rechtlijnig: eerst werd stuk A uitgevoerd, vervolgens stuk B, en tenslotte stuk C of D, afhankelijk van de waarde die de gebruiker voor een bepaald veld had ingevoerd. Die eenvoud verdween met het populair worden van de grafische gebruikersinterface. Plotseling kon de gebruiker niet alleen met behulp van het toetsenbord teksten invoeren en binnen het programma navigeren, maar het was nu ook mogelijk om allerlei handelingen te verrichten met de muis. Natuurlijk moest het programma adequaat reageren op de handelingen van de gebruiker, en "events" oftewel gebeurtenissen bleken een handige manier om daar voor te zorgen. Programmeertalen die events ondersteunen, voeren achter de schermen voortdurend een lus uit om te kijken welke gebeurtenissen er optreden. Voorbeelden van gebeurtenissen zijn: het indrukken van een toets, het aanklikken van een knop met de muis, het openen of sluiten van een venster, of het verstrijken van een bepaalde hoeveelheid tijd. Het enige dat de programmeur in zo'n taal hoeft te doen, is: opgeven welke code moet worden uitgevoerd als de gebeurtenis optreedt, oftewel: een "event handler" specificeren. Dankzij het eventmodel kunnen we in een taal als Visual Basic of Delphi op vrij simpele wijze programma's voor Windows schrijven, en ook JavaScript ondersteunt events. Om in onze programma's gebruik te kunnen maken van events, moeten we dus weten welke gebeurtenissen wanneer kunnen optreden. Helaas is dit voor een deel afhankelijk van de browser, de versie van JavaScript en het besturingssysteem waarmee we werken. We zullen ons echter concentreren op die gebeurtenissen die in alle versies van JavaScript kunnen optreden. EVENTS Hier vind je een overzicht van de belangrijkste events die je met Javascript op een webpagina kan afhandelen. 1

Soort gebeurtenis Beschrijving Gebeurtenissen Muis Reageren op muisacties van de gebruiker click mouseover Klikken Muisaanwijzer boven element mouseout Muisaanwijzer verlaat element mousedown Muisknop wordt ingedrukt mouseup dblclick Muisknop wordt losgelaten Dubbelklik Toets Reageren op toetsaanslagen mousemove Muisaanwijzer beweegt mouseenter MS mouseovervariant, zonder bubbling mouseleave MS mouseoutvariant, zonder bubbling keypress Toets wordt aangeslagen keydown Toets wordt ingedrukt keyup Toets wordt losgelaten Formulieren Reageren op acties voor een formulier en formulierelementen submit Formulier wordt verstuurd reset Formulier wordt gereset Interface Acties als resultaat van gebruikersacties: vb. wanneer de gebruiker klikt op een formulierelement wordt dit element actief: het krijgt de focus. focus blur load Een element krijgt de focus Een element verliest de focus Een element is geladen 2

unload Een element is niet meer geladen Nog veel meer events vind je bij MSDN (Microsoft). resize scroll De afmetingen van een element worden veranderd Er wordt gescrolld met een element INLINE EVENT-HANDLING Nu we een heel aantal events hebben leren kennen moeten we die events ook kunnen afhandelen op onze pagina's. Algemeen kunnen we stellen dat een event kan worden afgehandeld met een event-handler die als naam het event heeft en een prefix 'on': onmouseover, onmouseout, onload, onfocus, onsubmit,... Een eerste manier om events af te handelen is inline-afhandeling. Deze manier van gebeurtenisafhandeling bestaat erin dat een event-handler wordt geplaatst als attribuut in de (X)HTML-tag. Deze manier van werken is de oorspronkelijke manier van gebeurtenisafhandeling en wordt door alle browsers ondersteund. Een nadeel aan deze manier van werken is dat de event-handlers in de (X)HTML-tag ingebed zijn en je dus een mengeling hebt van logische programmacode in Javascript en inhoud van je document (X)HTML. Voor grotere toepassingen en voor specifieke taken kan dit vervelend zijn, en moeilijk in onderhoud. Voorbeelden Probeer volgende voorbeelden zelf uit 1. <img src="../images/geiten.jpg" width="134" height="101" alt="" border="0" onmouseover="alert('over de figuur');"> 3

2. <a href="http://www.ha.com" onclick="alert('we surfen niet');return false">surf naar HA</a> Surf naar HA Wanneer je klikt op deze hyperlink wordt een alert getoond. De hyperlink wordt niet gevolgd doordat we de waarde false retourneren in onze event-handler, waardoor de standaardactie -het volgen van de link- niet wordt uitgevoerd. Wanneer je vanuit je eigen event-handler false retourneert, wordt de standaardeventhandler niet uitgevoerd. Een uitzondering op deze regel is het tonen van een bericht in de statusbalk bij een onmouseover-actie: hier moeten we true retourneren, al willen we niet dat de gekoppelde url in de statusbalk verschijnt (mysterieus...). 3. <a href="../index.asp" onmouseover="window.status='terug naar startpagina';return true" onmouseout="window.status=''">lab Webdesign</a> Labweb Voor hyperlinks bestaat zelfs de mogelijkheid javascript-code in het href-attribuut op te nemen: 4. <a href="javascript:alert('u heeft geklikt')">klik me</a> Klik me 4

Gebruik van this <div id="div1" style="width:100px;border:solid 1px" onmouseover="doeiets(this)">divisie 1</div><br> <div id="div2" style="width:100px;border:solid 1px" onmouseover="doeiets(this)">divisie 2</div><br> <script type="text/javascript"> <!-- function doeiets(obj) var divid = obj.id; alert('muis over: ' + divid + '!') --> 5

TRADITIONELE EVENT-HANDLING Event-handlers installeren en uitvoeren Met de stormachtige opkomst van DHTML was er nood aan een nieuw model voor event-handling. De grote browsers ondersteunen dit model vanaf hun versie 4. In dit model zijn de events volledig te benaderen vanuit Javascript: je hoeft geen code meer toe te voegen aan HTML-tags. <div id="divtrad" style="width:100px;border:solid 1px" >Divisie</div> <script type="text/javascript"> <!-- mijndiv = document.getelementbyid('divtrad'); mijndiv.onclick = muisklik; function muisklik() alert('klik op divisie!'); --> Divisie Je kan de event-handler koppelen vanuit Javascript-code en hoeft geen HTML-attribuut meer te gebruiken. In dit vernieuwde event-model zijn event-handlers zoals onclick, onmouseover, onfocus,... eigenlijk eigenschappen van elementen. Merk op dat je de functie koppelt aan de event-handler zonder haakjes na de naam van de functie. Zet je daar wel haakjes, dan wordt het resultaat van de functie gekoppeld aan de event-handler in plaats van de functie zelf, dit is niet de bedoeling. Event-handlers initiëren Je kan nu zelfs event-handlers initiëren zonder dat de gebruiker daarvoor iets hoeft te doen: mijndiv.onclick(); Dit stukje code zorgt ervoor dat de onclick event-handler van mijndiv wordt uitgevoerd. Dit zal resulteren in het uitvoeren van de functie muisklik. <a href="javascript:mijndiv.onclick()">pr obeer het</a> Probeer het Microsoft heeft hiervoor nog een eigen methode ontwikkeld: element.fireevent('onclick'); 6

Gebruik van this Het sleutelwoord this kunnen we nu gebruiken binnen de functie die het event afhandelt. Op deze manier kunnen we een functie schrijven die bruikbaar is voor meerdere elementen en binnen de functie nagaan welk element de functie heeft aangeroepen. <div id="test1" style="width:150px;border:solid 1px">Een testdivisie</div><br> <div id="test2" style="width:150px;border:solid 1px">Nog een testdivisie</div> <script type="text/javascript"> <!-- t1 = document.getelementbyid("test1"); t2 = document.getelementbyid("test2"); t1.onclick = verandertekst; t2.onclick = verandertekst; function verandertekst() this.innerhtml = "Tekst is aangepast."; --> Na muisklik 7

Anonieme functies In de volgende toepassing zorgen we ervoor dat de achtergrondkleur van elk h5-element wordt veranderd wanneer de gebruiker er met de muis over beweegt. De eerste toepassing maakt nog geen gebruik van anonieme functies. We maken hiervoor gebruik van de getelementsbytagname-methode. Deze methode retourneert een Array van alle objecten met een aangegeven tagnaam. Met een lus kunnen we nu eventhandlers voor alle elementen in deze Array installeren. In feite passen we hier een CSS-eigenschap van deze tag aan. <h5>eerste hoofding</h5> <h5>tweede hoofding</h5> <script type="text/javascript"> <!-- if (document.getelementsbytagname) var x = document.getelementsbytagname('h5'); else if (document.all) var x = document.all.tags('h5'); if(x) for (var i=0;i<x.length;i++) x[i].onmouseover = over; x[i].onmouseout = out; function over() this.style.backgroundcolor='#ffcc33' function out() this.style.backgroundcolor='#ffffff' --> Aangezien de functies over en out zo eenvoudig zijn is het eleganter hiervoor anonieme functies te gebruiken. We herwerken het voorbeeld voor h6-elementen, met anonieme functies: <h6>eerste hoofding niveau 6</h6> <h6>tweede hoofding niveau 6</h6> <script type="text/javascript"> <!-- if (document.getelementsbytagname) var x = document.getelementsbytagname('h6'); else if (document.all) 8

if(x) var x = document.all.tags('h6'); for (var i=0;i<x.length;i++) x[i].onmouseover = function () this.style.backgroundcolor='#ccffcc' --> x[i].onmouseout = function () this.style.backgroundcolor='#ffffff' Een anonieme functie wordt gekenmerkt door het sleutelwoord function onmiddellijk gevolgd door een paar ronde haken en de functieopvulling tussen accolades. De functie heeft geen naam en is dus anoniem. Problemen Er rijzen problemen wanneer je twee functionaliteiten wenst te voorzien voor een eventhandler. Je kan natuurlijk alle functionaliteit die je wenst in een functie stoppen en die registreren bij de eventhandler. Programmeren verloopt echter een stuk gestructureerder en onderhoudsvriendeljiker wanneer je voor een functie slechts 1 taak voorziet. Stel dat een gebruiker ergens kan klikken om een animatie te starten, maar hiervoor moeten eerst een reeks getallen worden gesorteerd. Je zou nu misschien geneigd zijn hetvolgende te doen (op voorwaarde dat de functies sorteergetallen en startanimatie bestaan): element.onclick = sorteergetallen; element.onclick = startanimatie; Deze code levert geen fout op, maar de tweede registratie overschrijft echter de eerste, waardoor de getallen niet zullen worden gesorteerd. Een mogelijke oplossing hiervoor is een functie te registreren die beide functie aanroept: element.onclick = function () sorteergetallen();startanimatie() 9

GEAVANCEERDE EVENT-HANDLING W3C De W3C aanbeveling stelt dat we een event-handler kunnen installeren met de methode addeventlistener. Deze methode heeft drie argumenten: 1. Event waarop wordt gereageerd 2. Actie die moet worden uitgevoerd (functienaam, anonieme functie) 3. Boolean (false = bubbling, true= capturing - zie verderop) In een afhandelingsfunctie refereert this naar het bronobject van de actie. EventListeners verwijderen doe je met removeeventlistener, met dezelfde argumenten als addeventlistener. Microsoft Microsoft ondersteund de methode attachevent Deze methode ontvangt twee argumenten: 1. Event-handler 2. Actie die moet worden uitgevoerd (functienaam, anonieme functie) Events worden uitgevoerd met bubbling (zie verderop) Het sleutelwoord this in een afhandelingsfunctie verwijst steeds naar het object window, en is dus niet bruikbaar. Een functie loskoppelen doe je met de methode detachevent, met dezelfde argumenten als attachevent. Voorbeeld Een algemeen probleem rijst bij het koppelen van meerder functies aan een event-handler: je weet niet welke routine eerst zal worden uitgevoerd. <div class="actie"> <div id="divgeav">testdivisie</div> </div> <script type="text/javascript"> <!-- var d = document.getelementbyid('divgeav'); //W3C if(d.addeventlistener) d.addeventlistener('click',toonbericht,false); d.addeventlistener('click',toonnogeenbericht,false); //Microsoft 1 0

else if(d.attachevent) d.attachevent('onclick',toonbericht); d.attachevent('onclick',toonnogeenbericht); function toonbericht() alert('klikken gedetecteerd'); function toonnogeenbericht() alert('nog een bericht'); --> Testdivisie TOEGANG TOT EVENT-EIGENSCHAPPEN Wanneer je toepassingen maakt heb je vaak toegang nodig tot de eigenschappen van een event. Wanneer je bijvoorbeeld een functie maakt die kan aangeroepen worden vanaf verschillende elementen, dan wil je dikwijls weten welk element de actie heeft veroorzaakt. Denk maar aan een online winkel, het is interessant te weten als de gebruiker klikt op een knop om een artikel te kopen dat je kan weten welk artikel de klant wenst te kopen :) W3C De afhandelingsfunctie ontvangt automatisch een argument, dit argument bevat een event-object. Dit object bevat hetgeen we nodig hebben. Je mag het argument in een variabele stoppen met een naam naar keuze, meestal wordt de naam e gebruikt. 1 1

Microsoft Het object window heeft een eigenschap event die steeds informatie bevat over het laatste event dat heeft plaatsgehad. Voorbeeld Bij W3C-browsers ontvangen we het eventobject als argument in de afhandelingsfuncties, voor Microsoft IE vinden we die informatie in window.event. We zorgen ervoor dat we een variabele e hebben die in beide situaties de event-informatie bevat. De eigenschap type bevat voor beide browsers het type event (hier click). <div id="divtoegang1">testdivisie</div> <script type="text/javascript"> <!-- var d = document.getelementbyid('divtoegang1'); //W3C event-handler if(d.addeventlistener) d.addeventlistener('click',toonbericht,false); //Microsoft event-handler if(d.attachevent) d.attachevent('onclick',toonbericht); // argument e ontvangen voor W3C/Netscape function toonbericht(e) // e opvullen voor Microsoft IE if (!e) var e = window.event; //statements alert('event gedetecteerd van het type: ' +e.type); --> Testdivisie Dit werkt ook bij traditionele event-handling. <p id="toegang2">een alinea om op te klikken</p> <script type="text/javascript"> <!-- 1 2

t = document.getelementbyid('toegang2'); t.onclick = tradklik; function tradklik(e) if(!e) e = window.event; alert(e.type); --> Een alinea om op te klikken Gebruik je inline event-handlers dan geef je event mee als argument naar de functie. window.event is de correcte eigenschap in het Microsoft model, de andere browsers ondersteunen dit ook in dit speciale geval. <p onclick="inlineklik(event)">een alinea om op te klikken<p> <script type="text/javascript"> <!-- function inlineklik(e) alert(e.type); --> Een alinea om op te klikken 1 3

EVENT-EIGENSCHAPPEN Nu je weet hoe je toegangkrijgt tot de eigenschappen van een event kan je volgende informatie opvragen: Eigenschap Beschrijving type Het soort event target W3C / Netscape: element waarop het event plaatshad srcelement Microsoft: element waarop het event plaatshad which oude eigenschap voor Netscape 4: aangeslagen toets of muisknop Muisknop: Links: 1 Midden(wiel): 2 Rechts: 3 keycode W3C / Microsoft: aangeslagen toets button Ingedrukte muistoets Knop W3C Microsoft Links 0 1 Midden 1 4 Rechts 2 2 screenx, screeny Positie van muisaanwijzer t.o.v. het scherm pagex, pagey Positie van muisaanwijzer t.o.v. het document clientx, clienty Positie van muisaanwijzer t.o.v. het document relatedtarget W3C: doelelement bij onmouseout en bronelement bij onmouseover toelement, fromelement Microsoft: doelelement bij onmouseout en bronelement bij onmouseover 1 4

ELEMENT-DETECTIE In dit voorbeeld zie je twee knoppen die een event-afhandelingsfunctie toonelement delen. Binnen de functie toonelement kunnen we nagaan welke knop werd aangeklikt. De functie bevat een extra statement om een bug in de browser Safari te omzeilen: als een event plaatsgrijpt op een element dat text bevat wordt de tekstnode gezien als bron in plaats van het element waarin de tekst vervat is. Het nodetype van een tekstnode is 3.Als het target-element van dit type is gebruiken we de parentnode van dit element. <input id="knop1" type="button" value="knop1"><br><br> <input id="knop2" type="button" value="knop2"> <script type="text/javascript"> <!-- var k1 = document.getelementbyid('knop1'); var k2 = document.getelementbyid('knop2'); //W3C event-handler if(k1.addeventlistener) k1.addeventlistener('click',toonelement,false); k2.addeventlistener('click',toonelement,false); //Microsoft event-handler if(k1.attachevent) k1.attachevent('onclick',toonelement); k2.attachevent('onclick',toonelement); function toonelement(e) var targ; if (!e) var e = window.event; if (e.target) targ = e.target; else if (e.srcelement) targ = e.srcelement; if (targ.nodetype == 3) // opvangen Safari bug targ = targ.parentnode; alert('u hebt geklikt op: ' +targ.id); --> 1 5

TOETSDETECTIE Wil je weten welke toets werd ingedrukt, dan kan dit met de eigenschap keycode van het object event. Netscape 4 werkt met de eigenschap which. Deze eigenschap bevat een numerieke waarde (ASCII) voor het teken, deze waarde kan je met de methode fromcharcode van het object String omzetten in een letterteken. <input id="teksttoets" type="text" value=""> <script type="text/javascript"> <!-- var t = document.getelementbyid('teksttoets'); //W3C event-handler if(t.addeventlistener) t.addeventlistener('keypress',toontoets,false); //Microsoft event-handler if(t.attachevent) t.attachevent('onkeypress',toontoets); function toontoets(e) var code; if (!e) var e = window.event; if (e.keycode) code = e.keycode; else if (e.which) code = e.which var character = String.fromCharCode(code); alert('karakter was ' + character); --> 1 6

MUISKNOPDETECTIE Het indrukken van een muisknop wanneer de muisaanwijzer boven een element staat kan je met de eigenschap button. Netscape 4 gebruikt which. Gebruik beter mousedown of mouseup in plaats van click. Gezien de rechtermuisknop in W3C en Microsoft afhandeling button steeds de waarde 2 heeft is het de eenvoudigste knop om op te testen. Wel nog oppassen voor Netscape 4, daar is de waarde van which 3. <div id="divmuis" style="width:100px;height:50px;border:solid 1px; background:#ccffcc;padding:10px">klik me</div> <script type="text/javascript"> <!-- var m = document.getelementbyid('divmuis'); //W3C event-handler if(m.addeventlistener) m.addeventlistener('mousedown',toonmuisknop,false); //Microsoft event-handler if(m.attachevent) m.attachevent('onmousedown',toonmuisknop); function toonmuisknop(e) var rk; if (!e) var e = window.event; // rk wordt true als de rechtermuisknop wordt ingedrukt // anders wordt rk false if (e.which) rk = (e.which == 3); else if (e.button) rk = (e.button == 2); alert('rechts geklikt? \n\n' + (rk? "ja" : "nee")); --> Klik me 1 7

MUISPOSITIEDETECTIE Het bepalen van de positie van de muisaanwijzer ten opzichte van de linkerbovenhoek van het scherm: <HTML> <HEAD> <TITLE> Lab Webdesign </TITLE> </HEAD> <BODY> <h2>klik ergens op het document</h2> <script type="text/javascript"> <!-- //W3C event-handler if(document.addeventlistener) document.addeventlistener('mousedown',toonmuispositie,false); //Microsoft event-handler if(document.attachevent) document.attachevent('onmousedown',toonmuispositie); function toonmuispositie(e) if (!e) var e = window.event; alert("x: " +e.screenx +"\n\ny: " +e.screeny); --> </body> </html> Om de positie te bepalen ten opzichte van het document heb je pagex, pagey, clientx, clienty en eventueel de srollleft en scrolltop - eigenschappen van BODY. 1 8

MUISACTIES IN DETAIL Je hebt zopas geleerd hoe je kan detecteren met welke muisknop een element werd aangekikt. Wanneer de gebruiker de muis gebruikt kan deze echter heel wat verschillende acties uitvoeren. Klikken Wanneer de gebruiker klikt op een element worden in feite drie events uitgevoerd: 1. mousedown: muisknop naar beneden 2. mouseup: muisknop naar boven 3. click: mousedown en mouseup gedetecteerd On klik-event wordt dus pas geraised wanneer de gebruiker de muis indrukt boven een element en de muis loslaat boven hetzelfde element. Wees bewust van het feit dat wanneer je deze drie event-handlers koppelt aan een element ze alle drie worden uitgevoerd als de gebruiker klikt. Dubbelklikken Deze actie valt uiteen in volgende events 1. mousedown: muisknop naar beneden 2. mouseup: muisknop naar boven 3. click: mousedown en mouseup gedetecteerd 4. mouseup: muisknop naar boven 5. dblclick: er werd gedubbelklikt Het is te vermijden een dblclick en click event op hetzelfde element te definiëren. Bewegen met de muis mousemove vangt muisbewegingen boven een element op. Wees op je hoede wanneer je dit event voorziet van code, elke beweging van 1 pixel boven het element resulteert in het uitvoeren van de code. Elementen binnengaan en verlaten Met mouseover kan je detecteren of de muisaanwijzer boven een element komt, onmouseout onderschept het verlaten van een element. Door event-bubbling kunnen meerdere events ineens afgevuurd worden. Het W3C voegt de eigenschap relatedtarget toe aan het event, deze eigenschap bevat een referentie naar: Element waarvan de muisaanwijzer kwam bij mouseover Element waarnaar de muisaanwijzer gaat bij mouseout Microsoft heeft daarvoor de twee eigenschappen fromelement en toelement Microsoft heeft voor muisbeweging mouseover en mouseout ook twee events beschikbaar die niet 'bubblen' (geen events afvuren van overkoepelende elementen): mouseenter en mouseleave. 1 9

FORMULIEREN Veel JavaScript-events hebben betrekking op formulieren; in de vorige aflevering hadden we het al over het click-event dat optreedt als de gebruiker op een knop drukt. Om op die gebeurtenis te kunnen reageren, moeten we dus een event-handler opgeven; dat kan op verschillende manieren. Laten we aannemen dat onze HTML-pagina een formulier bevat met de naam "klant"; op dat formulier bevindt zich een knop die als volgt is gedefinieerd: <INPUT TYPE="button" NAME="druk" VALUE="Bereken premie!"> Als de gebruiker op deze knop drukt, lijkt er niets te gebeuren, want knoppen van het type button hebben, anders dan submit- en reset-knoppen, geen "ingebouwd" gedrag. Er gebeurt echter wel degelijk iets: er vindt namelijk een click-event plaats. Dit wordt duidelijk als we voor de knop een event-handler opgeven. We kunnen bijvoorbeeld schrijven: <INPUT TYPE="button" NAME="druk" VALUE="Bereken premie!" onclick="alert('premie berekend!')"> Drukt de gebruiker nu op de knop, dan wordt er een alert-box getoond. We kunnen de uit te voeren code ook in een afzonderlijke functie "bereken" stoppen, en de event handler als volgt opgeven: <INPUT TYPE="button" NAME="druk" VALUE="Bereken premie!" onclick="bereken()"> Dit is in veel gevallen overzichtelijker, en bovendien kan dezelfde functie zo fungeren als event handler voor verschillende gebeurtenissen. Het is echter wel duidelijk dat de tweede methode niet fundamenteel van de eerste verschilt. Er is echter (in JavaScript 1.1 en hoger) nog een manier om een event handler op te geven; hierbij blijven HTML-code en JavaScript strikt van elkaar gescheiden. We definiëren in HTML nu alleen het TYPE, de NAME en de VALUE van onze knop, zoals in het eerste voorbeeld hierboven. In JavaScript schrijven we vervolgens: document.klant.druk.onclick = function ()alert('premie berekend!') Bij deze schrijfwijze wordt er dus een functie toegekend aan een eigenschap van een object. Een JavaScript-object dat overeenkomt met een HTML-element (zoals een knop), heeft namelijk een of meer eigenschappen die overeenkomen met de event handler-attributen van dat element. We moeten hier wel "onclick" schrijven en niet bijvoorbeeld "onclick": JavaScript maakt, anders dan HTML, onderscheid tussen hoofd- en kleine letters, en de eigenschappen die event handlers representeren, moeten worden geschreven met kleine letters. Het grote voordeel van deze derde schrijfwijze is, dat we op elk moment een nieuwe event handler op kunnen geven door een nieuwe waarde aan de desbetreffende eigenschap toe te kennen, terwijl HTML-attributen niet meer kunnen worden gewijzigd. 2 0

Alle voorbeelden tot nu toe hadden betrekking op het click-event. Dat treedt op als de gebruiker een knop (submit, reset of button), een checkbox of een radiobutton aanklikt, maar ook als de clickmethode van het overeenkomstige JavaScript-object wordt aangeroepen, bijvoorbeeld met: document.klant.druk.click(). In het vorige hoofdstuk hebben we gezien dat knoppen ook een focus- en een blur-methode hebben, waarmee ze de focus krijgen of juist verliezen. Het komt nu wellicht niet meer als een verrassing dat er ook focus- en blur-events bestaan die we met respectievelijk "onfocus" en "onblur" kunnen afhandelen. TEKSTVAKKEN De waarde van een tekstvak, tekstgebied en een verborgen veld manipuleer je via de eigenschap value van het element. In onderstaand voorbeeld kan je een stukje tekst intikken in het tekstvak. Druk je op 'Toevoegen', dan wordt de tekst toegevoegd aan het tekstgebied. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <HTML> <HEAD> <TITLE>Cursus Webdesign</TITLE> <link rel="stylesheet" type="text/css" href="vb.css"> <script type="text/javascript"> //<!-- function toevoegen() ingave = new getobj("ingave"); resultaat = new getobj("resultaat"); resultaat.obj.value += ingave.obj.value +"\n"; function getobj(name) if (document.getelementbyid) this.obj = document.getelementbyid(name); 2 1

else if (document.all) this.obj = document.all[name]; else if (document.layers) this.obj = document.layers[name]; --> </HEAD> <BODY> <h2>formulieren</h2> <form name="f"> <input id="ingave" name="ingave" type="text" value=""> <br><input type="button" onclick="toevoegen()" value="toevoegen"> <p> <textarea id="resultaat" name="resultaat" rows="5" cols="20" > </textarea> </form> </body> </html> KEUZELIJSTEN Waarden uitlezen Een keuzelijst of SELECT-element heeft een aantal belangrijke eigenschappen: options: een Array met de opties van de keuzelijst. De eigenschap length van deze Array levert het aantal elementen in de keuzelijst. Het aantal elementen vind je ook in de eigenschap length van de keuzelijst (je hoeft in principe de options-array niet te gebruiken) selectedindex: indexcijfer van de geselecteerde optie Een optie uit een keuzelijst is een element uit de Array options van de keuzelijst, maar heeft op zich ook een aantal eigenschappen: text: de tekstwaarde van de optie value: de waarde van het attribuut value voor deze optie selected: boolean die aangeeft of het element geselecteerd is 2 2

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <HTML> <HEAD> <TITLE>Cursus Webdesign</TITLE> <link rel="stylesheet" type="text/css" href="vb.css"> <script type="text/javascript"> //<!-- var talen; var resultaat; function initieer() talen = new getobj("talen"); resultaat = new getobj("resultaat"); function tooneerste() resultaat.obj.value = talen.obj.options[0].text + " (" +talen.obj.options[0].value +")"; function toongeselecteerd() resultaat.obj.value = talen.obj.options[talen.obj.selectedindex].text + " (" +talen.obj.options[talen.obj.selectedindex].value +")"; function toonaantal() resultaat.obj.value = talen.obj.options.length; function getobj(name) if (document.getelementbyid) this.obj = document.getelementbyid(name); else if (document.all) this.obj = document.all[name]; else if (document.layers) this.obj = document.layers[name]; --> </HEAD> <BODY onload="initieer()"> <h2>formulieren: keuzelijst</h2> <form name="f"> <select id="talen" name="talen" size="5"> <option value="csharp" selected="selected">c#</option> <option value="j">java</option> <option value="js">javascript</option> <option value="vb">vb.net</option> 2 3

</select> </textarea> <p> <input type="button" value="toon eerste taal" onclick="tooneerste()"> <input type="button" value="toon geselecteerde taal" onclick="toongeselecteerd()"> <input type="button" value="toon aantal elementen" onclick="toonaantal()"> <p> <input id="resultaat" name="resultaat" type="text" value=""> </form> </body> </html> KEUZERONDJES Radiobuttons vormen een Array van elementen. We kunnen deze Array doorlopen met een lus om te zien welke optie aangeduid is: de eigenschap checked van dit aankruisvakje is true. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <TITLE>Cursus webdesign</title> <link rel="stylesheet" type="text/css" href="vb.css"> <script language= "JavaScript"> <!-- function toonkeuze() //eenvoudiger werken via DOM0 ipv de functie getobj var strres = "Uw geslacht: "; for(var i = 0; i < f.geslacht.length ; i++) if(f.geslacht[i].checked) strres += f.geslacht[i].value; alert(strres); //--> </head> <body> <h1>wat is uw geslacht?</h1> <form id="f" name="f"> <input type="radio" name="geslacht" value="v" checked>vrouwelijk <input type="radio" name="geslacht" value="m">mannelijk <p><input type="button" value="toon keuze" onclick="toonkeuze()"> </form> </body> </html> 2 4

FORMULIER VERSTUREN Dikwijls wens je programmatorisch nog een aantal acties te ondernemen wanneer een gebruiker een formulier verstuurt. Je wil formuliervelden controleren, verborgen velden aanvullen,... Hier kan je handig gebruik maken van de onsubmit event-handler van het element FORM. <form action="doeiets.asp" onsubmit="return controle()"> Hier roepen we de functie controle aan wanneer de gebruiker het formulier wenst te versturen. Wanneer de functie controle true retourneert wordt het formulier verstuurd. Krijg je false terug uit de functie controle, dan wordt het formulier niet verstuurd. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <TITLE>Lab Webdesign</TITLE> <link rel="stylesheet" type="text/css" href="vb.css"> <script language= "JavaScript"> <!-- function controle() if(f.naam.value == "" f.voornaam.value == "") alert('vul uw naam en voornaam in aub.'); return false; return true; //--> </head> <body> <h1>wat is uw geslacht?</h1> <form id="f" name="f" action="../../formscript.asp" method="post" onsubmit="return controle()"> <table> <tr> <td>naam:</td> <td><input name="naam" type="text" value=""></td> </tr> <tr> <td>voornaam:</td> <td><input name="voornaam" type="text" value=""></td> </tr> <tr> <td>geslacht:</td> <td> <input type="radio" name="geslacht" value="v" checked>vrouwelijk <input type="radio" name="geslacht" value="m">mannelijk </td> </tr> </table> <p><input type="submit" value="toon keuze"> </form> </body> </html> 2 5

2 6

FUNCTIERESULTAAT De event handler die we hiervoor gebruikten, was een eenvoudige functie die geen resultaat teruggaf. Het kan echter zinvol zijn om wel een resultaat terug te geven. Dat is met name het geval als sprake is van objecten met "ingebouwd" gedrag, zoals submit-knoppen. Als de gebruiker op een submit-knop drukt, dan wordt de inhoud van het formulier automatisch verstuurd. Dat is heel mooi... tenzij er fouten zijn gemaakt bij het invullen van het formulier! Het zou geen zin hebben om formulieren met behulp van JavaScript te valideren, als we niet konden voorkomen dat foutieve gegevens werden verstuurd. Gelukkig is er wel een manier om het automatische versturen af te breken: geeft de event handler namelijk de waarde "false" terug, dan wordt het formulier niet verstuurd. We geven daartoe onze event handler bijvoorbeeld als volgt op: onclick="return bereken()", en we laten de functie "bereken" true teruggeven als de invoer in orde is, of false als er een probleem is. Het click-event vindt plaats voordat het formulier wordt opgestuurd; van dat feit kunnen we ook gebruik maken om gegevens te formatteren (en bijvoorbeeld alle kleine letters in hoofdletters om te zetten) voordat ze worden verstuurd. Focus- en blur-events treden niet alleen op bij knoppen, checkboxen en radiobuttons, maar ook bij alle andere form-objecten, met uitzondering van "hidden" velden. Click-events kennen deze objecten echter niet; in plaats daarvan hebben ze een change-event. Als de gebruiker bijvoorbeeld een waarde invult in een veld van het type text, password, textarea of fileupload, dan treedt er een change-event op. Dat gebeurt overigens eenmalig, op het moment dat de gebruiker het veld wil verlaten, en niet telkens wanneer er een toets wordt ingedrukt. Het event treedt alleen op als er met het toetsenbord een waarde wordt ingegeven, en niet als er in JavaScript een waarde aan het veld wordt toegekend. Bij het select-object vindt het change-event plaats zodra de gebruiker een optie selecteert of deselecteert. Niet alleen de verschillende elementen van een formulier kennen events, maar ook het formulier zelf: er bestaat een reset- en een submit-event. In het vorige hoofdstuk zagen we dat we een formulier in JavaScript op twee manieren kunnen versturen: we kunnen de submit-methode van het formulier aanroepen of de click-methode van zijn submit-knop. Er is echter een belangrijk verschil tussen beide alternatieven: in het eerste geval treedt er geen submit-event op, in het tweede geval wel. Eventuele validaties die we in de event handler hebben opgenomen, worden in het eerste geval dus ook niet uitgevoerd! 2 7

WINDOW-EVENTS Hoewel veel gebeurtenissen betrekking hebben op formulieren of de elementen die daar deel van uitmaken, zijn er ook events die horen bij andere JavaScript-objecten. Met name het window-object kent enkele events waar we in onze programma's nuttig gebruik van kunnen maken. Zodra een document volledig geladen is, treedt er een load-event op. De event handler voor deze gebeurtenis geven we op in de BODY-tag van ons HTML-document, bijvoorbeeld als volgt: <BODY onload="alert('welkom op mijn pagina!')"> Er is ook een unload-event dat optreedt vlak voordat we de pagina verlaten. Ook voor deze gebeurtenis geven we de event handler op in de BODY-tag: <BODY onunload="alert('graag tot binnenkort!')"> Ook het window-object kent focus- en blur-events; deze treden bijvoorbeeld op als de gebruiker tussen twee vensters heen en weer schakelt. De bijbehorende event handlers gaan weer in de BODYtag. LINK-EVENTS Ook links kennen enkele events, waarvan het click-event waarschijnlijk de meest voor de hand liggende is: deze gebeurtenis vindt plaats als de gebruiker een link in het document aanklikt. Normalerwijze gaat de gebruiker in zo'n geval naar een nieuwe pagina, maar dat gebeurt niet als de event handler de waarde "false" teruggeeft. Daarnaast kent het link-object twee gebeurtenissen die te maken hebben met de positie van de muiscursor ten opzichte van de link. Er treedt een mouseover-event op wanneer de muiscursor zich boven de link bevindt, en een mouseout-event wanneer de muiscursor van de link wordt weggehaald. Het standaard "gedrag" van een mouseover-event is, dat de URL die bij de link hoort, in de statusregel wordt getoond. Dit kunnen we echter onderdrukken door de event handler de waarde "true" terug te laten geven. Handlers voor link-events geven we op in de anchor-tag, bijvoorbeeld als volgt: <A HREF="uitgang.htm" onclick="return confirm('u staat op het punt de site te verlaten, wilt u dat echt?')">uitgang</a> Met confirm, een methode van het window-object, kan de gebruiker zijn keuze bevestigen door op "OK" te drukken of annuleren door op "Cancel" te drukken. In het eerste geval wordt de waarde 2 8

"true" geretourneerd en gaat de gebruiker naar pagina "uitgang.htm", in het tweede geval wordt "false" teruggegeven en blijft de gebruiker op de huidige pagina. TIMER-EVENTS In recente versies van JavaScript zijn er nog veel meer events die optreden als het venster van de browser wordt vergroot of verkleind, als er een toets wordt ingedrukt of als de gebruiker de muiscursor boven een afbeelding beweegt. Op deze events zullen we hier echter niet ingaan, maar wel op een laatste groep gebeurtenissen die te maken hebben met het verstrijken van een bepaalde hoeveelheid tijd: de timer-events. Om gebruik te kunnen maken van timer-events, moeten we eerst opgeven met welke tussenpozen die events zullen optreden. Dat doen we met de methode "settimeout" van het window-object. De parameters die we aan deze methode meegeven, zijn de uit te voeren JavaScript-code (met het oog op de leesbaarheid zullen we hier meestal de naam van een functie gebruiken) en de lengte van het gewenste interval in milliseconden (dus 1000 voor een seconde en 60000 voor een minuut). De methode geeft een waarde terug: het zogenaamde "timeout ID". Deze waarde kunnen we gebruiken om voortijdig het optreden van het timer-event te onderdrukken; we geven daartoe het timeout ID als parameter mee aan cleartimeout, een andere methode van het window-object. Met settimeout wordt slechts een enkel timer-event "voorbereid"; willen we dat een dergelijk event herhaaldelijk optreedt, dan moeten we in de uit te voeren code, die we als parameter aan settimeout meegeven, opnieuw settimeout aanroepen. (Vanaf JavaScript 1.2 is er een methode setinterval die zelf voor herhaalde uitvoering zorgt.) CONCLUSIE We hebben kennis gemaakt met de verschillende events die in JavaScript kunnen plaatsvinden, en gezien hoe we daar op kunnen reageren met behulp van event handlers. 2 9

OEFENINGEN H9: EVENTS OEFENING 1 Creëer volgende website met behulp van javascript. Als je op de knop duwt krijg je een popup met hallo. OEFENING 2: BOODSCHAPPENLIJSTJE Deze oefening bestaat eruit een pagina te maken waarbij een gebruiker namen van artikels kan ingeven in een tekstvak. Bij het drukken op een knop worden de artikels toegevoegd aan een keuzelijst. Als de gebruiker dubbelklikt op een item uit de lijst verwijdert dit het item. Maak gebruik van traditionele event afhandeling. EXTRA OEFENING 3 Door een item uit een keuzelijst te kiezen wordt de bijbehorende website meteen geopend. Je hoeft niet meer op een GO-knop te klikken. 3 0