3 JAVASCRIPT & AJAX
Inhoudstabel HOOFDSTUK 1 1.1 1.2 1.3 1.4 1.5
EINDELIJK ECHTE INTERACTIE .................................................................................................. 4 WAT IS JAVASCRIPT?................................................................................................................ 5 KORTE GESCHIEDENIS .............................................................................................................. 5 VERSIE 4.1................................................................................................................................ 6 WERKWIJZE .............................................................................................................................. 7
HOOFDSTUK 2 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8
JAVASCRIPT BASIS.......................................................................................... 8
JAVASCRIPT INVOEGEN IN HTML ............................................................................................ 8 VENSTERCOMMUNICATIE ....................................................................................................... 10 VARIABELEN .......................................................................................................................... 11 BEREKENINGEN EN AUTOMATISCHE TYPECONVERSIE ............................................................ 12 PARSEINT() & PARSEFLOAT() ................................................................................................ 13 IF - STRUCTUUR ...................................................................................................................... 13 IN HET HUIDIGE DOCUMENT SCHRIJVEN ................................................................................. 15 SAMENVATTING ..................................................................................................................... 15
HOOFDSTUK 3 3.1 3.2 3.3 3.4 3.5 3.6
LANG LEVE JAVASCRIPT.............................................................................. 4
EVENTS & FUNCTIES .................................................................................... 17
EVENTS OPZOEKEN ................................................................................................................. 17 EVENT-HANDLERS DEFINIËREN .............................................................................................. 18 FUNCTIES DEFINIËREN ............................................................................................................ 19 PARAMETERS.......................................................................................................................... 20 RETURNWAARDEN.................................................................................................................. 21 SAMENVATTING ..................................................................................................................... 22
HOOFDSTUK 4
HET IMAGE OBJECT ..................................................................................... 23
4.1 INLEIDING............................................................................................................................... 23 4.2 RELEVANTE EVENTS .............................................................................................................. 24 4.3 VERWIJZEN NAAR EEN IMAGE IN HET DOCUMENT .................................................................. 24 4.3.1 this ! de huidige figuur.................................................................................................... 25 4.3.2 document.images[n].......................................................................................................... 25 4.3.3 document.imagenaam........................................................................................................ 25 4.4 WERKEN MET EIGENSCHAPPEN .............................................................................................. 25 4.4.1 De bron van de image – src .............................................................................................. 25 4.4.2 De breedte en hoogte van een image – width en height.................................................... 25 4.4.3 De Tooltip van een image – title ....................................................................................... 26 4.5 WILLEKEUR ............................................................................................................................ 26 4.6 SAMENGEVAT ......................................................................................................................... 27 HOOFDSTUK 5 5.1 5.2 5.3 5.4 5.5 5.6
FORMULIEROBJECTEN ............................................................................................................ 28 FORMULIEREN TELLEN ........................................................................................................... 30 FORMULIEREN BENOEMEN ..................................................................................................... 30 STRINGS, - METHODES EN -EIGENSCHAPPEN........................................................................... 31 DE DATUM .............................................................................................................................. 33 SAMENVATTING ..................................................................................................................... 33
HOOFDSTUK 6 6.1 6.2 6.3 6.4 6.5 6.6
FORMS & STRINGS ........................................................................................ 28
FORMULIER-VALIDATIE............................................................................. 34
DOELSTELLINGEN................................................................................................................... 34 FORMULIERVERZENDING TEGENHOUDEN ............................................................................... 35 EEN MOGELIJK STRAMIEN....................................................................................................... 35 TOEPASSINGEN ....................................................................................................................... 37 FORMULIERVALIDATIE GRAFISCH VERDUIDELIJKEN ............................................................. 37 SAMENGEVAT ......................................................................................................................... 37
HOOFDSTUK 7 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8
DHTML : CSS + JS .......................................................................................... 38
INLEIDING............................................................................................................................... 38 GETELEMENTBYID() .............................................................................................................. 39 HTMLELEMENT – INNERHTML............................................................................................ 39 DE EIGENSCHAP “STYLE” ....................................................................................................... 40 DE EIGENSCHAP CLASSNAME ................................................................................................. 42 HET EVENT-OBJECT ................................................................................................................ 42 OEFENINGEN .......................................................................................................................... 43 TIMERS ................................................................................................................................... 43
HOOFDSTUK 8
DHTML : TABLES & FORMS........................................................................ 45
8.1 INLEIDING............................................................................................................................... 45 8.2 TABELLEN .............................................................................................................................. 46 8.3 FORMULIEREN UITBREIDEN .................................................................................................... 47 8.4 ARRAYS EN DE FOR-IN (FOR EACH)......................................................................................... 48 8.4.1 Genummerde Arrays ......................................................................................................... 48 8.4.2 Associatieve Arrays ........................................................................................................... 49 8.5 SELECT AANPASSEN MET EEN ASSOCIATIEVE ARRAY ............................................................. 49 HOOFDSTUK 9
BASIS AJAX ...................................................................................................... 51
9.1 EEN BEETJE RIA..................................................................................................................... 51 9.2 HET CONCEPT VAN AJAX ........................................................................................................ 52 9.2.1 Asynchroon / Achtergrond ................................................................................................ 52 9.2.2 Het XMLHTTPRequest-object op de achtergrond ............................................................ 53 9.2.3 Een Call-back functie ........................................................................................................ 53 9.2.4 Vijf readyStates ................................................................................................................. 54 9.2.5 De Response opvragen ...................................................................................................... 54 9.2.6 Samenvatting ..................................................................................................................... 54 9.3 EEN BROWSERONAFHANKELIJK HTTP-OBJECT ...................................................................... 55 9.4 ONREADYSTATECHANGE CALL BACK .................................................................................... 55 9.5 GET- OF POST-REQUEST ....................................................................................................... 56 9.5.1 GET ................................................................................................................................... 56 9.5.2 POST ................................................................................................................................. 56 9.6 EEN KWIS MET GET ............................................................................................................... 57 9.6.1 HTML ................................................................................................................................ 57 9.6.2 Javascript .......................................................................................................................... 57 9.6.3 PHP ................................................................................................................................... 58 9.7 EEN SHOUTBOX MET POST .................................................................................................... 59 9.7.1 Database ........................................................................................................................... 59 9.7.2 HTML ................................................................................................................................ 59 9.7.3 Javascript .......................................................................................................................... 60 postBericht()................................................................................................................................................60 volgende()....................................................................................................................................................60
9.7.4
PHP ................................................................................................................................... 62
postBericht.php ........................................................................................................................................... 62 getBericht.php .............................................................................................................................................62
HOOFDSTUK 10
PROTOTYPE..................................................................................................... 64
10.1 EEN HANDIGE BIBLIOTHEEK ................................................................................................... 64 10.2 SHORTHAND FUNCTIES $() EN $F()......................................................................................... 65 10.3 AJAX-HELPERS ....................................................................................................................... 65 10.3.1 Ajax.Request ................................................................................................................. 65 10.3.2 Ajax.Updater................................................................................................................. 65 10.3.3 Ajax.PeriodicalUpdater ................................................................................................ 65 HOOFDSTUK 11 11.1
SCRIPT.ACULO.US ......................................................................................... 66
EEN BIBLIOTHEEK VOL EFFECTJES .......................................................................................... 66
Hoofdstuk 1
Lang leve Javascript 1.1 Eindelijk echte interactie xHTML gecombineerd met CSS, zoals we ondertussen (hopelijk) al redelijk goed kennen is een krachtige opmaaktaal voor webpagina’s. Het grootste nadeel van puur HTML is dat het louter statisch is: eenmaal getoond, verandert de webpagina niet meer: geen nieuwe prentjes, geen bewegende dingen, geen interactie met de webbezoeker, niks. Met CSS kunnen we al een redelijk aantal dynamische effecten bekomen maar in essentie beperkt dit zich tot hovers en roll-overs. Javascript verhelpt dit. Met Javascript kunnen we (eindelijk) dynamische en interactieve webpagina’s bouwen die reageren op allerhande impulsen, meestal van de webbezoeker, maar ook op willekeurige momenten of met vaste intervals.
1.2 Wat is Javascript? Javascript – officieel ECMAscript, maar dat bekt minder goed – is een client-side script taal. Met client-side bedoelen we dat de taal aan de kant van de bezoeker draait. Hierdoor kan de taal reageren op de events die de gebruiker veroorzaakt, vooral alle acties met de muis (bewegen, klikken, slepen, …, maar ook toetsenbord-acties, timers, het – al dan niet succesvol – inladen van figuren, pagina’s, … of het sluiten van het venster. In essentie is Javascript een extensie van HTML. Dat betekent dat we eerst een HTML-pagina nodig hebben waarin we dan Javascript kunnen plaatsen. Omdat de scripts lokaal uitgevoerd worden ( = op de PC van de website-bezoeker) blijft de Javascript-code zichtbaar. Het volstaat om naar de bron van het document te kijken om de code te vinden. Dat betekent dat andere mensen op het internet je code gemakkelijk kunnen overnemen, en dat je hard werk en labeur zomaar te grabbel ligt. Er is nog een groter nadeel. Vermits Javascript een extensie is, zijn er (nog steeds) een (klein) aantal HTML-browsers die Javascript niet ondersteunen. Ook op PDA’s of GSM’s heb je browsers die geen Javascript aanbieden. Bovendien kan je in de meeste browsers Javascript uitschakelen. Dat betekent dat sommige bezoekers van je site de dynamische effecten zullen missen. In principe moet je daar rekening mee houden, maar gelukkig gaat het hier over slechts een zeer kleine groep gebruikers, en houden we daar eigenlijk niet zo veel rekening mee.
1.3 Korte Geschiedenis In de eerste blok hebben we reeds een korte geschiedenis van het internet gegeven. Het is het deel rond de browseroorlog dat hier van belang is. Nadat in de beginjaren Mosaic en later zijn directe opvolger Netscape de browsermarkt beheersten, brengt Microsoft in augustus 1995, samen met Windows 95, de eerste versie van Internet Explorer uit. Deze versie is (zoals de meeste eerste versies van Microsoft) geen groot succes: zowat de hele markt verkiest het origineel, nl. Netscape 1.2 Maar dat Microsoft dit niet zomaar laat gebeuren spreekt voor zich: in een ijltempo volgen nieuwe versies elkaar op, zowel van Internet Explorer als op zijn beurt van Netscape. Kortom de browseroorlog breekt uit. In augustus 1996 zitten we enerzijds met Netscape Navigator 3 en anderzijds Internet Explorer 3. Deze browseroorlog, die in 1995 begon tussen Netscape (Navigator) en Microsoft (Internet Explorer) verliep volgens het simpele principe van ‘mijn papa kan meer dan de jouwe”: door in elke versie nieuwe elementen te steken die niet werken op de andere browser hoopte men het meeste site-ontwerpers en gebruikers te lokken. Netscape begreep snel dat verhoogde interactiviteit een duidelijke meerwaarde voor een website kan betekenen. En vermits HTML dat niet zelf ondersteunt, zat er niks anders op dan zelf een scripttaal te ontwikkelen. Als codenaam werd eerst Mocha gebruikt terwijl Livescript voorzien was als officiële naam. In dezelfde periode ontstond ook de programmeertaal Java, waar bovendien een zeer sterke hype rond ontstond. Om daar op in te spelen werd uiteindelijk, louter om marketingredenen, gekozen voor de naam Javascript i.p.v. het oorspronkelijke Livescript. Microsoft heeft nadien nog een poging gedaan om dat initiatief naar zich toe te trekken door VBScript uit te brengen en later JScript, een dialect van Javascript, maar in feite volgen de meeste browsers nu de standaard zoals ze is vastgelegd in ECMA-script. p. 5/66
Hoofdstuk 1 : Wat is Javascript? Auteur: Kris Aerts – Lesgever: Maarten Reynders
Bij c-md besteden we al sinds 2000 grote aandacht aan Javascript – met wisselend succes –. In de beginjaren apprecieerden studenten de interactieve mogelijkheden, maar na een paar jaar werd Flash en Actionscript populairder omdat daarin bepaalde grafische effecten gemakkelijk te maken zijn. De jongste tijd is Javascript echter aan een sterke revival bezig, en dit dankzij relatief recente technologieën zoals Ajax en bijzonder gebruiksvriendelijke bibliotheken zoals Prototype en scriptaculous. Deze revival kunnen we mooi aflezen aan de boekenverkoop zoals opgetekend door O’Reilly (http://radar.oreilly.com/archives/2006/08/programming_language_trends_1.html).
1.4 Versie 4.1 We vertelden hierboven al dat Javascript steeds een grote rol gespeeld heeft binnen de opleiding c-md, maar deze rol is wel voortdurend aangepast. Op een gegeven moment zijn we zelfs met Javascript mini-games aan het maken geweest – iets wat zeer goed gaat, maar best aan de moeilijke kant is –. Later hebben we die games in Actionscript geprogrammeerd en was Javascript een ietsiepietsie naar de achtergrond aan het verschuiven, maar dankzij DHTML en kort daarna Ajax, is Javascript terug helemaal op de voorgrond gekomen om nu het tweede semester te domineren. Na de grote aanpassingen in 2005-’06 en opnieuw in 2006-’07 is nu de periode van consolidatie aangebroken. In essentie verandert er niet veel, maar achteraan wordt het stuk van Ajax wel iets beter en dieper uitgelegd en besteden we meer aandacht aan de POSTmethode. Nadat we vorig jaar de cursus al redelijk wat aangepast hebben en enerzijds een stuk rond speltechnieken eruit gegooid hebben en anderzijds een stuk rond DHTML toegevoegd hebben, is er dit jaar opnieuw een grote aanpassing. Ajax komt er bij, samen met de bibliotheken Prototype en scriptaculous die verder bouwen op Ajax. Maar voor we daar over kunnen praten, komt eerst de essentie. In het begin gaan we vooral richting formuliervalidatie waarbij je er voor zorgt dat een formulier niet verzonden kan p. 6/66
Hoofdstuk 1 : Wat is Javascript? Auteur: Kris Aerts – Lesgever: Maarten Reynders
worden zolang niet alle verplichte vakken correct ingevuld zijn. Daarna gaan we een klein beetje prutsen met eigenschappen van Images en bekijken we het DOM (Domain Object Model) en DHTML waarmee we de vormgeving (uitzicht en positionering) van zowat alle HTML-elementen dynamisch kunnen aanpassen. We behandelen zowel typische Javascript-toepassingen zoals een beeld in een nieuw venster openen, maar ook minder voor de hand liggende dingen. We willen je immers als c-mder aanmoedigen om ook te durven experimenteren met nieuwe, ongekende effecten om zo de grenzen van het medium te verleggen. Daarna komt een deel waarbij onze kennis PHP terug van pas komt en dan vooral het werken met databases. Bij een traditionele PHP-toepassing ga je na elk verzoek om informatie een volledig nieuwe pagina inladen. Dat betekent dat er eerst een wit blad getoond wordt en dat daarna de pagina ingeladen en getoond wordt. Dat geeft een lichtjes storend effect: het zou zijn alsof we bij het saven in Word eerst een leeg blad krijgen en dat dan alle letters terug ingeladen en getoond moeten worden. Met Ajax – een afkorting voor Asynchroon Javascript And XML – ga je in de achtergrond een PHP-script laten uitvoeren en wanneer dat klaar is, daarop reageren, bv. via een simpel popup-venster waarin je een boodschap geeft, of door bepaalde delen van de webpagina aan te passen of anders vorm te geven (met de DHTMLtechnieken die we hierboven al aanhaalden). In deze cursus bespreken we hoe Ajax in zijn werk gaat en oefenen we dat in met een paar relatief basic toepassingen. Daarna gaan we snel over naar de bibliotheken Prototype en scriptaculous die alles heel wat gemakkelijker (Prototype) en attractiever (scriptaculous) maken. In principe zouden we zelfs direct de twee bibliotheken kunnen gebruiken, maar we vinden het zeer belangrijk in een academische opleiding dat je het basismechanisme van Ajax goed begrijpt vooral we de toegankelijke bibliotheken aanspreken. Omgekeerd zou het precies hetzelfde zijn als een auto-expert die alleen met een automatische versnellingsbak kan rijden en niet weet waarom er überhaupt geschakeld moet worden tijdens het rijden met een auto.
1.5 Werkwijze Je hebt het al kunnen merken bij PHP. Programmeren is een doe-taak. Je kan enkel leren programmeren wanneer je voldoende oefeningen maakt. Daarom zullen er in deze cursus een hele serie oefeningen staan en zullen we op het examen in de eerste plaats oefeningen vragen. Je wordt daarom ten zeerste uitgenodigd om elk fragment Javascript dat je in deze cursus tegenkomt effectief uit te testen. Los bovendien elke oefening op, of probeer het op zijn minst. Durf ook gerust hulp vragen aan de docent, rechtstreeks in de les of anders via email. Voeg in dat geval ook steeds je bronbestand bij. Javascript ontwikkel je in een HTML-editor waar je de HTML-code naakt kan zien. Werk dus niet in grafische modus, maar wel in tekst-modus. In dit vak maken we gebruik van tsWebEditor of HomeSite/Dreamweaver, maar dat is niet noodzakelijk. Elke tekst-editor, zoals bv. Kladblok of PFE, is evenzeer bruikbaar. Voordeel van gespecialiseerde editoren is wel dat de Javascript-code apart wordt ingekleurd. Soms kan je alles zelfs rechtstreeks in de editor testen. Het is ook zeer interessant om een (aantal) Firefox-externsie(s) te installeren die je helpen bij de ontwikkeling en het testen van je Javascript-code. Een waardevol overzicht vind je op http://wiki.script.aculo.us/scriptaculous/show/JavaScriptDevelopmentTools . Het belangrijkste waar je op moet letten is dat de extensie op zijn minst de “Generated Code” kan laten zien. Dit is de code zoals ze er uit ziet na de bewerkingen van Javascript.
p. 7/66
Hoofdstuk 1 : Wat is Javascript? Auteur: Kris Aerts – Lesgever: Maarten Reynders
Hoofdstuk 2
Javascript basis 2.1 Javascript invoegen in HTML Zoals we reeds in hoofdstuk 1 vermeldden, is Javascript een HTML-extensie. Dat betekent dat we een HTML-document nodig hebben om daar Javascript aan toe te kunnen voegen, en zoals het de gewoonte is in HTML, kan dit met de juiste tags. <script language=”javascript” type=”text/javascript” > // hier komt Javascript-code Deze tags mogen eender waar in het HTML-document voorkomen en omsluiten Javascriptcode die onmiddellijk uitgerekend moet worden. Merk op dat je ook moet vermelden in welke taal het script geschreven is. In het oude HTML doe je dit met language=”javascript”; in XHTML met type=”text/javascript”. Meestal gebruiken we beide attributen. De script-tags kunnen ook voor andere talen gebruikt worden zoals vbscript, maar Javascript is de enige taal die op zo goed als alle browsers ondersteund wordt.
Wanneer je dit stukje code uitprobeert, zie je dat er niks gebeurt. Dat is normaal. De enige opdrachtregel die we gezet hebben // hier komt Javascript-code is immers commentaar en dat betekent dat we tekst kunnen plaatsen die wel zichtbaar is voor het menselijk oog, maar niet voor de browser die de Javascript-code moet uitvoeren. Terwijl er voor het menselijk oog dus één opdrachtregel staat, staan er voor de browser géén en gebeurt er dus niets. De commentaar-opdracht ziet er misschien wel overbodig uit, maar is het zeker niet. Met deze commentaar kunnen we in ons Javascript-programma het doel van het scriptje vermelden, moeilijke code uitleggen (aan onszelf voor later gebruik of aan anderen) of vertellen wie de auteur van het script is, kortom alles wat we willen vertellen aan de menselijke lezer van het script maar dat niet relevant is voor de browser. Een gouden regel is “beter te veel commentaar dan te weinig of geen commentaar”. Je gaat immers dikwijls in teams werken en code die jij dan vanzelfsprekend vindt, kan voor een andere ontwikkelaar behoorlijk moeilijk of gek zijn omdat hij/zij een andere piste in gedachten had. En zelfs wanneer je alleen werkt, is commentaar zeer zinvol want binnen een paar maanden is de kans zeer groot dat je niet meer weet wat precies de bedoeling van die code was. Een tweede mogelijkheid om Javascript in je HTML ta plaatsen, is als eventhandler bij een of ander HTML-object, bv. bij het document-object. Deze code wordt uitgevoerd op het moment dat het desbetreffende event optreedt. In onderstaand voorbeeld wordt de Javascriptcommentaar ‘uitgevoerd’ wanneer het document helemaal ingeladen is, nl. wanneer het Loadevent plaats vindt. Andere events zijn click, mouseMove, mouseEnter, … We komen hier later uitgebreid op terug.
Onze eerste Javascript Blablabla