Functies en Events schrijven

Leerdoelen

Functies

Snoepautomaat

Functies zijn net als snoepautomaten; ze kunnen dingen voor je doen. Zie het als functionaliteit, sommige zijn al aanwezig in JavaScript andere kunnen we zelf verzinnen en schrijven. Zo kennen we al diverse JavaScript functies: document.write, window.alert enz.

Een functie kan je in Javascript gebruiken om een groep opdrachten te kunnen uitvoeren. Deze groep opdrachten heeft een aangegeven naam en kan meerdere keren worden aangeroepen. De opdrachten of statements die binnen de functie staan worden uitgevoerd wanneer de functie wordt aangeroepen. Een functie kan waarden ontvangen en retourneren naar de plaats van aanroep.

	function toonZin(){
 		document.write('Een zin in een functie.');
	}

Het sleutelwoord function wordt gebruikt om een functie aan te maken. Dit woord wordt gevolgd door de naam van de functie, deze naam kan je zelf kiezen. De naam van een functie schrijven we met kleine letters eventueel gebruik makent van camelCase. Na de naam van de functie noteer je een paar ronde haken ( ). Hier kun je evt argumenten noteren (zie Argumenten doorgeven).
De statements worden genoteerd tussen accolades: { }.

In het geval van het snoepautomaat, zou je aan hieraan dingen kunnen vragen. Je zou bijvoorbeeld om snikkers kunnen vragen.

    var mijnSnoep = snoepautomaat.geefMijSnikkers();  

De snoepautomaat doet het natuurlijk alleen maar als deze het verzoek (de functie) herkent. In het voorbeeld hierboven vraag ik de automaat of hij mij snikkers wil geven. Als de snoepautomaat je de gevraagde snikkers wil geven zou je deze kunnen bewaren in een variabele.

De meeste Snoepautomaten geven je echter geen Snoep cadeau. Je moet er eerst geld in stoppen. Ook bij functies moet je er soms eerst wat in stoppen voordat er wat uit komt. Tussen de haakjes schrijf je de waarde die je aan de functie mee wil geven

    var mijnSnoep = snoepautomaat.verkoopSnikkers(1.00);

of de naam van de variabele waar de waarde in zit.

    var mijnSnoep = snoepautomaat.verkoopSnikkers(bedrag);

Ook kan het zijn dat je er meer verschillende dingen in moet stoppen.

    var mijnSnoep = snoepautomaat.verkoopSnoep(typeSnoep, bedrag);

Als ik zelf de snoepautomaat zou moeten ontwerpen en bouwen, dan moet ik er voor zorgen dat deze de functie herkent, door de functie zelf te schrijven.

Functies schrijven doe je op de zelfde manier als wanneer je een variabele wil declareren. Alleen gebruik je nu niet var maar function. Tussen de accollades schrijf je wat de functie voor je moet doen. Als de functie iets terug moet geven gebruik je het woord return om aan te geven welke variabele moet worden teruggegeven.

    function geefMijSnikkers() {
		// schrijf hier wat de functie voor je moet den
		// return een_snikkers_object;
	}


Let op: Zorg ervoor dat de functie helemaal gelezen is voordat je hem aanroept!

Functies aanroepen

Een functie doet niks op zich, de statements binnen de functies worden pas uitgevoerd wanneer de functie wordt aangeroepen.
Volgend voorbeeld toont een aanroep met een functie in een extern js bestand (bovenstaand script opgeslagen als test.js).

	<html>
		<head>
			<script type="text/javascript" src="test.js"></script>
		</head>
		<body>
			<script>toonZin();</script>
		</body>
	</html>

Het aanroepen van deze functie gebeurt binnen de body van het document, daar de document.write-opdracht die zal worden uitgevoerd informatie op het zichtbare gebied van de webpagina moet plaatsen.

Argumenten doorgeven

We zorgen ervoor dat we zelf kunnen kiezen welke zin we op het scherm zetten.
Hiervoor doen we twee aanpassingen:

	//in test.js
	function toonzin(tekst){
		document.write(tekst +'<br/>');
	}
	
	// in de body van de html
	<script type="text/javascript">
		<!--<![CDATA[
		toonzin("Een eerste zin");
		toonzin("Een tweede zin");
		toonzin("Nog een zin");
		// ]]>-->
	</script>

Blz: 33 t/m 36

Events

Events vormen het hart van een Javascript-pagina. Event-handling staat toe dat de Javascript opdrachten op het juiste moment worden uitgevoerd, wanneer de juiste gebeurtenis heeft plaatsgevonden:
Een berekening wordt uitgevoerd wanneer een gebruiker op een knop klikt, een figuur verandert wanneer de gebruiker er met de muis over beweegt, een animatie wordt gestart wanneer de pagina geladen is ...

Hier vind je een overzicht van de belangrijkste events die je met Javascript op een webpagina kan afhandelen.

Gebeurtenis Beschrijving Gebeurtenissen 
Muis Reageren op muisacties van de gebruiker click Klikken
  mouseover Muisaanwijzer boven element
  mouseout Muisaanwijzer verlaat element
  mousedown Muisknop wordt ingedrukt
    mouseup Muisknop wordt losgelaten
    dblclick Dubbelklik
    mousemove Muisaanwijzer beweegt
    mouseenter MS mouseover-variant, zonder bubbling
    mouseleave MS mouseout-variant, zonder bubbling
Toets Reageren op toetsaanslagen 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 Een element krijgt de focus
  blur Een element verliest de focus
  load Een element is geladen
  unload Een element is niet meer geladen
  resize De afmetingen van een element worden veranderd
  scroll Er wordt gescrolld met een element

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.

getElementById()

In JavaScript kun je met document.getElementById('id') elk element op een html-pagina benaderen.
Daarvoor geef je het element, in je html-code, een unieke id attribute mee:
<link id="css" ... / >
De css-kenmerken van een element bepaal je in een extern css bestand, bv:
#mijnElement {width:100px; border:1px solid #000000; padding:10px;}
Nu kun je stijlkenmerken van dit element wijzigen dmv de volgende functie:

	function aanpassen(dit){
		var nieuw=dit.firstChild.nodeValue;
		document.getElementById("css").setAttribute("href",(nieuw+".css"));
	}

Deze functie kan in een extern js bestand, en de onderstaande code is deel van een html bestand.

	<div id="mijnElement"> ... </div>
	<a href="#" onclick="aanpassen(this); return false">style1</a>

return false zorgt ervoor dat de link niet werkt!

Lezen Blz 58 t/m 65.

Lesopdrachten

1. Probeer het voorbeeld van hierboven verder uit te werken. Maak een aantal totaal verschillende css bstanden met verschillende stylen voor een bepaald html element en gebruik hiervoor events voor het aanroepen van de functie.
De gebruikte functie staat natuurlijk in een extern bestand (evenals de css bestanden).

2. Maak een Image Gallery. Gebruik hiervoor een lijst met linken naar plaatjes en een plaatje ter grote van de plaatjes die je wil laten zien.
Image Gallery

Gebruik this om de link waar je op klikt mee te sturen met de functie aanroep. Dit event staat dus als attribute bij het a (link) element;

onclick="laatZien(this); return false;

Haal in de functie het pad naar het plaatje uit de meegestuurde informatie en gebruik deze informatie in het img element.
Als dit lukt, probeer dan ook een dynamische titel te maken bij het plaatje!

Zie Hoofdstuk 4!

Boek

DOM Scripting: Web Design with JavaScript and the Document Object Model, Jeremy Keith
Friends of ED, English, ISBN: 1-59059-533-5

Lezen: Hoofdstuk 4!

Links

delicious