Advertisement
Guest User

Untitled

a guest
Jan 29th, 2019
6,669
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 431.84 KB | None | 0 0
  1. Frontend programmeren
  2.  
  3. Frontend programmeren
  4. Mobiele webapps
  5. Gabriel Sánchez Cano
  6. Brinkman Uitgeverij · Amsterdam · 2016
  7. isbn 978 90 5752 331 1 / nur 124
  8. Omslagontwerp: Proforma, Barcelona
  9. Redactie en opmaak: Henk Pel
  10. © 2016 Brinkman Uitgeverij, Amsterdam
  11. Gehele of gedeeltelijke overneming of reproductie van de inhoud van deze uitgave, op welke
  12. wijze dan ook, zonder voorafgaande schriftelijke toestemming van de auteursrechthebbende
  13. is verboden, behoudens de beperkingen bij de wet gesteld. Het verbod betreft ook gehele of
  14. gedeeltelijke bewerking. De uitgever is met uitsluiting van ieder ander gerechtigd de door
  15. derden verschuldigde vergoedingen voor kopiëren, als bedoeld in artikel 17 Auteurswet 1912
  16. en in het kb van 20 juni 1974 (Stb. 351, 1974) ex artikel 16b Auteurswet 1912, te innen en/of
  17. daartoe in en buiten rechte op te treden.
  18. Correspondentie inzake overneming of reproductie richten aan:
  19. Brinkman Uitgeverij, Postbus 59686, 1040 ld Amsterdam
  20. www.brinkman-uitgeverij.nl
  21. tel. 020-4120970, fax 020-4120972
  22. e-mail: info@brinkman-uitgeverij.nl
  23. v
  24. Inhoud Inhoud
  25. 1 Basis HTML5 en CSS3—1
  26. 1.1 Inleiding 1
  27. Evolutie van HTML 1
  28. Lay-out en design van een webpagina 1
  29. Van concept tot realisatie 2
  30. De index of homepagina 2
  31. Mappenstructuur van het project 3
  32. HTML-editors 3
  33. Geneste elementen 5
  34. Browsers 6
  35. Meta-elementen 8
  36. Semantische elementen 10
  37. Hiërarchie van elementen 11
  38. id of class? 12
  39. 1.2 CSS3 13
  40. Inleiding 14
  41. CSS-syntaxis 14
  42. Stijlen coderen 17
  43. <head>-stijlen 17
  44. In-line-stijlen 18
  45. De stylesheet 22
  46. 1.3 Webkleuren 29
  47. 1.4 Navigatie 33
  48. Codering van de navigatie 33
  49. Ontwerp van de navigatie 36
  50. 1.5 Logo 42
  51. Codering van het logo 42
  52. Design van het logo 44
  53. 1.6 Hoofd-content 46
  54. Design van de hoofd-content 47
  55. Browser-prefi x 48
  56. 1.7 Positionering 51
  57. relatieve positie 52
  58. Lagen 56
  59. 1.8 Codering en design van de footer 60
  60. Symbolen in HTML 60
  61. vi Inhoud
  62. 1.9 De playlist-pagina 62
  63. Codering van playlist-pagina 63
  64. Wat zijn events? 65
  65. 1.10 De formulierpagina 76
  66. 1.11 De contactpagina 86
  67. Codering van de contactpagina 86
  68. Design van de contactpagina 87
  69. 1.12 Responsive design 88
  70. Grid-frameworks 89
  71. Gridless 89
  72. Voorbeeld van niet vloeiend design 89
  73. Voorbeeld van vloeiend design 90
  74. Responsive browser-knop 90
  75. @media query 91
  76. 1.13 Material design 95
  77. Materiaaleigenschappen 96
  78. Materiaal met objecten 97
  79. Licht en schaduw van objecten 98
  80. Materiaalomvorming 98
  81. Beweging en betekenis 99
  82. Eigenschappen van objecten en schaduwen 100
  83. Hiërarchie van objecten 101
  84. Interactie 101
  85. Beweging 101
  86. 1.14 Een material-design-sjabloon 104
  87. Hoofdmenu 105
  88. Het header-element 106
  89. Translate3d 109
  90. Het ~-teken 110
  91. Tabs 112
  92. Codering van de cards 114
  93. 1.15 Material-design-project 117
  94. De website XtreemTravel 117
  95. De welkomstpagina 118
  96. De windsurfi ng-pagina 118
  97. De mountainclimbing-pagina 119
  98. De snorkelenpagina 119
  99. Inhoud vii
  100. 2 JavaScript—121
  101. 2.1 Inleiding JavaScript 121
  102. JavaScript-console 123
  103. Taalcomponenten 124
  104. JavaScript-variabelen 126
  105. 2.2 Datatypes 131
  106. Het datatype string 132
  107. De methode typeof 132
  108. Het datatype: boolean 133
  109. Het datatype: number (integer) 133
  110. Het datatype: number (fl oating-point) 133
  111. parseInt() 134
  112. parseFloat() 134
  113. parseInt() 135
  114. toString() 135
  115. 2.3 Het Array-object 137
  116. Een Array-object declareren 138
  117. Array-elementen declareren 138
  118. Array-methodes 141
  119. Array-pointers 142
  120. 2.4 Objecten 152
  121. 2.5 Het Date-object 156
  122. Creëer een Date-object 156
  123. Creëer een Date-object met parameters 157
  124. Creëer een Date-object met string 158
  125. Creëer een Date-object met getallen 159
  126. 2.6 Date-methodes 160
  127. getFullYear 161
  128. 2.7 Beslissingsstructuren 162
  129. De opdracht if 162
  130. De clausule else 164
  131. AND-vergelijking 164
  132. De clausule else if 166
  133. De ternary-operator (? : ) 167
  134. 2.8 Stroomdiagrammen 169
  135. 2.9 Switch 171
  136. 2.10 Eigen functies 173
  137. Functie of methode 174
  138. Externe functies 176
  139. De tag <script source> 177
  140. Functies dynamisch uitvoeren 180
  141. Scope van variabelen 181
  142. De array arguments[] 182
  143. viii Inhoud
  144. 2.11 Lussen 184
  145. De for()-lus 185
  146. De functie charAt() 187
  147. 2.12 De for(in)-lus 190
  148. 2.13 De while()-lus 193
  149. De do-while()-lus 196
  150. 2.14 Het Math-object 197
  151. Math.abs(x) 198
  152. Math.ceil(x) 198
  153. Math.fl oor(x) 198
  154. Math.max() 199
  155. Math.min() 199
  156. Math.round() 200
  157. Math.random() 200
  158. 2.15 String-methodes 201
  159. indexOf() 202
  160. Length 204
  161. charAt() 204
  162. split() 204
  163. substring() 205
  164. substr() 206
  165. trim() 206
  166. toLowerCase() en toUpperCase() 206
  167. 2.16 Algoritmes 207
  168. Het algoritme binary-search 208
  169. Een voorbeeld 208
  170. Pseudocode 209
  171. 2.17 Het Document Object Model 213
  172. getElementById 214
  173. DOM-events (gebeurtenis) 214
  174. De functie setTimeout() 215
  175. De functie clearTimeout() 216
  176. Mouse-events 217
  177. Form-events 218
  178. Keyboard-events 222
  179. 2.18 Cookies 223
  180. Hoe werk je met cookies? 224
  181. JavaScript met cookies 225
  182. Browser en cookies 228
  183. 2.19 Een winkelwagentje in JavaScript 229
  184. Inhoud ix
  185. 3 OOP in JavaScript—235
  186. 3.1 Het UML class-diagram 235
  187. Class met properties 236
  188. Class met methodes 236
  189. Subclass 236
  190. 3.2 Het factory pattern 237
  191. Destructor 239
  192. Object-properties wijzigen 239
  193. 3.3 Constructor-pattern 240
  194. 3.4 Prototype-pattern 242
  195. Objecten kunnen berichten naar elkaar sturen 243
  196. 3.5 Inheritance (overerven) 244
  197. Overschrijven van parent-methodes 246
  198. Delete-function 247
  199. 3.6 Een OOP videoPlayer 248
  200. Rekenmachine algoritme 252
  201. 3.7 Speciale functions 253
  202. Externe methodes aan objecten koppelen 254
  203. Call 254
  204. Apply 256
  205. Bind 256
  206. 3.8 Anonieme functions 259
  207. Callback-functions 259
  208. Zelfuitvoerende functions 260
  209. Return-functions 260
  210. Function-closures 261
  211. Function-heredity 262
  212. 3.9 JSON-object-literals 264
  213. Objecten als properties van het object window 265
  214. Geneste JSON-object-literals 266
  215. Chaining properties 266
  216. Literal-objecten bundelen 267
  217. 3.10 Lokale opslagcapaciteit (local storage) 268
  218. Local storage lezen 269
  219. 3.11 OOP webshop 270
  220. Herbruikbare code 272
  221. x Inhoud
  222. 4 jQuery—277
  223. 4.1 Basis van mobiele applicaties 277
  224. Wat is een app? 278
  225. Native apps 278
  226. Webapps 278
  227. Hybride apps 279
  228. Native apps, webapps of hybride apps? 279
  229. Frameworks voor mobiele applicaties 279
  230. Een lokale testomgeving opzetten 280
  231. De webserver Apache 280
  232. Opera Mobile Emulator 281
  233. De ontwikkelomgeving 282
  234. De webapp Hello World 282
  235. Het element <meta viewport> 284
  236. Content Delivery Network (CDN) 284
  237. Data-role 284
  238. 4.2 Een testomgeving in de cloud opzetten 286
  239. 4.3 De webapp FlashTix 287
  240. De homepage 288
  241. Functioneel ontwerp van de homepage 288
  242. Header van de homepage 289
  243. Content van de homepage 291
  244. Footer van de homepage 292
  245. Design van de homepage 293
  246. Het attribuut data-icon 295
  247. Het attribuut data-iconpos 295
  248. 4.4 De lastminute-pagina 296
  249. Functioneel ontwerp 296
  250. Codering van de lastminute-pagina 297
  251. Content van de lastminute-pagina 298
  252. 4.5 De biopagina 300
  253. Functioneel ontwerp 300
  254. Codering van de biopagina 301
  255. Het element <video> 302
  256. Het element <source> 303
  257. Mediabestandsformaten 303
  258. 4.6 De bestelpagina 304
  259. Functioneel ontwerp van de bestelpagina 305
  260. Codering van de bestelpagina 305
  261. Het attribuut input type= "range" 307
  262. Data-role= "fi eldcontain" 307
  263. 4.7 Je eigen lastminute-webapp 310
  264. Functioneel ontwerp van de homepage 311
  265. Inhoud xi
  266. 4.8 jQuery programmeren 312
  267. De jQuery-wrapper 313
  268. jQuery-chains 313
  269. Use cases van de homepage 313
  270. DOM-elementen laden 314
  271. Content toevoegen: prepend() en append() 314
  272. Verwijderen: remove() 317
  273. 4.9 Events en event-handlers 318
  274. De functie bind() 319
  275. Events inspecteren 321
  276. De functie unbind() 322
  277. De functie one() 323
  278. De functie live() 323
  279. De functie die() 323
  280. De functie trigger() 323
  281. 4.10 Het canvas van HTML5 324
  282. Het canvasraster 325
  283. De canvas-context 325
  284. Tekenen in het canvas 325
  285. De canvasfunctie gradient() 326
  286. De fi llStyle 326
  287. De functie fi llRect() 327
  288. De functie strokeRect() 327
  289. De functie clearRect() 327
  290. Canvas: font en shadow 327
  291. Bogen en cirkels 328
  292. Interactief tekenen 328
  293. Canvasanimaties 329
  294. 4.11 Use cases van de lastminute-pagina 331
  295. Child-selectors 332
  296. De functie addClass() 333
  297. De functie CSS() 333
  298. Eigenschap-selectors [ ] 333
  299. De functie show() 334
  300. De functie hide() 334
  301. De wildcard-selectors van CSS 335
  302. De beginwaardeselector [^=] 335
  303. De eindwaardeselector [=] 336
  304. De wildcard-selector [*=] 336
  305. De functie size() 336
  306. De functie fi rst() 336
  307. De functie last() 336
  308. De functie html() 336
  309. De functie html(‘content’) 337
  310. xii Inhoud
  311. Elementen verplaatsen 337
  312. De functies after() en before() 337
  313. De each (iterator) 338
  314. De functie insertBefore( ) 338
  315. 4.12 Use cases van de biopagina 339
  316. data-role= "tabs" 340
  317. data-role= "navbar" 340
  318. class= "ui-body-d" 340
  319. De zoek-bar 341
  320. jQuery-plug-ins 341
  321. 4.13 Use cases van de bestelpagina 343
  322. Wat is AJAX? 343
  323. De functie .ajax() 344
  324. Het server-script 346
  325. 4.14 De e-ticketspagina 346
  326. Use cases van de e-ticketspagina 348
  327. 4.15 De agendapagina 348
  328. Functioneel ontwerp van de agendapagina 349
  329. Use cases van de agendapagina 350
  330. Codering van de agendapagina 350
  331. De knop Item toevoegen 350
  332. De knop Selecteren 352
  333. Local storage 353
  334. De agenda opnieuw laden 354
  335. De knop Verwijderen 354
  336. 4.16 De locatiepagina 355
  337. Codering van de locatiepagina 356
  338. Header en footer van de locatiepagina 357
  339. Use cases van de locatiepagina 357
  340. Content van de locatiepagina 358
  341. Google-markers 359
  342. Register—361
  343. 1
  344. 1 Basis HTML5 en CSS3
  345. 1.1 Inleiding
  346. HTML is de lingua franca van het internet. Het is de programmeertaal die de technologieën achter het internet heeft verenigd en bevordert alle communicatie binnen het internet. Alle communicatie loopt via webpagina’s en alle webpagina’s zijn
  347. in HTML geschreven.
  348. Evolutie van HTML
  349. HTML of HyperText Markup Language is in 1991 ontwikkeld door sir Tim Berners-Lee om wetenschappelijke documenten van het CERN, een Europese organisatie die fundamenteel onderzoek doet naar elementaire deeltjes, toegankelijk
  350. te maken. Al snel werden de mogelijkheden van HTML onderkend en in de loop
  351. der jaren verschenen steeds betere browsers. Het World Wide Web Consortium
  352. (W3C) nam in 1996 de ontwikkeling van HTML over. Versie HTML 3.2 kwam in
  353. januari 1997 tot stand. In december 1997 volgde een eerste versie van HTML 4,
  354. gevolgd door de eerste versie van HTML5 in januari 2008. Al in 2007 zei Steve Jobs
  355. dat HTML5 de software-Flash overbodig zou maken. Hij herhaalde zijn woorden
  356. bij de introductie van de iPad in 2010.
  357. De belangrijkste aanpassingen in HTML5 zijn het uniform afhandelen van fouten,
  358. de mogelijkheid om een document logischer op te bouwen en nieuwe invoertypes.
  359. HTML5 wordt ondersteund door alle nieuwe browsers, waaronder FireFox, Google
  360. Chrome en Safari.
  361. Lay-out en design van een webpagina
  362. Uit onderzoek blijkt dat de meeste webdesigners in de loop der jaren zijn gaan ontwerpen volgens dezelfde patronen. Bij de meeste moderne websites komen we het
  363. volgende ontwerp tegen:
  364. • een webpagina met een banner en navigatie bovenaan;
  365. • een of meer artikelen die de content vormen;
  366. • een kolom aan de rechterkant voor reclame;
  367. • een voettekst met bedrijfsinformatie onderaan.
  368. Een voorspelbare website is makkelijker om te navigeren en de informatie is eenvoudiger te vinden.
  369. 2 1 Basis HTML5 en CSS3
  370. Figuur 1.1 Lay-out van een webpagina
  371. Van concept tot realisatie
  372. In de volgende paragrafen maken we een website voor Radio GaGa. Radio GaGa
  373. wil een website met een mooi vormgegeven homepage en met links naar playlists
  374. waar de users naar muziek kunnen luisteren of video’s van concerten kunnen bekijken. Daarna komt een pagina met een formulier voor het bestellen van tickets voor
  375. concerten.
  376. Dit project pakken we op de volgende manier aan.
  377. Ten eerste splitsen we het project op in kleinere delen en ten tweede wisselen we
  378. bij ieder deel tussen markup (tags in de vorm van code) en design (ontwerp). In dit
  379. hoofdstuk maken we de volgende webpagina’s:
  380. • playlist.html
  381. • formulier.html
  382. • contact.html
  383. De index of homepagina
  384. We beginnen met het maken van de indexpagina. Deze pagina moet er als volgt
  385. uitzien:
  386. 1.1 Inleiding 3
  387. Figuur 1.2 De indexpagina
  388. Deze pagina krijgt bovenaan een navigatiebar met daarin de navigatie naar de andere pagina’s. Daaronder komt het logo van Radio GaGa. Onder het logo komt de
  389. content. De content bestaat uit een draaiende disk. Links en rechts, in het midden
  390. van de pagina, komen bladerknoppen met een simpele navigatie naar de volgende
  391. of de vorige pagina. Als laatste maken we de footer van de pagina met links naar
  392. Twitter, YouTube en Facebook van Radio GaGa.
  393. Mappenstructuur van het project
  394. Een gestructureerde aanpak betekent een duidelijke mappenstructuur voor ons
  395. project zodat we precies weten waar onze HTML en content te vinden is. De volgende fi guur toont de gewenste structuur:
  396. Figuur 1.3
  397. HTML-editors
  398. Om de opgaven en lab-opdrachten uit dit boek te kunnen maken heb je een
  399. HTML-editor nodig. Een HTML-editor is een applicatie voor het schrijven van
  400. HTML-teksten. Deze teksten noemen we webpagina’s. Hierzijn twee websites waar
  401. je gratis HTML-editors kunt downloaden:
  402. 4 1 Basis HTML5 en CSS3
  403. • Brackets download je vanaf de volgende website: http://brackets.io/?lang=en
  404. • Sublime text download je vanaf de volgende website: http://www.sublimetext.com
  405. Na het downloaden en installeren van je favoriete editor begin je met het coderen
  406. van de indexpagina.
  407. In deze paragraaf maken we de code van de indexpagina. We maken kennis met de
  408. volgende HTML-elementen:
  409. • comments
  410. • DOCTYPE
  411. • geneste elementen
  412. • meta-elementen
  413. • semantische elementen
  414. • ID en classes
  415. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  416. Planning Inleveren
  417. Webbouw 1 t/m 4
  418. Lab 01
  419. HTML-elementen
  420. Webpagina’s bestaan uit platte tekst met markeringstekens, ook wel aangeduid
  421. als tags. Hierin wordt de lay-out aangegeven, oftewel hoe de tekst gestructureerd
  422. wordt. De tags worden door de webrowser geïnterpreteerd en de gebruiker krijgt
  423. de opgemaakte tekst in de vorm van een webpagina te zien. Een markering tussen
  424. haakjes, bijvoorbeeld <html> of <form>, wordt een tag genoemd. De syntaxis van
  425. tags is als volgt:
  426. <open tag> content van de tag </sluiten tag>
  427. Als je een begintag hebt geopend, bijvoorbeeld <html>, eindig je altijd met een eindtag, bijvoorbeeld </html>. Je ziet dat de eindtag altijd een / bevat.
  428. We beginnen nu met het coderen van onze eerste webpagina: de indexpagina.
  429. • Webbouw 1
  430. Open je favoriete HTML-editor en typ de volgende code. Sla het bestand op als
  431. index.html in de map RadioGaGa.
  432. <!-- website RadioGaGa -->
  433. <!DOCTYPE html>
  434. <html lang="nl">
  435. <head>
  436. <meta http-equiv="Content-Type"
  437. 1.1 Inleiding 5
  438. content="text/html;
  439. charset=UTF-8">
  440. <title>RadioGaGa</title>
  441. </head>
  442. <body>
  443. . . .
  444. </body>
  445. </html>
  446. Op de puntjes coderen we verder de content van de pagina tussen de tags <body> en
  447. </body> in.
  448. Hier volgt een uitleg over de elementen in Webbouw 1.
  449. Element <!-- commentaren -->
  450. We begonnen de code met het commentaar:
  451. <!-- website RadioGaGa -->
  452. Zulk soort commentaar kunnen we overal op de pagina plaatsen en ze zijn bedoeld
  453. om de structuur en code van de pagina toe te lichten. Een commentaar heeft geen
  454. eff ect op de weergave van de pagina.
  455. Element <!DOCTYPE html>
  456. Browsers kunnen meerdere soorten documenten interpreteren, zoals webpagina’s
  457. en PDF’s. Het is daarom belangrijk om ons HTML-document te identifi ceren met
  458. de tag <!DOCTYPE html>. Zo kan de browser onze code vertalen in een webpagina.
  459. Element <html lang="nl">
  460. De tweede regel in Webbouw 1 is het element <html>. We coderen de namen van
  461. alle tags in kleine letters. De enige tag met hoofdletters is het element <!DOCTYPE>.
  462. Sommige elementen kunnen attributen bevatten. Alle attributen krijgen een
  463. naam en een waarde tussen dubbele aanhalingstekens. In dit geval is het attribuut
  464. lang="nl". Zo geef je aan dat de content van deze pagina in het Nederlands wordt
  465. geschreven.
  466. Element </html> sluiten
  467. Zoals te zien is sluiten we alle elementen met het slash-teken (/). Alle elementen
  468. moeten gesloten worden. Als je een element niet goed sluit, leidt dit tot fouten in
  469. het weergeven van de pagina.
  470. Geneste elementen
  471. Het eerste wat opvalt in Webbouw 1 zijn de geneste elementen. Dat zijn elementen
  472. binnen andere elementen. In dit geval bevat <html> de elementen <head> en <body>.
  473. Het <head>-element bevat op zijn beurt de <meta>- en <title>-elementen. Een genest element begin je met de Tab-toets. Bijvoorbeeld:
  474. 6 1 Basis HTML5 en CSS3
  475. <html lang="nl">
  476. <head>
  477. <meta http-equiv="Content-Type"
  478. content="text/html;
  479. charset=UTF-8">
  480. <title>RadioGaGa</title>
  481. </head>
  482. <body>
  483. . . .
  484. </body>
  485. </html>
  486. We gebruiken Tab’s om de code leesbaarder te maken. Zo zien we in één oogopslag
  487. welke elementen andere geneste elementen bevatten. Het gebruiken van Tab’s heeft
  488. geen eff ect op het weergeven van de webpagina.
  489. Geneste elementen moeten in de juiste volgorde worden gesloten. Een genest element moet als eerste gesloten worden. Daarna sluit je het element van het niveau
  490. hoger. De volgende fi guur laat zien hoe je geneste elementen goed sluit.
  491. Figuur 1.4 Geneste elementen
  492. Element <head>
  493. We hebben de webpagina ingedeeld in <head> (hoofd) en <body> (lichaam). We gebruiken het <head>-element voor meta-informatie en voor andere elementen zoals
  494. <title>, en het <body>-element voor de content.
  495. Element <title>
  496. Iedere pagina krijgt een titel. De volgende regel zorgt er bijvoorbeeld voor dat de
  497. titel RadioGaGa bovenaan de browser verschijnt:
  498. <title>RadioGaGa</title>
  499. De titel RadioGaGa verschijnt, maar niet de <title>-tags.
  500. Na het opslaan van Webbouw 1 als index.html in de map RadioGaGa controleren
  501. we het resultaat in meerdere browsers.
  502. Browsers
  503. Om de resultaten van de opgaven en de lab-opdrachten te kunnen zien moeten we
  504. eerst de volgende browsers downloaden en installeren.
  505. 1.1 Inleiding 7
  506. Browser Website
  507. https://www.google.nl/chrome/browser/desktop/
  508. https://support.mozilla.org/nl
  509. http://www.opera.com/
  510. http://safari.nl.softonic.com/
  511. http://windows.microsoft.com/nl-nl/internet-explorer/
  512. download-ie
  513. Na het downloaden en installeren van deze browsers openen we het bestand index.html door er met de muis op te klikken. De browser presenteert de code van
  514. Webbouw 1 zoals te zien is in de volgende fi guur.
  515. Figuur 1.5 Het resultaat van Webbouw 1
  516. LET OP
  517. Gebruik dubbele aanhalingstekens (") in plaats van twee enkele aanhalingstekens
  518. (' '). Bijvoorbeeld:
  519. <html lang=''nl''> is niet correct.
  520. <html lang="nl"> is correct.
  521. We krijgen alleen maar de puntjes binnen het <body>-element te zien. In ons geval
  522. hebben we Mozilla gebruikt. Het is dus niet nodig om een eigen domeinnaam bij
  523. een provider aan te schaff en om de resultaten van de opgaven te kunnen zien. Met
  524. de browsers kunnen we zowel internetten als onze webpagina’s bekijken. Als je later je eigen website wilt uploaden moet je wel een eigen domeinnaam aanschaff en.
  525. 8 1 Basis HTML5 en CSS3
  526. Meta-elementen
  527. We gebruiken <meta>-elementen voor het toevoegen van meta-informatie. Dit
  528. is informatie over de informatie van de pagina. Deze informatie is relevant voor
  529. browsers en zoekmachines. Google en Yahoo maken gebruik van deze informatie
  530. in hun zoekalgoritmes. We kunnen meta-elementen ook gebruiken voor andere
  531. doelen, zoals het automatisch laden van een andere pagina. Ieder meta-element
  532. bevat de attributen:
  533. name
  534. content
  535. Bijvoorbeeld, om de naam van de auteur van de pagina aan te duiden codeer je het
  536. volgende:
  537. name="author" content="naam van auteur"
  538. In de volgende opgave coderen we belangrijke meta-informatie over de te bouwen
  539. website.
  540. Een meta-tag hoef je niet te sluiten met een / (het slash-teken).
  541. LET OP
  542. We mogen een lange HTML-tag alleen afbreken na een spatie. Dit doen we bijvoorbeeld om de code te verduidelijken.
  543. • Webbouw 2
  544. Open index.html en voeg de volgende meta-informatie eraan toe.
  545. <head>
  546. <meta http-equiv="Content-Type"
  547. content="text/html;
  548. charset=UTF-8">
  549. <meta name="robots" content="all">
  550. <meta name="language" content="Dutch">
  551. <meta name="author" content="je eigen naam">
  552. <meta name="description"
  553. content="RadioGaGa marketing">
  554. <meta name="keywords"
  555. content="RadioGaGa, muziek, playlist">
  556. <meta name="copyright" content="copyright">
  557. <title>RadioGaGa</title>
  558. </head>
  559. <body>
  560. . . .
  561. </body>
  562. </html>
  563. Hieronder volgt een uitleg over Webbouw 2.
  564. 1.1 Inleiding 9
  565. <meta charset>
  566. Charset is de set tekens ontworpen voor computers. In Webbouw 2 hebben we het
  567. volgende attribuut gespecifi ceerd:
  568. charset="UTF-8"
  569. Dit is de karakterset voor alle Europese talen. Maar er zijn andere karaktersets,
  570. bijvoorbeeld:
  571. charset taal
  572. charset="ISO-8859-6" Grieks
  573. charset="ISO-8859-7" Arabisch
  574. charset="UTF-8" Europese talen
  575. <meta name="robots">
  576. Gebruik deze tag als je gevonden wilt worden door zoekmachines:
  577. <meta name="robots" content="all">
  578. <meta name="language">
  579. Om de taal van de content specifi ek aan te geven gebruiken we dit attribuut:
  580. <meta name="language" content="Dutch">
  581. <meta name="author">
  582. Om de naam van de auteur van de pagina aan te geven gebruiken we:
  583. <meta name="author" content="je eigen naam">
  584. <meta name="description">
  585. Voor een korte beschrijving van de website gebruiken we het attribuut description:
  586. <meta name="description"
  587. content="RadioGaGa marketing">
  588. <meta name="keywords">
  589. Voor een lijst met sleutelwoorden over de website gebruiken we het attribuut
  590. keywords:
  591. <meta name="keywords"
  592. content="RadioGaGa, muziek, playlist">
  593. <meta http-equiv="refresh">
  594. Het attribuut http-equiv="refresh" kunnen we gebruiken om het aantal seconden
  595. voor het refreshen van deze pagina te specifi ceren. Het kan ook de naam van een
  596. pagina aangeven waar we na een aantal seconden automatisch naar willen doorlinken, bijvoorbeeld een inleidingpagina:
  597. 10 1 Basis HTML5 en CSS3
  598. <meta http-equiv=
  599. "refresh"content="10;url=http://website.com">
  600. Semantische elementen
  601. De volgende HTML5-elementen hebben een semantische betekenis die de positie
  602. en het doel van het element in een webpagina beschrijven.
  603. <head> hoofd
  604. <body> lichaam
  605. <nav> navigatie
  606. <main> hoofd-content
  607. <section> sectie
  608. <div> divisie
  609. <p> paragraaf
  610. <footer> voet
  611. Element <body>
  612. Na het defi niëren van het <head>-element met alle <meta>- en <title>-elementen
  613. kunnen we verder met het coderen van de structuur van de pagina. Dit doen we
  614. binnen het <body>-element.
  615. Element <nav>
  616. Binnen het <nav>-element coderen we de elementen die nodig zijn voor de navigatie van de website.
  617. Element <main>
  618. In het <main>-element coderen we de hoofd-content van de pagina, bijvoorbeeld
  619. een groep afbeeldingen en teksten die het thema van de pagina defi niëren.
  620. Element <section>
  621. Het <main>-element mag één of meer secties of kolommen hebben. Dit doen we
  622. met het <section>-element. Hier kunnen we verschillende gerelateerde content met
  623. een thema combineren. Bijvoorbeeld, een <section>-element met het thema sport
  624. mag een sectie sport en een sectie sportnieuws hebben.
  625. Element <div>
  626. Binnen het element <div> plaatsen we generieke (diverse) content, bijvoorbeeld
  627. algemene plaatjes en teksten. Een <section> mag meerdere <div>’s hebben.
  628. Element <footer>
  629. Het <footer>-element is bedoeld voor informatie over het bedrijf, de webdesigner
  630. en de copyrights. Ook kunnen we hier belangrijke links vinden.
  631. 1.1 Inleiding 11
  632. • Webbouw 3
  633. Open index.html en vervang de puntjes door de volgende secties:
  634. <body>
  635. <nav>
  636. <h3>Navigatie</h3>
  637. </nav>
  638. <div id="logo">
  639. <h3>Logo</h3>
  640. </div>
  641. <main>
  642. <h4>Hoofd-content</h4>
  643. </main>
  644. <footer>
  645. <h3>Footer</h3>
  646. </footer>
  647. </body>
  648. </html>
  649. Hiërarchie van elementen
  650. Parent-elementen bevatten child-elementen en dit zijn geneste elementen. Het
  651. <html>-element is het parent-element van alle andere elementen. Het <body>-
  652. element is een child-element van het <html>-element maar ook een parent-element
  653. van de elementen <nav>, <main> en <footer>.
  654. Figuur 1.6
  655. Elementen <h1> tot <h6>
  656. Met de elementen <h1> tot <h6> defi niëren we de lettergrootte van teksten binnen
  657. de elementen. Bijvoorbeeld:
  658. 12 1 Basis HTML5 en CSS3
  659. <h1>RadioGaGa</h1>
  660. <h2>RadioGaGA</h2>
  661. <h3>RadioGaGa</h3>
  662. <h4>RadioGaGa</h4>
  663. <h5>RadioGaGA</h5>
  664. <h6>RadioGaGA</h6>
  665. id of class?
  666. Als je een element identifi ceert met het attribuut id=, dan moet dit een unieke
  667. naam zijn. We mogen geen twee elementen met dezelfde id benoemen. In Webbouw 3 hebben we het element:
  668. <div id="logo">
  669. Wanneer je meerdere elementen dezelfde visuele attributen wilt geven, krijgen ze
  670. allemaal dezelfde class. Bijvoorbeeld:
  671. <div id="logo" class="blauw">
  672. <div id="footer" class="blauw">
  673. Zo identifi ceren we elementen om ze later visuele attributen te kunnen geven. Dat
  674. doen we in de volgende paragraaf wanneer we beginnen met het coderen van CSSstylesheets.
  675. Figuur 1.7
  676. LET OP
  677. Als je geen resultaat krijgt dan moet je je code verbeteren. De meest voorkomende
  678. beginnersfouten zijn het niet goed afsluiten van de tags.
  679. Ook spellingsfouten bij namen van de elementen zijn een probleem. Bijvoorbeeld
  680. <budy> in plaats van <body>.
  681. Of <htm1> met het getal 1 in plaats van <html> met de letter l.
  682. Het resultaat van deze fouten kan een lege pagina in de browser zijn.
  683. 1.2 CSS3 13
  684. • Webbouw 4
  685. Open index.html en voeg het nieuwe <div>-element binnen het <main>-element
  686. toe:
  687. <div id="disc"> <h4>Disc</h4>
  688. Binnen disc voeg je het volgende element toe:
  689. <div id="center"> <h4>Center</h4>
  690. Het resultaat moet er als volgt uitzien:
  691. Figuur 1.8
  692. • Lab 01
  693. In deze lab-opdracht maak je een nieuw script en sla je het op als labs.html. In dit
  694. script maak je vier div’s met de volgende hiërarchie:
  695. div 1
  696. div 2
  697. div 3
  698. div 4
  699. 1.2 CSS3
  700. In deze paragraaf beginnen we met de vormgeving van de indexpagina. We maken
  701. kennis met de volgende CSS-attributen:
  702. • width
  703. • height
  704. • commentaren
  705. • background
  706. • overfl ow
  707. • text-align
  708. • margin
  709. • border
  710. 14 1 Basis HTML5 en CSS3
  711. • font
  712. • box-shadow
  713. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  714. Planning Inleveren
  715. Oefening 1 t/m 6
  716. Webbouw 5 t/m 6
  717. Lab 02
  718. CSS (Cascading Style Sheets) is ontstaan uit onvrede onder webdesigners over
  719. het gebruik van HTML-tags voor het opmaken van webpagina’s. De CSS Working
  720. Group van de W3C heeft versie 1 van CSS al eind 1996 ontwikkeld. Het gaf designers voor het eerst de mogelijkheid om de opmaak van lettertypen en de positie
  721. van de elementen van een webpagina te bepalen.
  722. Inleiding
  723. CSS3 biedt meer geavanceerde mogelijkheden en dringt het aantal Javascriptelementen terug, waardoor de totale omvang van een pagina kleiner wordt, wat ten
  724. goede komt aan de ranking bij zoekmachines. Belangrijk zijn daarnaast de grafi -
  725. sche mogelijkheden, zoals drop shadows, ronde hoeken, meerdere achtergronden,
  726. animaties en transparanties.
  727. CSS-syntaxis
  728. Met CSS-commando’s kunnen we één of meer HTML-elementen selecteren om
  729. vervolgens stijlattributen toe te wijzen. Zo kunnen we de geselecteerde elementen
  730. visuele eigenschappen toeschrijven. Elk commando heeft de volgende syntaxis:
  731. selector {attribuut: waarde;}
  732. Het commando bestaat uit twee delen:
  733. selector { attribuut:waarde ; }
  734. 1 Selector is de naam van het HTML-element dat we willen selecteren.
  735. 2 Het paar attribuut:waarde beschrijft het attribuut en de attribuutwaarde die we
  736. willen toekennen aan het geselecteerde HTML-element.
  737. We schrijven de naam van het HTML-element zonder de haakjes < >. Tussen de
  738. accolades { } schrijven we het paar attribuut:waarde. We eindigen met een puntkomma. We kunnen de geselecteerde elementen een of meer attributen toekennen,
  739. bijvoorbeeld:
  740. h1 {
  741. attribuut1: waarde1;
  742. attribuut2: waarde2;
  743. }
  744. 1.2 CSS3 15
  745. Elementen selecteren
  746. Hier zien we een voorbeeld van het selecteren van meerdere HTML-elementen om
  747. vervolgens visuele attributen toe te wijzen.
  748. We passen de syntaxis toe:
  749. h1 {
  750. color: black;
  751. text-align: center;
  752. }
  753. color en text-align
  754. In het vorige voorbeeld hebben we alle <h1>-elementen geselecteerd om vervolgens
  755. het attribuut color (tekstkleur) toe te wijzen. Het attribuut color heeft de waarde
  756. black (zwart) gekregen. Het resultaat is dat de content van alle <h1>-elementen
  757. zwart wordt weergegeven. Het attribuut text-align (tekst uitlijnen) krijgt de
  758. waarde center (centreren). De attributen color en text-color zijn verwisselbaar en
  759. worden herkend door alle browsers.
  760. Een #id selecteren
  761. Om een uniek element te selecteren gebruiken we de id van het element. Bijvoorbeeld, in index.html is er het element <div id="logo">. We kunnen door middel
  762. van de id dit specifi eke element selecteren.
  763. Hier passen we de syntaxis toe:
  764. #logo {
  765. height: 200px;
  766. }
  767. Omdat geen twee elementen dezelfde id mogen hebben, hebben we hier het specifi eke element met id="logo" geselecteerd en het attribuut height (hoogte) toegekend met de waarde 200px, met andere woorden: 200 pixels hoog.
  768. Een .class selecteren
  769. Om alle elementen met dezelfde class-naam te selecteren gebruiken we een punt
  770. gevolgd door de naam van de class. We kunnen door middel van de class-naam
  771. visuele attributen voor meerdere elementen defi niëren.
  772. Hier passen we de syntaxis toe:
  773. .blauw {
  774. height: 200px;
  775. }
  776. Wat zijn pixels?
  777. Een pixel is een vierkante punt op het beeldscherm van je PC. De resolutie van
  778. beeldschermen wordt weergegeven in aantallen pixels. Schermen van smart-telefoons hebben bijvoorbeeld 600 pixels in de breedte en schermen van pc’s hebben
  779. tot 1200 pixels in de breedte. Pixels zijn erg klein. Om de pixels van een beeld te
  780. 16 1 Basis HTML5 en CSS3
  781. zien moeten we de afbeelding vergroten. In de volgende fi guur zien we de pixels
  782. van de afbeelding.
  783. Figuur 1.9
  784. width en height
  785. Met de attributen width (breedte) en height (hoogte) defi niëren we de dimensies
  786. van de elementen in pixels en percentages, bijvoorbeeld:
  787. #logo {
  788. width: 100%;
  789. height: 200px;
  790. }
  791. color
  792. Om te werken met tekst in kleur gebruiken we het attribuut color als volgt:
  793. color: black;
  794. backgroundColor
  795. De attributen background, background-color en backgroundColor zijn verwisselbaar en
  796. herkend bij alle browsers.
  797. Nieuwe HTML-properties, zoals backgroundColor, worden geschreven in camelCase. Dat wil zeggen, zonder verbindingsstreepje en de eerste letter van het tweede
  798. woord krijgt een hoofdletter, dus backgroundColor.
  799. Om een achtergrondkleur toe te passen gebruiken we het attribuut backgroundColor
  800. als volgt:
  801. backgroundColor: red;
  802. Hier volgt een lijst met de meest voorkomende webkleuren – waarbij je ook het
  803. gebruik van camelCase ziet:
  804. aqua
  805. aquaMarine
  806. black
  807. blue
  808. blueViolet
  809. brown
  810. cadetBlue
  811. chocolate
  812. 1.2 CSS3 17
  813. coral
  814. crimson
  815. darkBlue
  816. gray
  817. green
  818. greenYellow
  819. indigo
  820. orangeRed
  821. red
  822. border
  823. Borders zijn de randen van de elementen. Met het attribuut border bepalen we de
  824. stijl, kleur en dikte van de borders. Er zijn de volgende stijlen:
  825. border: solid ononderbroken
  826. border: dotted puntjes
  827. border: dashed streepjes
  828. Bijvoorbeeld de volgende borderstijlen:
  829. border: 2px dotted black;
  830. backgroundColor: orange;
  831. geven een zwarte rand van puntjes van 2 pixels dik met een oranje achtergrond,
  832. zoals hieronder:
  833. Stijlen coderen
  834. Er zijn drie manieren om stijlen te declareren:
  835. 1. Binnen het <head>-element (voor korte opdrachten)
  836. 2. In line (voor het direct toepassen van stijlen)
  837. 3. In een externe style sheet (voor grotere opdrachten)
  838. <head>-stijlen
  839. Stijlen binnen de <head> coderen we met de tags <style> en </style>, bijvoorbeeld:
  840. <head>
  841. <style>
  842. body{
  843. width: 40%;
  844. font-size: 22px;
  845. }
  846. </style>
  847. </head>
  848. 18 1 Basis HTML5 en CSS3
  849. Hier hebben we stijlen voor de <body> gecodeerd.
  850. In-line-stijlen
  851. In-line-stijlen coderen we direct binnen een element met de eigenschap style=,
  852. bijvoorbeeld:
  853. <h1 style="color: green;">
  854. Hier zeggen we dat de tekstkleur in element <h1> groen is.
  855. In de volgende opgave passen we twee methodes toe bij het coderen van stijlen.
  856. Hier volgt een aantal extra oefeningen om de CSS-attributen goed te doorgronden
  857. • Oefening 1: backgroundColor
  858. Open een nieuw bestand en sla het op als oefening.html. Voeg de volgende code
  859. toe:
  860. <!DOCTYPE html>
  861. <html lang="nl">
  862. <head>
  863. <meta http-equiv="Content-Type"
  864. content="text/html;
  865. charset=UTF-8">
  866. <title>Oefening</title>
  867. <style>
  868. body{
  869. border: 1px solid black;
  870. width: 40%;
  871. font-size: 80px;
  872. }
  873. #A{
  874. width: 150px;
  875. height: 150px;
  876. backgroundColor: green;
  877. }
  878. #B{
  879. width: 150px;
  880. height: 150px;
  881. backgroundColor: red;
  882. }
  883. #C{
  884. width: 150px;
  885. height: 150px;
  886. backgroundColor: blue;
  887. }
  888. </style>
  889. </head>
  890. 1.2 CSS3 19
  891. <body>
  892. <div id="A">
  893. A
  894. </div>
  895. <div id="B">
  896. B
  897. </div>
  898. <div id="C">
  899. C
  900. </div>
  901. </body>
  902. </html>
  903. Figuur 1.10 Resultaat van oefening 1
  904. • Oefening 2: Borders
  905. In deze oefening coderen we in-line-stijlen, bijvoorbeeld:
  906. <div style="border: 1px solid black;">
  907. voor de borders van elementen A, B en C:
  908. • A met een ononderbroken zwarte rand met een dikte van 1 pixel.
  909. • B met een ononderbroken zwarte rand met een dikte van 2 pixels.
  910. • C met een ononderboken en gestippelde rand met een dikte van 3 pixels.
  911. Figuur 1.11 Resultaat met borders
  912. • Oefening 3: Marges
  913. In deze oefening gaan we meer stijlen toevoegen binnen de <head>.
  914. <head>
  915. <style>
  916. ...
  917. </style>
  918. </head>
  919. 20 1 Basis HTML5 en CSS3
  920. A krijgt de volgende marges:
  921. • Een bovenmarge van 10 pixels.
  922. • Een linkermarge van 10 pixels.
  923. B krijgt de volgende marges:
  924. • Een bovenmarge van 20 pixels.
  925. • Een linkermarge van 70 pixels.
  926. • Een ondermarge van 20 pixels.
  927. C krijgt de volgende marges:
  928. • Een auto linkermarge.
  929. • Een auto rechtermarge.
  930. • Een ondermarge van 30 pixels.
  931. Figuur 1.12 Resultaat met marges
  932. • Oefening 4: Padding
  933. De padding (invulling) verwijst naar de ruimte tussen de rand en de content van een
  934. element. Een padding geven we aan in percentages of pixels. Bijvoorbeeld:
  935. padding: 10px 5px 0% 30px;
  936. is hetzelfde als:
  937. padding-top: 10px;
  938. padding-right: 5px;
  939. padding-bottom: 0%;
  940. padding-left: 30px;
  941. Wanneer alle paddings gelijk zijn zeggen we gewoon:
  942. padding: 5%;
  943. Codeer in de <head> de volgende stijlen voor A en C.
  944. • A met een linker-padding van 25 pixels.
  945. • C met een rechter-padding van 25 pixels.
  946. 1.2 CSS3 21
  947. Figuur 1.13 Resultaat met paddings
  948. In deze fi guur zien we dat elementen A en C breder dan B zijn geworden. Dat komt
  949. door de toegevoegde paddings. Het resultaat is dat A en C nu 175 pixels breed zijn.
  950. • Oefening 5: Box-shadow
  951. Voor schaduwen van elementen gebruiken we box-shadow. Bijvoorbeeld:
  952. box-shadow: 5px 5px 10px black;
  953. Hier coderen we een zwarte schaduw van:
  954. • 5 pixels rechts
  955. • 5 pixels onder
  956. • 10 pixels straal
  957. Met negatieve getallen kunnen we experimenteren met negatieve schaduwen, bijvoorbeeld:
  958. box-shadow:-5px -5px 10px black;
  959. Dit is een schaduw met:
  960. • 5 pixels links
  961. • 5 pixels boven
  962. Codeer in de <head> schaduwstijlen voor A, B en C.
  963. • A met een groene schaduw van 5px bij 5px en met een straal van 10px.
  964. • B met een zwarte schaduw van -5px bij -5px (negatieve) en met een straal van 10px.
  965. • C met een blauwe schaduw van 0px bij 5px y (onder) en met een straal van 10px.
  966. Figuur 1.14 Resultaat met schaduwen
  967. 22 1 Basis HTML5 en CSS3
  968. • Oefening 6: Tekstschaduw
  969. We kunnen ook schaduwen coderen voor teksten. Bijvoorbeeld:
  970. text-shadow: 5px 5px 10px black;
  971. Dit is een positieve schaduw voor teksten. Het lijkt alsof het licht van boven links
  972. komt. Met negatieve getallen kunnen we met negatieve schaduwen experimenteren. Bijvoorbeeld:
  973. text-shadow:-5px -5px 10px black;
  974. Codeer in de <head> schaduwen voor de teksten A, B en C.
  975. • A met rode tekst en een rode schaduw
  976. • B met groene tekst en een negatieve groene schaduw
  977. • C met witte tekst en een witte schaduw onder
  978. Figuur 1.15 Resultaat met tekstschaduw
  979. Hier merken we op dat de schaduw van de letters dezelfde richting uitgaan, net als
  980. de schaduwen van de borders.
  981. De stylesheet
  982. In de volgende opgave maken we onze eerste stylesheet met de naam styles en met
  983. de extensie .css. Alle stylesheets krijgen de extensie .css dat staat voor Cascading
  984. Style Sheet.
  985. • Webbouw 5
  986. Codeer de volgende stijlen en sla ze op als styles.css in dezelfde map als
  987. index.html. De uitleg volgt later.
  988. /* Stijlen voor RadioGaGA */
  989. html{
  990. height: 100%;
  991. width: 100%;
  992. background: #lightgray;
  993. overflow: auto;
  994. }
  995. body{
  996. width: 96%;
  997. margin-top: 0;
  998. 1.2 CSS3 23
  999. margin-left: auto;
  1000. margin-right: auto;
  1001. margin-bottom: 5%;
  1002. border: 1px solid;
  1003. overflow: inherit;
  1004. backgroundColor: #fff;
  1005. text-align: center;
  1006. font-family: Verdana, Arial, sans-serif;
  1007. color: #000;
  1008. font-size: 16px;
  1009. font-style: normal;
  1010. }
  1011. h3{
  1012. margin: 0;
  1013. box-shadow: 4px 4px 10px rgba(0,0,0,0.5);
  1014. }
  1015. De <link>-tag
  1016. Om onze webpagina te verbinden met onze stylesheet gebruiken we de tag <link>.
  1017. Zo kunnen we onze stijlen linken met een of meerdere webpagina’s. In de volgende
  1018. opgave linken we index.html met het bestand stijlen.css.
  1019. • Webbouw 6
  1020. Open index.html en voeg de volgende <link>-tag eraan toe. Dit moet gebeuren
  1021. binnen je <head>-element.
  1022. <!DOCTYPE html>
  1023. <html>
  1024. <head>
  1025. <meta http-equiv="Content-Type"
  1026. content="text/html;
  1027. charset=UTF-8">
  1028. <link rel="stylesheet" href="styles.css">
  1029. <title>RadioGaGa</title>
  1030. </head>
  1031. De tag <link> bevat de volgende attributen:
  1032. rel="stylesheet" Stelt de relatie vast met stylesheet
  1033. href="styles.css" Verwijst naar het bestand styles.css
  1034. Open index.html met een browser. Als alles goed is verlopen zie je de volgende
  1035. fi guur.
  1036. 24 1 Basis HTML5 en CSS3
  1037. Figuur 1.16
  1038. Als je andere resultaten krijgt, kijk dan nogmaals naar je code en je stijlen en zie
  1039. of je fouten kaunt verbeteren. Zorg ervoor dat de <link> tussen je twee bestanden
  1040. goed werkt.
  1041. Breedte in percentages
  1042. Het is raadzaam om percentages te gebruiken voor de breedte van je elementen. Zo
  1043. zorg je ervoor dat als het browservenster kleiner wordt de breedte van je <body>-
  1044. element altijd 96% van het venster blijft. We zeggen dan dat de breedte van je elementen elastisch is.
  1045. Hieronder zie je een <body>-element met een vaste breedte van 1400px. Een element
  1046. met een vaste breedte schikt zich niet naar de breedte van het venster.
  1047. Figuur 1.17
  1048. Hier volgt een uitleg van de stijlen in Webbouw 5.
  1049. 1.2 CSS3 25
  1050. /* commentaar */
  1051. Met commentaar kunnen we onze stijlen beschrijven. CSS-commentaar plaatsen
  1052. we tussen /* en */ in. Bijvoorbeeld:
  1053. /* Stylen voor RadioGaGa */
  1054. backgroundColor
  1055. Het <html>-element heeft een grijze achtergrond gekregen met:
  1056. backgroundColor: lightgray;
  1057. overfl ow
  1058. Als een element te klein is voor de tekstinhoud dan zeggen we dat de tekst overloopt. In deze gevallen kunnen we kiezen voor het tonen van een scrollbar (schuifbalk).
  1059. overflow: auto;
  1060. text-align
  1061. Je ziet in het resultaat van Webbouw 5 en 6 dat alle teksten gecentreerd zijn weergegeven. Het attribuut text-align (tekst uitlijnen) kent vier opties:
  1062. text-align: left links uitlijnen
  1063. text-align: center centreren
  1064. text-align: right rechts uitlijnen
  1065. text-align: justify de tekst uitvullen over de hele regel
  1066. Een tekst centreren is niet hetzelfde als het centreren van een element. In ons geval
  1067. hebben we het <body>-element gecentreerd binnen het <html>-element. Dit hebben
  1068. we gedan met het attribuut margin.
  1069. margin
  1070. Marges zijn de ruimtes tussen alle elementen. We kunnen individuele marges specifi ceren:
  1071. margin-top: 0px
  1072. bovenmarge: 0px
  1073. margin-right: 0px rechtermarge: 0px
  1074. margin-bottom: 0px
  1075. ondermarge: 0px
  1076. margin-left: 0px linkermarge: 0px
  1077. 26 1 Basis HTML5 en CSS3
  1078. Hierboven zien we de marges van de grijze elementen ten opzichte van de elementen waar ze zich in bevinden.
  1079. We kunnen ook alle marges in één keer vaststellen. Dit doen we met de klok mee:
  1080. boven, rechts, onder, links:
  1081. margin: 0 0 0 0;
  1082. Als alle vier de marges hetzelfde zijn doe je dit zo:
  1083. margin: 0; of margin: 5%;
  1084. Elementen centreren
  1085. Ons <body>-element heeft in Webbouw 4 een bovenmarge van 0% en een ondermarge van 5% gekregen. Om het element te kunnen centreren moeten we de linker- en
  1086. de rechtermarges als auto opgeven. Bijvoorbeeld:
  1087. body{
  1088. margin-left: auto;
  1089. margin-right: auto;
  1090. }
  1091. Border
  1092. Het <body>-element heeft een border (rand) van 1 pixel gekregen, als volgt:
  1093. border: 1px solid;
  1094. font
  1095. We gebruiken het attribuut font om het lettertype van de teksten binnen een element te defi niëren. Hier volgt een lijst met lettertypes die geschikt zijn voor alle
  1096. webbrowsers:
  1097. Figuur 1.18
  1098. font-size
  1099. Het attribuut font-size (tekengrootte) defi nieert de lettergrootte van je teksten.
  1100. 1.2 CSS3 27
  1101. Dit attribuut kunnen we waarden geven in pixels, punten, percentages of relatief
  1102. ten opzichte van het font in de body, bijvoorbeeld 1.5 de font-size van het <body>-
  1103. element. Hieronder zien we hoe het font cerif gedefi nieerd kan worden in pixels,
  1104. punten, percentages of relatief ten opzichte van de basis:
  1105. cerif 12px pixels
  1106. cerif 24pt punten
  1107. cerif 48% percentage
  1108. cerif 1.5rem relatief
  1109. De meest exacte lettergrootte geven we aan in pixels (px).
  1110. Voor een betere kwaliteit afdruk van je teksten gebruik je punten (pt).
  1111. Percentages en rem zijn gerelateerd aan de lettergrootte van het <body>-element,
  1112. bijvoorbeeld:
  1113. body {font-size: 16px;} basis
  1114. body h1 {font-size: 2.0rem;} relatief: 2.0 x 16 = 32px
  1115. body h2 {font-size: 50%;} percentage: 50 van 16 = 8px
  1116. Subelementen
  1117. In onze webpagina zien we dat de body een nav-element heeft en dat het nav-element een h3-element heeft. Deze elementen noemen we subelementen. We kunnen heel specifi ek een subelement selecteren door het pad van het element aan te
  1118. geven. Bijvoorbeeld:
  1119. body nav {color: black}
  1120. of
  1121. body nav h3 {color: black}
  1122. font-style
  1123. We kunnen ons lettertype verder vormgeven met font-style. Hiervoor zijn er vier
  1124. opties:
  1125. normal normaal
  1126. bold vet
  1127. bolder vetter
  1128. lighter lichter
  1129. box-shadow
  1130. Om de dimensies van onze elementen beter te zien hebben we in Webbouw 5 schaduwen gebruikt. In ons geval hebben we de volgende schaduw gedefi nieerd:
  1131. box-shadow: 4px 4px 10px rgba(0,0,0,0.5);
  1132. 28 1 Basis HTML5 en CSS3
  1133. Dit betekent:
  1134. – 4 pixels aan de rechterkant
  1135. – 4 pixels onderaan
  1136. – 10 pixels vervaging
  1137. – De kleur van de schaduw is zwart (0 rood, 0 groen, 0 blauw, dat is geen kleur, dus
  1138. zwart) en is 50 transparant. Kleurencodes en de functie rgba bespreken we in de
  1139. volgende paragraaf.
  1140. Element met schaduw
  1141. • Lab 02
  1142. In deze lab-opdracht codeer je stijlen voor de vier div-elementen zoals in de volgende fi guur te zien is. Codeer een stylesheet met de volgende stijlen en sla die op
  1143. als labs.css.
  1144. Div 1 Border-shadow
  1145. 80 breed
  1146. Hoogte 80px
  1147. Font-size 20px
  1148. Auto marge
  1149. Marge boven 3
  1150. Marge onder 3
  1151. Div 2 80 breed
  1152. Hoogte 220px
  1153. Font-size 15px
  1154. Linkermarge 5
  1155. Marge onder 3
  1156. Div 3 80 breed
  1157. Hoogte 150px
  1158. Linkermarge 3
  1159. Div 4 80 breed
  1160. Hoogte 100px
  1161. Linkermarge 0
  1162. Open labs.html en voeg de volgende link eraan toe:
  1163. <link rel="stylesheet" href="labs.css">
  1164. 1.3 Webkleuren 29
  1165. Het resultaat moet er als volgt uitzien:
  1166. Figuur Lab 02
  1167. 1.3 Webkleuren
  1168. In deze paragraaf maken we kennis met de volgende CSS-attributen:
  1169. • rgb
  1170. • rgba
  1171. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  1172. Planning Inleveren
  1173. Oefening 7 t/m 9
  1174. Lab 03
  1175. Inleiding
  1176. Webkleuren zijn gebaseerd op de drie primaire kleuren: rood, groen en blauw.
  1177. Door deze drie basiskleuren te combineren kunnen we een spectrum van kleuren
  1178. creëren. In de volgende fi guur zie je primaire, secundaire en tertiaire webkleuren.
  1179. Figuur 1.19 Kleurenschijf
  1180. 30 1 Basis HTML5 en CSS3
  1181. Er zijn drie manieren om kleuren te produceren in CSS:
  1182. • met decimale getallen;
  1183. • met hexadecimale getallen;
  1184. • met percentages.
  1185. Omdat de browsers constant in ontwikkeling zijn en omdat de ene browser een betere manier vindt om bijvoorbeeld kleuren te coderen, ontstaan hierdoor meerdere
  1186. manieren om kleuren te coderen.
  1187. De meest voorkomende manier om kleuren te coderen voor een webpagina is met
  1188. hexadecimale getallen. Hexadecimaal is een numeriek systeem gebaseerd op tien
  1189. getallen en zes letters (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F). We gaan niet dieper
  1190. in op het hexadecimale systeem, maar het is belangrijk om te weten hoe het systeem wordt gebruikt om kleuren te combineren. Dit doen we met het attribuut rgb.
  1191. rgb
  1192. Met het attribuut rgb kunnen we de drie primaire kleuren, rood, groen en blauw
  1193. mengen met als resultaat een nieuwe kleur. De syntaxis is als volgt:
  1194. rgb(red,green,blue)
  1195. De mogelijke waarden voor iedere kleur zijn de volgende:
  1196. • hexadecimaal 0 t/m F;
  1197. • decimaal 0 t/m 255;
  1198. • percentage 0 t/m 100.
  1199. Bijvoorbeeld, de kleur blauw coderen we als volgt:
  1200. rgb(0,0,F)
  1201. Dit betekent: nul rood, nul groen en maximaal blauw.
  1202. We kunnen ook groen toevoegen, als volgt:
  1203. rgb(0,6,F)
  1204. Dit geeft als resultaat een blauwgroene kleur. Dezelfde kleur kunnen we op een
  1205. verkorte manier coderen:
  1206. #06F
  1207. Nog een andere manier is met zes cijfers. Dit doen we door elk cijfer te verdubbelen. Hierdoor heb je veel meer kleurenmogelijkheden. Bijvoorbeeld:
  1208. #06F is hetzelfde als #0066FF
  1209. • Oefening 7: BackgroundColor
  1210. Open een nieuw script en sla dit op als oefening7.html. Maak de volgende vijf div’s met de aangegeven achtergrondkleuren. Gebruik het attribuut
  1211. backgroundColor:
  1212. 1.3 Webkleuren 31
  1213. backgroundColor: #fff;
  1214. Het resultaat moet er als volgt uitzien:
  1215. Figuur 1.20
  1216. Op internet vind je talloze webpagina’s met tabellen met kleurcodes zoals in de
  1217. volgende fi guur:
  1218. Figuur 1.21
  1219. Met de decimale methode kunnen we dezelfde groenblauwe kleur met de decimale
  1220. waarden 0 t/m 255 als volgt creëren:
  1221. rgb(0,56,255)
  1222. Met percentages kunnen we dezelfde kleur als volgt creëren:
  1223. rgb(0%, 22%, 100%)
  1224. 32 1 Basis HTML5 en CSS3
  1225. De afwezigheid van kleuren geeft als resultaat de kleur zwart:
  1226. rgb(0, 0, 0)
  1227. Hier zie je dat spaties na de komma optioneel zijn.
  1228. rgba
  1229. We gebruiken het attribuut rgba om transparantie toe te voegen, waarbij a de transparantie aangeeft en een waarde tussen 0.0 en 1.0 krijgt. Bijvoorbeeld:
  1230. rgba(0, 255, 0, 0.3)
  1231. Hier krijgen we een groene kleur met een transparantie van 30%. In de vorige opgave hebben we dit attribuut gebruikt om een zwarte schaduw met een transparantie
  1232. van 50% te creëren:
  1233. box-shadow: 4px 4px 10px rgba(0,0,0,0.5);
  1234. • Oefening 8: rgba
  1235. Open een nieuw script en sla dit op als oefening8.html. Maak de volgende div’s
  1236. met de aangegeven transparanties in rood.
  1237. Figuur 1.22
  1238. • Oefening 9: #kleurcodes
  1239. Open een nieuw script en sla het op als oefening9.html. Maak de volgende div’s
  1240. met de aangegeven kleurencodes:
  1241. Figuur 1.23
  1242. • Lab 03
  1243. Open labs.css en geef iedere div een eigen achtergrondkleur, hoogte en breedte. Bij
  1244. div 4 centreer je verticaal de tekst als volgt:
  1245. 1.4 Navigatie 33
  1246. #div4 p{
  1247. position: relative;
  1248. top: 50%;
  1249. transform: translateY(-50%);
  1250. }
  1251. Position wordt behandeld in paragraaf 1.5 en transform in paragraaf 1.6.
  1252. Het resultaat moet er als volgt uitzien:
  1253. Figuur Lab 03
  1254. 1.4 Navigatie
  1255. In deze paragraaf maken we de navigatie van de website en we maken kennis met
  1256. een aantal HTML-elementen en een aantal CSS-attributen.
  1257. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  1258. Planning Inleveren
  1259. Webbouw 7 t/m 11
  1260. Lab 04
  1261. Een goed gestructureerde navigatie bepaalt of je website logisch en intuïtief is. De
  1262. navigatie moet zodanig gemaakt worden dat de gebruiker de gezochte informatie
  1263. gemakkelijk kan vinden. We beginnen met de HTML-code en eindigen met de
  1264. CSS-code.
  1265. Codering van de navigatie
  1266. De navigatie moet logisch opgebouwd worden zodat gezochte informatie nooit
  1267. meer dan drie klikken verwijderd is van de homepage. Het moet mogelijk zijn om
  1268. vanuit iedere webpagina terug te keren naar de homepage. HTML5 heeft de nieuwe tag <nav> met als betekenis ‘navigatie’.
  1269. 34 1 Basis HTML5 en CSS3
  1270. Element <nav>
  1271. Meestal plaatsen we de navigatie bovenaan of aan de rechterkant van de pagina
  1272. zodat we door de hele website makkelijk kunnen navigeren. Omdat de navigatie in
  1273. de vorm van een lijst wordt gecodeerd kijken we nu naar HTML-lijsten.
  1274. Genummerde lijsten <ol>
  1275. Soms wil je een bepaald stuk tekst als lijst weergeven. Er bestaan twee soorten lijsten: genummerde lijsten en opsommingslijsten. We kijken eerst naar genummerde
  1276. lijsten.
  1277. <ol>
  1278. <li>Webdesign</li>
  1279. <li>Webhosting</li>
  1280. <li>Webprogrammering</li>
  1281. </ol>
  1282. Dit genereert het volgende resultaat: een genummerde lijst <ol> met drie items
  1283. <li>:
  1284. 1. Webdesign
  1285. 2. Webhosting
  1286. 3. Webprogrammering
  1287. Items <li>
  1288. Alle lijsten moeten minimaal een item <li> hebben. Deze genummerde items worden automatisch genummerd volgens hun positie in de lijst.
  1289. Opsommingslijsten <ul>
  1290. Een opsommingslijst is een lijst met bullets. Bijvoorbeeld:
  1291. <ul>
  1292. <li>Duurzaam</li>
  1293. <li>Ecologisch</li>
  1294. <li>Groene voetafdruk</li>
  1295. </ul>
  1296. genereert de volgende bullets-lijst:
  1297. • Duurzaam
  1298. • Ecologisch
  1299. • Groene voetafdruk
  1300. Element <a>
  1301. Het element <a> is een klikbaar element voor het linken van twee documenten.
  1302. Deze elementen noemen we hyperlinks. Een hyperlink coderen we als volgt:
  1303. <a href="index.html">Home</a>
  1304. 1.4 Navigatie 35
  1305. Het <a>-element bestaat uit drie delen:
  1306. 1 <a href="index.html">, met het attribuut href met de naam van het te linken document. In dit geval index.html.
  1307. 2 De tekst waar we moeten klikken om te linken. In dit geval Home.
  1308. 3 </a>, om de hyperlink te sluiten.
  1309. HTML bestaat voor Hyper Text Markup Language. De hypertekst is de content of
  1310. de tekst tussen de tags in. In een hypertekst is het zo dat in de browser een, twee of
  1311. meer spaties als één spatie worden gezien. Als we een extra spatie willen toevoegen
  1312. gebruiken we de code &nbsp. Bijvoorbeeld <h1>&nbsp;&nbsp;tekst</h1>.
  1313. In de volgende opgave vervangen we het <h3>-element binnen de navigatie <nav>
  1314. door een lijst met hyperlinks.
  1315. <nav>
  1316. <h3>Navigatie</h3>
  1317. </nav>
  1318. • Webbouw 7
  1319. Open index.html en vervang het <h3>-element binnen het <nav>-element door de
  1320. volgende lijst met hyperlinks.
  1321. <nav>
  1322. <ul>
  1323. <li><a href="index.html">Home</a></li>
  1324. <li><a href="playlist.html">Playlist</a></li>
  1325. <li><a href="formulier.html">Formulier</a></li>
  1326. <li><a href="contact.html">Contact</a></li>
  1327. </ul>
  1328. </nav>
  1329. De volgende fi guur illustreert het resultaat van de opgave: de navigatie als een bulletslijst met hyperlinks weergegeven.
  1330. • Home
  1331. • Playlist
  1332. • Formulier
  1333. • Contact
  1334. LET OP
  1335. Als je een ander resultaat krijgt, ga dan terug naar je code en je stijlen en zoek uit
  1336. wat er fout is gegaan.
  1337. 36 1 Basis HTML5 en CSS3
  1338. Figuur 1.24
  1339. Ontwerp van de navigatie
  1340. Hier gaan we verder met het ontwerp van de navigatie van onze website. In dit deel
  1341. kijken we naar de volgende attributen:
  1342. • list-style-type
  1343. • display: block
  1344. • fl oat
  1345. • gradient
  1346. • tekst-decoration
  1347. • opacity
  1348. • pseudoklassen
  1349. • Webbouw 8
  1350. Open styles.css en voeg de volgende stijlen eraan toe.
  1351. nav{
  1352. width: 100%;
  1353. }
  1354. nav ul{
  1355. text-align: center;
  1356. margin: 0 0 0 0;
  1357. padding-left: 0;
  1358. }
  1359. li{
  1360. list-style-type: none;
  1361. }
  1362. nav ul li{
  1363. width: 25%;
  1364. background: linear-gradient(#9FB3B5,#E3E9EA,#7C9799);
  1365. }
  1366. Het resultaat ziet er als volgt uit:
  1367. 1.4 Navigatie 37
  1368. Figuur 1.25
  1369. Hier volgt een uitleg over Webbouw 8.
  1370. list-style-type
  1371. Dit attribuut is voor de opmaak van lijsten. We willen onze hyperlinks hebben in
  1372. een lijst zonder bullets. Dus zeggen we het volgende:
  1373. li{
  1374. list-style-type: none;
  1375. }
  1376. Naast de optie none kunnen we de volgende opties gebruiken:
  1377. disc disc 
  1378. circle cirkel 
  1379. square vierkant 
  1380. decimal decimaal 1
  1381. lower-latin kleine letter Latijn i
  1382. upper-latin hoofdletter Latijn I
  1383. Het <body>-element bevat het <nav>-element en dat krijgt als breedte 100% van het
  1384. <body>-element. In de vorige opgave hebben we een navigatie gemaakt met vier
  1385. hyperlinks, dus krijgt iedere link 25% van de breedte van de navigatie.
  1386. nav ul li{
  1387. width: 25%;
  1388. }
  1389. display: block
  1390. De volgende HTML-elementen krijgen automatisch het attribuut display: block.
  1391. • <h1> t/m <h6>
  1392. • <p>
  1393. • <li>
  1394. • <div>
  1395. • <main>
  1396. • <footer>
  1397. • <section>
  1398. 38 1 Basis HTML5 en CSS3
  1399. Onze <li>-elementen binnen de navigatie krijgen ieder 25% van de breedte van het
  1400. nav-element en worden als blokken onder elkaar weergegeven.
  1401. <li> Home </li>
  1402. <li> Playlist </li>
  1403. <li> Formulier </li>
  1404. <li> Contact </li>
  1405. fl oat
  1406. Om onze hyperlinks horizontaal te groeperen gebruiken we het attribuut float.
  1407. Elementen met dit attribuut hebben de mogelijkheid om naar links of rechts te
  1408. ‘zweven’.
  1409. float: left naar links zweven
  1410. float: right naar rechts zweven
  1411. Neem als voorbeeld de letters in een tekst: alle letters hebben de neiging om naar
  1412. links te ‘zweven’ naar de vorige letter. Bijvoorbeeld:
  1413. ABCD
  1414. Maar als het scherm te klein is gaat de letter onderaan naar de volgende regel, bijvoorbeeld:
  1415. ABCD
  1416. E
  1417. Dat gebeurt ook met HTML-elementen met het attribuut float. Als we bijvoorbeeld
  1418. onze <li>-elementen een breedte van 30% geven dan ‘zweeft’ het vierde element
  1419. onderaan naar de volgende beschikbare regel.
  1420. Home Playlist Formulier
  1421. Contact
  1422. 1.4 Navigatie 39
  1423. clear
  1424. Met het attribuut clear kunnen we het ‘zweven’ ongedaan maken.
  1425. clear: left naar links zweven ongedaan maken
  1426. clear: right naar rechts zweven ongedaan maken
  1427. clear: both naar links en rechts zweven ongedaan maken
  1428. gradient (kleurverzadiging of kleurverloop)
  1429. Als laatste hebben we in de vorige opgave het attribuut linear kleurverloop gecodeerd. Met dit attribuut vullen we een achtergrond in met een kleurverloop. Er zijn
  1430. twee soorten gradients: linear en radial. De syntaxis is als volgt:
  1431. linear-gradient(kleur-1, kleur-2, . . . )
  1432. Bijvoorbeeld:
  1433. linear-gradient(red, blue);
  1434. linear-gradient(red, yellow, blue);
  1435. De volgende fi guur illustreert het resultaat van de tweede regel: een lineair kleurverloop van rood naar geel naar blauw.
  1436. Figuur 1.26
  1437. We kunnen ook een diagonaal kleurverloop coderen:
  1438. linear-gradient(45deg, red, yellow, blue);
  1439. linear-gradient(to left top, red, yellow, blue);
  1440. linear-gradient( to bottom, red, yellow, blue );
  1441. • Webbouw 9
  1442. Open styles.css. In deze opgave selecteer je het <li>-element binnen onze navigatie en past het attribuut float left toe. Het resultaat moet er als volgt uitzien:
  1443. Figuur 1.27
  1444. 40 1 Basis HTML5 en CSS3
  1445. In de volgende opgave gaan we verder met de navigatie. We kijken naar meer attributen voor de hyperlinks.
  1446. • Webbouw 10
  1447. Open styles.css en voeg de volgende stijlen eraan toe.
  1448. a {
  1449. text-decoration: none;
  1450. }
  1451. nav ul li a {
  1452. font-size: 1.7rem;
  1453. opacity: 0.5;
  1454. filter: alpha(opacity=50);
  1455. }
  1456. nav ul li a:hover,
  1457. nav ul li a:focus
  1458. {
  1459. color: firebrick;
  1460. }
  1461. Hier krijgen de hyperlinks een lettergrootte van 1.7 in relatie tot de 16px basislettergrootte van het body-element. Omndat hover en focus geen attributen maar
  1462. eff ecten zijn, plaatsen we geen spaties na de dubbelepunt, duswe schrijven: a:hover
  1463. en a:focus.
  1464. text-decoration
  1465. Met het attribuut text-decoration kunnen we de volgende opties toepassen: doorstrepen, onderstrepen, bovenstrepen.
  1466. none geen
  1467. underline onderstrepen
  1468. overline lijn erboven
  1469. line-trog doorhalen
  1470. Alle hyperlinks krijgen automatisch een onderstreping. Onderstrepen schakelen
  1471. we als volgt uit:
  1472. text-decoration: none;
  1473. opacity
  1474. Het attribuut opacity bepaalt de transparantie van een element. In de vorige opgave kregen alle hyperlinks een transparantie van 50.
  1475. opacity: 0.5;
  1476. pseudoklassen
  1477. Het beeldscherm is de interface van de browser. Een interface is het punt van interactie tussen twee systemen of objecten. Browsers hebben listeners (luisteraars) die
  1478. 1.4 Navigatie 41
  1479. permanent aan het luisteren zijn naar events (gebeurtenissen) op het beeldscherm.
  1480. Bijvoorbeeld wanneer de muis over een tekst zweeft. Dit noemen we muis-events.
  1481. Muis-events kunnen we programmeren met behulp van pseudoklassen. Hyperlinks
  1482. hebben de volgende pseudoklassen:
  1483. a:hover wanneer de muis over een hyperlink zweeft
  1484. a:focus wanneer de muis op een hyperlink focust
  1485. a:visited wanneer de muis een hyperlink heeft gactiveerd
  1486. a:active wanneer de muis een hyperlink activeert
  1487. De pseudoklassen a:visited en a:active veranderen de kleur van de bezochte en de
  1488. actieve hyperlinks. Zo kunnen we zien welke links we bezocht hebben. In de laatste
  1489. opgave hebben we met behulp van de pseudoklasse a:hover een hover-eff ect gecodeerd zodat de kleur van de tekst van alle hyperlinks verandert wanneer de muis
  1490. over de link zweeft.
  1491. • Webbouw 11
  1492. Om de navigatie makkelijker te maken voor onze gebruikers codeer je in deze opgave een hover-eff ect zodat de achtergrondkleur van de hyperlinks verandert wanneer een hover-event plaatsvindt.
  1493. Daarna codeer je een tweede hover-eff ect voor kleurenblinde gebruikers waardoor
  1494. het hover-event de ruimte tussen de letters van een hyperlink laat veranderen. Gebruik hiervoor de volgende code:
  1495. letter-spacing: 5px
  1496. Het resultaat moet zoiets zijn:
  1497. Figuur 1.28
  1498. Je ziet dat bij het hover-eff ect de ruimte tussen de letters verandert.
  1499. 42 1 Basis HTML5 en CSS3
  1500. • Lab 04
  1501. Open labs.css. In deze lab-opdracht codeer je een hover-eff ect zodat div 2 naar
  1502. rechts zweeft met een muis-over-event. Het resultaat moet er als volgt uitzien:
  1503. Figuur Lab 04
  1504. 1.5 Logo
  1505. In deze paragraaf maken we het logo voor de webapplicatie en we maken kennis
  1506. met een aantal HTML-elementen en een aantal CSS-attributen.
  1507. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  1508. Planning Inleveren
  1509. Webbouw 12 t/m 14
  1510. Lab 05
  1511. Een logo is een afbeelding waaraan je een merk of bedrijf herkent. Een mooi vormgegeven logo moet het bedrijf of de website een unieke uitstraling geven. De uitstraling kan informeel, formeel of sportief zijn. In deze paragraaf behandelen we de
  1512. codering en de vormgeving van het logo van de website.
  1513. Codering van het logo
  1514. In de volgende opgave coderen we het logo onderaan de navigatie.
  1515. Download webdesign media
  1516. Alle media voor dit webdesign-boek vind je op
  1517. www.brinkman-uitgeverij-mbopraktijk.nl, onder Frontend programmeren.
  1518. Na het downloaden moet je de gecomprimeerde map decomprimeren (unzippen).
  1519. Het logo vind je in de map images met de naam logo.png. Kopieer en plak de map
  1520. images in je map RadioGaGa. In de volgende opgave gebruiken we het logo afbeelding binnen de img-tag.
  1521. 1.5 Logo 43
  1522. • Webbouw 12
  1523. Open index.html en vervang het <h3>-element binnen je <div id="logo"> als volgt:
  1524. . . .
  1525. <div id="logo">
  1526. <img width="200px" src="images/logo.png" alt="x">
  1527. </div>
  1528. . . .
  1529. Het resultaat zie je hieronder:
  1530. Figuur 1.29
  1531. LET OP
  1532. Als je geen afbeelding ziet, let dan op de spelling in je img-tag.
  1533. Element img
  1534. Hier hebben we een afbeelding toegevoegd met het element <img>. Dit element
  1535. heeft drie attributen:
  1536. width de afbeelding wordt weergeven met deze breedte
  1537. src de bron of URL van de afbeelding
  1538. alt alternatieve tekst wanneer de afbeelding niet gevonden is
  1539. Het attribuut src bevat de bron van de afbeelding. Dit kan een URL zijn of een
  1540. pad naar waar de afbeelding geplaatst is. In ons geval is dit de map images gevolgd
  1541. door / en de naam van de afbeelding:
  1542. src="images/logo.png"
  1543. Wat is een URL ?
  1544. URL is het acroniem voor Uniform Resource Locator, het is de manier waarop we
  1545. een document of resource lokaliseren op het internet. De algemene vorm van een
  1546. URL is:
  1547. protocol: //domain/map/document
  1548. 44 1 Basis HTML5 en CSS3
  1549. protocol is een set normen voor de transmissie van informatie tussen twee computers. In ons geval gebruiken we het http-protocol voor de transmissie van webpagina’s over het internet.
  1550. domain is een gereserveerde naam die de computer of server in het internet identifi -
  1551. ceert, bijvoorbeeld:
  1552. http://google.com
  1553. map/document geeft de locatie en naam van het gezochte document.
  1554. Design van het logo
  1555. In de vorige webbouw hebben we het logo in een <img>-element geplaatst. Een andere manier om ons logo weer te geven is met behulp van de background-property.
  1556. CSS biedt ons meer mogelijkheden. In de volgende opgave doen we dit.
  1557. • Webbouw 13
  1558. Open index.html en verwijder het <img>-element binnen je <div id="logo"> als
  1559. volgt om de background property te gebruiken:
  1560. . . .
  1561. <div id="logo">
  1562. </div>
  1563. . . .
  1564. Nu geef je het logo weer als een achtergrondafbeelding met het attribuut
  1565. background-image.
  1566. • Webbouw 14
  1567. Open styles.css en voeg de volgende stijlen eraan toe.
  1568. #logo{
  1569. margin-top: 15px;
  1570. padding-top: 10%;
  1571. background-image: url(images/logo.png);
  1572. background-repeat: no-repeat;
  1573. background-position: center;
  1574. }
  1575. background
  1576. Alle elementen hebben een achtergrond. Aan het attribuut background kun je afbeeldingen, kleuren en arcering toekennen. Dit attribuut heeft de volgende opties:
  1577. background-image achtergrond van de afbeelding of kleurverloop
  1578. backgroundColor achtergrondkleur
  1579. background-position positie van de achtergrond van de afbeelding
  1580. background-repeat herhaling van de afbeelding in de achtergrond
  1581. background-url url van de afbeelding voor deze achtergrond
  1582. 1.5 Logo 45
  1583. background-url
  1584. In ons geval hebben we een url met een afbeelding gecodeerd:
  1585. background-image: url(images/disc.png);
  1586. background-position
  1587. Het attribuut position bepaalt de positie van de afbeelding in de achtergrond, het
  1588. heeft de volgende opties:
  1589. top boven
  1590. center midden
  1591. bottom onder
  1592. top left boven links
  1593. top center boven midden
  1594. top right boven rechts
  1595. bottom left onder links
  1596. bottom center onder midden
  1597. bottom right onder rechts
  1598. In ons geval hebben we gekozen voor:
  1599. background-position: center;
  1600. De optie repeat is voor het herhalen van de afbeelding in de achtergrond. We hebben gekozen voor:
  1601. background-repeat: no-repeat;
  1602. • Lab 05
  1603. Open labs.css en plaats de volgende twee backgrund-url’s als afbeeldingen binnen
  1604. div 2 en div 3.
  1605. http://icons.iconarchive.com/icons/yootheme/social-bookmark/256/social-googlebox-icon.png
  1606. http://icons.iconseeker.com/ico/mozilla/fi refox-2.ico
  1607. Het resultaat is het volgende:
  1608. Figuur Lab 05
  1609. 46 1 Basis HTML5 en CSS3
  1610. 1.6 Hoofd-content
  1611. In deze paragraaf maken we de codering en het design van de hoofd-content van
  1612. de homepage. We maken kennis met de volgende CSS-attributen:
  1613. • border-radius
  1614. • opacity
  1615. • browser prefi x
  1616. • keyframes
  1617. • transform
  1618. • position
  1619. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  1620. Planning Inleveren
  1621. Webbouw 15 t/m 21
  1622. Lab 06
  1623. Codering van de hoofd-content
  1624. In de hoofd-content coderen we een schijf met een animatie. Het resultaat van
  1625. deze paragraaf moet er als volgt uitzien:
  1626. Figuur 1.30
  1627. De hoofd-content plaatsen we binnen de <main>-tags.
  1628. 1.6 Hoofd-content 47
  1629. • Webbouw 15
  1630. Open index.html en vervang de elementen <h3> en <h4> binnen je <main> door de
  1631. volgende twee div’s:
  1632. . . .
  1633. <main>
  1634. <div id="disc">
  1635. <div id="center">
  1636. </div>
  1637. </div>
  1638. </main>
  1639. . . .
  1640. Design van de hoofd-content
  1641. In de volgende opgave coderen we de vormgeving van de disc.
  1642. • Webbouw 16
  1643. Open styles.css en voeg de volgende stijlen eraan toe.
  1644. main{
  1645. width: 100%;
  1646. margin: 0;
  1647. padding-bottom: 3%;
  1648. }
  1649. In de volgende opgave coderen we de stijlen van ons disc-element.
  1650. • Webbouw 17
  1651. Open styles.css en voeg de volgende stijlen eraan toe.
  1652. #disc {
  1653. border-radius: 50%;
  1654. display: inline-block;
  1655. opacity: 0.8;
  1656. width: 400px;
  1657. height: 400px;
  1658. margin-top: 10%;
  1659. }
  1660. border-radius
  1661. Om de hoeken van een element af te ronden gebruiken we het attribuut borderradius. In ons geval hebben we het disc-element een radius van 50 gegeven:
  1662. border-radius: 50%;
  1663. Hieronder zien we drie fi guren met het attribuut border-radius.
  1664. 48 1 Basis HTML5 en CSS3
  1665. Figuur 1.31
  1666. Figuur 1 heeft een border-radius van 5;
  1667. fi guur 2 heeft een border-radius van 20;
  1668. fi guur 3 heeft een border-radius van 50.
  1669. opacity
  1670. Dit attribuut geeft de transparantie van een element aan. In ons geval krijgt het
  1671. disc-element een transparantie van 80%.
  1672. opacity: 0.8;
  1673. Het attribuut opacity maakt alle subelementen van het disc-element ook transparant.
  1674. LET OP
  1675. Het attribuut opacity gebruiken we om elementen transparant te maken.
  1676. Het attribuut rgba() gebruiken we om kleuren transparant te maken.
  1677. Een achtergrond met een kleurverloop vanuit het midden (radial) coderen we als
  1678. volgt:
  1679. • Webbouw 18
  1680. Open styles.css en voeg de volgende stijlen eraan toe.
  1681. #disc {
  1682. background-image: -moz-radial-gradient(
  1683. 45px 45px 45deg, circle cover, grey 0%, black 100%, black 95%);
  1684. background-image: -webkit-radial-gradient(
  1685. 45px 45px, circle cover, grey, black);
  1686. background-image: radial-gradient(
  1687. 45px 45px 45deg, circle cover, grey 0%, black 100%, black 95%);
  1688. }
  1689. Browser-prefi x
  1690. Het attribuut radial-gradient werkt bij iedere browser anders. Het is te hopen dat
  1691. op een dag alle browsers dezelfde implementatie van alle attributen gaan hanteren. In de tussentijd moeten we alle nieuwe, nog niet gestandaardiseerd attributen
  1692. coderen met een browser-prefi x. Zo zorgen we ervoor dat de attributen bij iedere
  1693. browser op de juiste manier worden weergegeven.
  1694. 1.6 Hoofd-content 49
  1695. -webkit is de prefi x voor de Chrome- en Safari-browsers.
  1696. -moz is de prefi x voor de Mozilla- en Firefox-browsers.
  1697. border-radius zonder prefi x is de standaardimplementatie.
  1698. Browser Prefi x
  1699. webkitmozowebkitms.-
  1700. keyframes
  1701. Met behulp van keyframes kunnen we animaties coderen in CSS. In de volgende
  1702. opgave coderen we een animatie met de naam revolutie. Deze animatie moet ons
  1703. disc-element ronddraaien, dat wil zeggen rotaties van 0 tot 360 graden maken. We
  1704. coderen ons keyframe eerst voor de Safari- en de Opera-browsers, daarna voor
  1705. Firefox en Chrome. Zo zorgen we ervoor dat de animatie op alle browsers werkt.
  1706. • Webbouw 19
  1707. Open styles.css en voeg de volgende stijlen eraan toe.
  1708. /* Safari, Opera */
  1709. @-webkit-keyframes revolutie {
  1710. from { -webkit-transform: rotate(0deg); }
  1711. to { -webkit-transform: rotate(360deg); }
  1712. }
  1713. /* standard */
  1714. @keyframes revolutie {
  1715. from { transform: rotate(0deg); }
  1716. to { transform: rotate(360deg); }
  1717. }
  1718. 50 1 Basis HTML5 en CSS3
  1719. transform
  1720. Met het attribuut transform zeggen we wat voor animatie we willen coderen. Er zijn
  1721. twee opties:
  1722. translate verplaats, bijvoorbeeld van links naar rechts brengen
  1723. rotate rotatie, bijvoorbeeld 360 graden ronddraaien
  1724. Deze animatie revolutie passen we nu toe op ons element disc.
  1725. • Webbouw 20
  1726. Open styles.css en voeg de volgende stijlen eraan toe.
  1727. #disc {
  1728. -webkit-animation-name: revolutie;
  1729. -webkit-animation-duration: 3s;
  1730. -webkit-animation-iteration-count: infinite;
  1731. -webkit-animation-timing-function: linear;
  1732. animation-name: revolutie;
  1733. animation-duration: 3s;
  1734. animation-iteration-count: infinite;
  1735. animation-timing-function: linear;
  1736. }
  1737. Hier hebben we onze animatie revolutie op ons disc-element toegepast. Het betreft een animatie van drie seconden met een oneindig aantal herhalingen.
  1738. We eindigen de stijlen voor de hoofd-content met de stijlen voor het midden van
  1739. het disc-element.
  1740. • Webbouw 21
  1741. Open styles.css en voeg de volgende stijlen eraan toe.
  1742. #center {
  1743. width: 105px;
  1744. height: 105px;
  1745. background: orange;
  1746. position: relative;
  1747. top: 37%;
  1748. left: 37%;
  1749. display: block;
  1750. border: 0.5px solid #fff;
  1751. border-radius: 50%;
  1752. }
  1753. Het resultaat is een ronddraaiende disc – zie de fi guur aan het begin van deze paragraaf.
  1754. 1.6 Hoofd-content 51
  1755. • Lab 06
  1756. In deze lab-opdracht voeg je een animatie toe die div 2 op de x-as laat roteren.
  1757. Maak eerst het volgende keyframe:
  1758. @keyframes revolutie {
  1759. from { transform: rotatex(0deg); }
  1760. to { transform: rotatex(360deg); }
  1761. }
  1762. Daarna voeg je het keyframe aan div 2 toe als volgt:
  1763. – de animatie duurt 3 seconden;
  1764. – de animatie wordt ontelbare keren herhaald.
  1765. Het resultaat is dat alle divs horizontaal meedraaien.
  1766. Figuur Lab 06
  1767. 1.7 Positionering
  1768. In deze paragraaf positioneren we elementen in de homepage. We maken kennis
  1769. met de volgende CSS-attributen:
  1770. • position fi xed
  1771. • position relative
  1772. • position absolute
  1773. • z-index
  1774. • hsla
  1775. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  1776. Planning Inleveren
  1777. Webbouw 22 t/m 24
  1778. Lab 07 en 08
  1779. De positie van een element wordt bepaald door de volgorde waarin het is aangemaakt. De elementen worden onder elkaar geplaatst, tenzij we het attribuut float
  1780. 52 1 Basis HTML5 en CSS3
  1781. gebruiken. In dat geval zweven de elementen naar links of rechts. Maar we kunnen
  1782. in feite alle elementen overal op het beeldscherm plaatsen op de pixel nauwkeurig.
  1783. Hiervoor gebruiken we het attribuut position. Het attribuut heeft de volgende drie
  1784. opties:
  1785. fixed top | bottom | left | right
  1786. relative top | bottom | left | right
  1787. absolute top | bottom | left | right
  1788. fi xed positie
  1789. Een element met een fixed positie blijft altijd op dezelfde plek en scrolt niet met de
  1790. rest van de pagina mee. Bijvoorbeeld:
  1791. #element1{
  1792. position: fixed;
  1793. left: 0px;
  1794. top: 0px;
  1795. height: 50px;
  1796. width: 100%;
  1797. }
  1798. De positie left 0px en top 0px zie je hieronder:
  1799. Figuur 1.32
  1800. In dit geval is het body-element grijs en zetten we ons element vast op 0 pixels
  1801. vanaf body-links en o pixels vanaf body-top.
  1802. relatieve positie
  1803. Wanneer je een element plaatst met een relatieve positie, dan is de nieuwe positie
  1804. relatief ten opzichte van de oorspronkelijke positie binnen het parent-element.
  1805. Bijvoorbeeld:
  1806. #element2{
  1807. position: relative;
  1808. top: 0px;
  1809. left: 10%;
  1810. height: 200px;
  1811. width: 200px;
  1812. }
  1813. 1.6 Hoofd-content 53
  1814. Het resultaat zie je hieronder:
  1815. Figuur 1.33
  1816. In dit geval staat het tweede element op een positie 10 links ten opzichte van het
  1817. body-element. De attributen fixed en relative zijn bijna hetzelfde. Het enige verschil is dat het attribuut fixed niet met de pagina mee scrolt.
  1818. Wanneer je een relatieve positie hoger dan het parent-element wenst, gebruik je
  1819. negatieve waarden. Bijvoorbeeld:
  1820. position: relative;
  1821. top: -90px;
  1822. Wanneer je een relatieve positie lager dan het parent-element wenst, gebruik je
  1823. positieve waarden. Bijvoorbeeld:
  1824. position: relative;
  1825. top: 90px;
  1826. Nu coderen we een derde element met een relatieve positie ten opzichte van element2: element3 is een child van element2.
  1827. #element3{
  1828. position: relative;
  1829. top: 0px;
  1830. left: 0px;
  1831. height: 100px;
  1832. width: 130px;
  1833. }
  1834. Hier zien we de relatieve positie: top 0px en left 0px ten opzichte van de tekst in
  1835. element2:
  1836. Figuur 1.34
  1837. 54 1 Basis HTML5 en CSS3
  1838. In dit geval is het derde element gepositioneerd ten opzichte van de tekst "Relati ef",
  1839. namelijk eronder.
  1840. absolute positie
  1841. Als je het derde element een absolute positionering wilt geven, dan doe je dat als
  1842. volgt:
  1843. #element3{
  1844. position: absolute;
  1845. top: 0px;
  1846. left: 0px;
  1847. }
  1848. Het resultaat zie je hieronder:
  1849. Figuur 1.35
  1850. In dit geval heeft het derde element, ongeacht het tekstelement, een absolute positie ten opzichte van het parent-element gekregen.
  1851. • Lab 07
  1852. In deze lab-opdracht oefenen we verder met de positionering van elementen.
  1853. Open een nieuw bestand en sla het op als lab07.html. Voeg de volgende codes eraan toe.
  1854. <!DOCTYPE html>
  1855. <html lang="nl">
  1856. <head>
  1857. <style>
  1858. html{
  1859. height: 100%;
  1860. width: 100%;
  1861. backgroundColor: dimgrey;
  1862. overflow: auto;
  1863. }
  1864. body{
  1865. backgroundColor: #fff;
  1866. font-size: 30px;
  1867. font-family: Verdana, Arial, sans-serif;
  1868. margin: 50px;
  1869. }
  1870. 1.6 Hoofd-content 55
  1871. div{
  1872. margin: 0;
  1873. }
  1874. #vierkant{
  1875. width: 400px;
  1876. height: 300px;
  1877. backgroundColor: deepskyblue;
  1878. opacity: 0.5;
  1879. }
  1880. #driehoek{
  1881. width: 0;
  1882. height: 0;
  1883. border-left: 150px solid transparent;
  1884. border-right: 150px solid transparent;
  1885. border-bottom: 200px solid darkorange;
  1886. opacity: 0.8;
  1887. }
  1888. #cirkel{
  1889. width: 100px;
  1890. height: 100px;
  1891. border-radius: 50%;
  1892. backgroundColor: firebrick;
  1893. }
  1894. </style>
  1895. </head>
  1896. <body>
  1897. <div id="vierkant">
  1898. <div id="cirkel"></div>
  1899. </div>
  1900. <div id="driehoek"></div>
  1901. </body>
  1902. </html>
  1903. Figuur Lab 07
  1904. Het resultaat zien we in de linkerafbeelding. In deze lab-opdracht maak je gebruik
  1905. van het attribuut position om de drie elementen te positioneren zoals te zien in de
  1906. rechterafbeelding. Voer de volgende stappen uit:
  1907. • centreer het vierkant;
  1908. • geef het vierkant een eigen schaduw;
  1909. 56 1 Basis HTML5 en CSS3
  1910. • centreer de driehoek;
  1911. • positioneer de driehoek relatief top -200px;
  1912. • positioneer de cirkel in relatie tot het vierkant;
  1913. • geef de cirkel een eigen schaduw;
  1914. Lagen
  1915. z-index
  1916. Het attribuut z-index geeft ons de mogelijkheid om lagen te creëren en die te laten
  1917. overlappen. Elk element met het attribuut z-index krijgt een eigen laag. De index
  1918. bepaalt de volgorde van overlappen. Elementen met een hogere index worden op
  1919. de voorgrond weergegeven en elementen met een lagere index worden op de achtergrond weergegeven. Hieronder zie je drie lagen weergegeven.
  1920. Figuur 1.36
  1921. In de volgende opgave maken we een bladerknop (‘pager’) met een simpele navigatie naar de volgende en de vorige pagina.
  1922. • Webbouw 22
  1923. Open index.html en voeg de volgende elementen <div id="pager"> toe onderaan
  1924. het <main>-element.
  1925. . . .
  1926. <div id="pager">
  1927. <div id="vorige">
  1928. <a href="#top"> &lt;</a>
  1929. </div>
  1930. <div id="volgende">
  1931. <a href="playlist.html"> &gt; </a>
  1932. </div>
  1933. </div>
  1934. . . .
  1935. De stijlen van de bladerknop maken we hieronder.
  1936. 1.6 Hoofd-content 57
  1937. • Webbouw 23
  1938. Open styles.css en voeg de volgende stijlen eraan toe.
  1939. #pager a{
  1940. font-size: 3rem;
  1941. font-weight: bolder;
  1942. text-decoration: none;
  1943. border-radius: 50%;
  1944. box-shadow: 4px 4px 15px rgba(0,0,0,0.8);
  1945. padding-left: 10px;
  1946. padding-right: 10px;
  1947. }
  1948. #pager a:hover{
  1949. opacity: 0.7;
  1950. filter: alpha(opacity=40);
  1951. font-size: 3.2rem;
  1952. background-image: linear-gradient(to bottom, hsl(0, 80%, 50%), #bada55);
  1953. }
  1954. #vorige{
  1955. z-index: 1;
  1956. margin-left: 10px;
  1957. position: fixed;
  1958. top: 45%;
  1959. left: 4%;
  1960. }
  1961. We hebben een hover-eff ect gecodeerd met een lineair verloop en een hsl.
  1962. hsl
  1963. Met het attribuut hsl specifi ceren we kleurtint (hue), verzadiging (saturation),
  1964. helderheid (lightness) en transparantie (alpha). Met het attribuut hsla kun je ook
  1965. transparantie specifi ceren.
  1966. Hue is afgeleid uit de kleurencirkel: 0 t/m 360 graden.
  1967. Saturation is een percentage: van grijstinten 0 tot volle kleur 100.
  1968. Lightness is een percentage: van donker 0 tot licht 100.
  1969. Alpha is opacity (transparantie): van onzichtbaar 0.0 tot zichtbaar 1.0.
  1970. Bijvoorbeeld:
  1971. background: hsla(165, 35%, 50%, 1.0)
  1972. De kleurtint is groen.
  1973. De verzadiging (grijstint) is 35.
  1974. De helderheid is 50.
  1975. De transparantie is 1.0.
  1976. 58 1 Basis HTML5 en CSS3
  1977. Figuur 1.37
  1978. In ons geval hebben we een hover-eff ect gecodeerd met een kleurverloop als volgt:
  1979. linear-gradient(to bottom, hsl(0, 80%, 50%), #bada55);
  1980. Dit betekent een kleurverloop van boven naar beneden, beginnend met kleurtint 0
  1981. (rood) en een verzadiging van 80, een helderheid van 50, en we eindigen met de
  1982. kleur bada55.
  1983. • Webbouw 24
  1984. In deze opgave plaats je de rechter bladerknop binnen de pager. Het resultaat moet
  1985. er als volgt uitzien:
  1986. Figuur 1.38
  1987. • Lab 08
  1988. Open een nieuw bestand en sla het op als lab08.html. In deze lab-opdracht maak
  1989. je de volgende drie elementen:
  1990. 1.6 Hoofd-content 59
  1991. <body>
  1992. <div id="een" class="verticaal">
  1993. <br>Element 1<br>index-1</div>
  1994. <div id="twee" class="verticaal">
  1995. <br>Element 2<br>index-2</div>
  1996. <div id="drie" class="verticaal">
  1997. <br>Element drie<br>index-3</div>
  1998. </body>
  1999. Open een nieuw bestand en sla het op als lab08.css.
  2000. Zorg ervoor dat alle div-elementen de volgende attributen krijgen:
  2001. div{
  2002. height: 200px;
  2003. width: 200px;
  2004. border-radius: 50%;
  2005. opacity: 0.7;
  2006. text-align: center;
  2007. font-size: 1.7rem;
  2008. color: aliceblue;
  2009. }
  2010. Alle div’s krijgen de volgende verticale klasse:
  2011. .verticaal {
  2012. margin: 30px 20px 0 0;
  2013. transform: skew( 0, -30deg );
  2014. -ms-transform: skew( 0, -30deg );
  2015. -moz-transform: skew( 0, -30deg );
  2016. -o-transform: skew( 0, -30deg );
  2017. -webkit-transform: skew( 0, -30deg );
  2018. }
  2019. Alle div’s krijgen de volgende attributen:
  2020. • eigen achtergrondkleur;
  2021. • eigen relatieve positie;
  2022. • eigen z-index, om het element te overlappen;
  2023. • eigen draai-animatie.
  2024. Het resultaat zie je in de linkerafbeelding.
  2025. Figuur Lab 08
  2026. 60 1 Basis HTML5 en CSS3
  2027. Zet de teksten om in cirkels zoals te zien is in de rechterafbeelding. Hiervoor maak
  2028. je gebruik van het attribuut border-radius.
  2029. 1.8 Codering en design van de footer
  2030. In deze paragraaf maken we de codering en het design van het footer-element.
  2031. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  2032. Planning Inleveren
  2033. Webbouw 25, 26
  2034. Het onderste element van de pagina is het footer-element. In dit element plaatsen
  2035. we bedrijfsinformatie en belangrijke links naar bijvoorbeeld sociale media accounts
  2036. van het bedrijf.
  2037. • Webbouw 25
  2038. Open index.html en voeg het footer-element eraan toe.
  2039. . . .
  2040. <footer>
  2041. <a href="#top"><img src="images/twitter.png" alt="x" ></a>
  2042. <a href="#top"><img src="images/youtube.png" alt="x" ></a>
  2043. <a href="#top"><img src="images/facebook.png" alt="x" ></a>
  2044. <p>Copyright &copy; 2017 <i>Ontworpen door: xxx</i>
  2045. Alle rechten voorbehouden.</p>
  2046. </footer>
  2047. </body>
  2048. </html>
  2049. In deze opgave hebben we een speciale code gebruikt voor het symbool voor copyrights:
  2050. <p>Copyright &copy; 2017 <i>Ontworpen door: xxx</i>
  2051. Alle rechten voorbehouden.</p>
  2052. Symbolen in HTML
  2053. In de vorige opgave hebben we de &copy-code gebruikt voor het copyrightsymbool.
  2054. HTML heeft een Character Entity Encoding voor het coderen van speciale symbolen zoals de euro-, pond- en yen-tekens. Deze tekens coderen we met naamcodes
  2055. of numerieke codes. Hier volgt een tabel met symbolen en hun code.
  2056. 1.8 Codering en design van de footer 61
  2057. Symbool Code Numeriek Omschrijving
  2058. &nbsp; &160; spatie
  2059. © &copy; &169; copyright
  2060. ® &reg; &174; geregistreerd
  2061. ™ &trade; &8482; trademark
  2062.  &euro; &8364; euro
  2063.  &pond; &163; pond
  2064.  &yen; &165; yen
  2065. & &AMP; &38; ampersand
  2066. < &lt; &60; minder dan
  2067. > &gt; &62; hoger dan
  2068. " &quot; &34; aanhalingsteken
  2069. • Webbouw 26
  2070. Open styles.css en voeg de volgende stijlen eraan toe:
  2071. footer{
  2072. position: fixed;
  2073. bottom: 0;
  2074. right: 0;
  2075. left: 0;
  2076. margin: 0;
  2077. float: left;
  2078. text-align: center;
  2079. width: 100%;
  2080. padding-top: 20px;
  2081. padding-bottom: 10px;
  2082. background: linear-gradient(to right, red, orange, yellow, green, blue,
  2083. indigo, violet);
  2084. }
  2085. footer img{
  2086. margin: 0;
  2087. width: 4%;
  2088. }
  2089. footer p{
  2090. margin: 0;
  2091. color: firebrick;
  2092. }
  2093. Het resultaat van hoofdstuk 1 van het boek zie je hieronder:
  2094. 62 1 Basis HTML5 en CSS3
  2095. Figuur 1.39
  2096. 1.9 De playlist-pagina
  2097. In deze paragraaf maken we de codering van de playlist-pagina. We maken kennis
  2098. met de volgende HTML-elementen:
  2099. • onclick events
  2100. • getElementById
  2101. • video-object
  2102. • table
  2103. • audio object
  2104. We behandelen ook de volgende CSS-attributen:
  2105. • text-transform
  2106. • nth-child( )
  2107. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  2108. Planning Inleveren
  2109. Webbouw 27 t/m 35
  2110. Lab 09
  2111. In de playlist-pagina willen we drie albumcovers van drie artiesten weergeven.
  2112. Verder willen we dat als de user een album selecteert er aan de rechterkant een
  2113. multimediasectie van dat album wordt weergegeven. De multimediasectie bestaat
  2114. uit een video en een playlist van het gekozen album. Hieronder zie je het gewenste
  2115. 1.9 De playlist-pagina 63
  2116. resultaat van de playlist-pagina:
  2117. Figuur 1.40
  2118. Alle pagina’s moeten hetzelfde design krijgen, zo ervaart de gebruiker dezelfde
  2119. ‘look & feel’ gedurende het browsen op de website. Voor ons betekent dat dat sommige elementen zoals de navigatie, het logo en de footer hetzelfde blijven. Het
  2120. enige wat verandert is het hoofdonderwerp in het <main>-element. We hebben de
  2121. stijlen voor deze elementen in de vorige paragrafen gecodeerd en we hergebruiken
  2122. dezelfde stijlen in de playlist-pagina.
  2123. Codering van playlist-pagina
  2124. In de volgende opgave maken we een kopie van index.html en vervangen we het
  2125. <main>-element door een nieuw <main>-element.
  2126. • Webbouw 27
  2127. Stap 1: Open index.html en sla dit op als playlist.html.
  2128. Stap 2: Vervang het <main>-element door het volgende <main>-element:
  2129. . . .
  2130. <main>
  2131. <div id="albums"><h3>Albums</h3></div>
  2132. <div id="multimedia"><h3>Multimedia</h3></div>
  2133. </main>
  2134. . . .
  2135. Het resultaat zie je hieronder:
  2136. 64 1 Basis HTML5 en CSS3
  2137. Figuur 1.41
  2138. We maken nu de code voor drie albums met onclick-events.
  2139. • Webbouw 28
  2140. Open playlist.html en vervang <h3>Albums</h3> met de volgende <ul>-lijst.
  2141. Binnen dubbele aanhalingstekens kunnen we enkele aanhalingstekens gebruiken,
  2142. dan is duidelijker wat bij elkaar hoort.
  2143. "tekst 'tekst'"
  2144. En binnen enkele aanhalingstekens kun je dubbele gebruiken als het nodig is:
  2145. 'tekst "tekst"'
  2146. . . .
  2147. <main>
  2148. <div id="albums">
  2149. <ul>
  2150. <li>
  2151. <a onclick=
  2152. "document.getElementById('album-1').style.display='block';
  2153. document.getElementById('album-2').style.display='none';
  2154. document.getElementById('album-3').style.display='none';">
  2155. <img src="images/album-1.jpg"></a>
  2156. </li>
  2157. <li>
  2158. <a onclick=
  2159. "document.getElementById('album-1').style.display='none';
  2160. document.getElementById('album-2').style.display='block';
  2161. document.getElementById('album-3').style.display='none';">
  2162. <img src="images/album-2.jpg"></a>
  2163. </li>
  2164. <li>
  2165. <a onclick=
  2166. "document.getElementById('album-1').style.display='none';
  2167. document.getElementById('album-2').style.display='none';
  2168. document.getElementById('album-3').style.display='block';">
  2169. <img src="images/album-3.jpg"></a>
  2170. </li>
  2171. </ul>
  2172. 1.9 De playlist-pagina 65
  2173. </div> <!-- einde albums -->
  2174. <div id="multimedia"><h3>Multimedia</h3></div>
  2175. </main>
  2176. . . .
  2177. Hier zien we voorbeelden van het gebruik van aanhalingstekens binnen aanhalingstekens in code. Dit doen we met enkele aanhalingstekens. Bijvoorbeeld een
  2178. boektitel: "De boektitel is 'JavaScript'."
  2179. LET OP
  2180. In Webbouw 28 hebben we ook gezegd dat bij het klikken op de tweede afbeelding
  2181. het element ‘album-2’ zichtbaar moet worden en ‘album-1’ en ‘album-3’ onzichtbaar. In het tweede onclick-event:
  2182. album-1 krijgt display='none'
  2183. album-2 krijgt display='block'
  2184. album-3 krijgt display='none'
  2185. Wat zijn events?
  2186. Een webpagina herkent vier soorten events:
  2187. • window-events
  2188. • formulier-events
  2189. • toetsenbord-events
  2190. • muis-events
  2191. Een voorbeeld van een muis-event is wanneer er wordt geklikt op een knop of een
  2192. afbeelding. Dit event heet onclick. In de vorige opgave hebben we als volgt een
  2193. onclick-event toegevoegd aan het <a>-element:
  2194. <a onclick=". . .">
  2195. Tussen de aanhalingstekens zeggen we wat er moet gebeuren als dit event zich
  2196. voordoet:
  2197. <a onclick=
  2198. "document.getElementById('album-1').style.display='block';
  2199. document.getElementById('album-2').style.display='none';
  2200. document.getElementById('album-3').style.display='none';">
  2201. <img src="images/album-1.jpg">
  2202. </a>
  2203. In dit voorbeeld hebben we ervoor gezorgd dat als er op de afbeelding van het
  2204. eerste album wordt geklikt het element album-1 zichtbaar wordt en de elementen
  2205. album-2 en album-3 onzichtbaar. De elementen album-2 en album-3 coderen we in de
  2206. komende opgaven.
  2207. 66 1 Basis HTML5 en CSS3
  2208. De methode getElementById
  2209. We maken gebruik van deze methode als volgt:
  2210. getElementById('id')
  2211. Enkele en dubbele aanhalingstekens zijn verwisselbaar, maar je moet consequent
  2212. zijn, bijvoorbeeld:
  2213. onclick = "document.getElementBiId('album-1')"
  2214. is hetzelfde als:
  2215. onclick = 'document.getElementBiId("album-1")'
  2216. Als het onclick-event begint met dubbele aanhalingstekens, dan moet het ook eindigen met dubbele aanhalingstekens.
  2217. Met deze methode selecteren we een element door middel van zijn id. Daarna kunnen we de attributen van het geselecteerde element wijzigen, bijvoorbeeld het attribuut display.
  2218. Het attribuut display
  2219. Dit attribuut heeft de volgende opties:
  2220. • block zichtbaar
  2221. • inline zichtbaar
  2222. • none onzichtbaar
  2223. Voorbeelden van block-elementen zijn:
  2224. • <h1>
  2225. • <p>
  2226. • <l1>
  2227. • <div>
  2228. Een inline-element krijgt geen marges. Voorbeelden van inline-elementen zijn:
  2229. • <span>
  2230. • <a>
  2231. Design van albums
  2232. In de volgende opgave coderen we de stijlen van het albums-element.
  2233. • Webbouw 29
  2234. Open styles.css en voeg de volgende stijlen eraan toe.
  2235. #albums{
  2236. width: 25%;
  2237. padding-left: 5%;
  2238. float: left;
  2239. }
  2240. 1.9 De playlist-pagina 67
  2241. #albums ul li img{
  2242. width: 50%;
  2243. margin-top: 9%;
  2244. box-shadow: 4px 4px 10px rgba(0,0,0,0.5);
  2245. }
  2246. Het resultaat zie je hieronder.
  2247. Figuur 1.42
  2248. • Webbouw 30
  2249. Open playlist.html en vervang het element <h3>Multimedia</h3> door het volgende:
  2250. . . .
  2251. </div> <!-- einde albums -->
  2252. <div id="multimedia">
  2253. <div id="album-1" style='display: block'>
  2254. <video controls width="80%" preload poster="images/album-1.jpg">
  2255. <source src="videos/trailer.webm" type="video/webm"/>
  2256. <source src="videos/trailer.ogv" type="video/ogg"/>
  2257. <source src="videos/trailer.mp4" type="video/mp4"/>
  2258. </video>
  2259. </div> <!-- einde album-1 -->
  2260. </div> <!-- einde multimedia -->
  2261. </main>
  2262. . . .
  2263. video
  2264. Met het element <video> stellen we de attributen van het video-object in. Het attribuut poster geeft het beginbeeld en de attributen width en height geven de dimensies van het video-object aan. Bijvoorbeeld:
  2265. 68 1 Basis HTML5 en CSS3
  2266. <video controls width="100%" height="250px"
  2267. preload id="videos"
  2268. poster="videos/videoposter.jpg">
  2269. source
  2270. Met het element <source> (bron) geven we aan waar de video te vinden is en wat
  2271. voor type video het is. De bron van een video kan je eigen website zijn of een andere website zoals YouTube. In ons geval plaatsen we de video in de map videos.
  2272. <source src="videos/trailer.webm" type="video/webm"/>
  2273. <source src="videos/trailer.ogv" type="video/ogg"/>
  2274. <source src="videos/trailer.mp4" type="video/mp4"/>
  2275. Het type attribuut geeft het format van de video aan. HTML5 maakt het mogelijk
  2276. om video’s af te spelen zonder browser-plugins. Het probleem is echter dat er op
  2277. dit moment nog geen standaardformat is. Niet alle browsers ondersteunen elk formaat. De indeling MP4 wordt op dit moment het meest gebruikt. Willen we onze
  2278. video’s in alle browsers kunnen afspelen, dan betekent dit dat we onze video’s moeten converteren naar alle formats.
  2279. Videoformaat
  2280. Hieronder zien we de videoformats die ondersteund worden door de verschillende
  2281. browsers.
  2282. Chrome MP4, OOG, WEBM
  2283. Mozilla OGG, WEBM
  2284. Opera OOG, WEBM
  2285. Safari MP4
  2286. Microsoft Flash
  2287. 1.9 De playlist-pagina 69
  2288. Videoconversies
  2289. Op internet is gratis software voor videoconversie te downloaden. Zoek een fi lmpje
  2290. voor je website en maak daarna met behulp van conversiesoftware meerdere fi lmpjes in de verschillende formats voor alle browsers. Zorg ervoor dat je je video in
  2291. ieder geval naar de volgende drie formats converteert.
  2292. • webm
  2293. • ogg
  2294. • mp4
  2295. Design van multimedia
  2296. In de volgende opgave coderen we de stijlen van het multimedia-element.
  2297. • Webbouw 31
  2298. Open styles.css en voeg de volgende stijlen eraan toe.
  2299. #multimedia{
  2300. width: 55%;
  2301. border-radius: 2%;
  2302. padding-top: 2%;
  2303. box-shadow: 4px 4px 10px rgba(0,0,0,0.5);
  2304. float: left;
  2305. background-image: linear-gradient(to bottom, hsl(0, 80%, 50%), #bada55);
  2306. }
  2307. Het resultaat zie je hieronder:
  2308. Figuur 1.43
  2309. 70 1 Basis HTML5 en CSS3
  2310. Tabellen
  2311. Een tabel coderen we met de <table>-tag. De eenvoudigste tabel bestaat uit één
  2312. rij en één kolom. Je mag een tabel splitsen in drie secties: een koptekst (header),
  2313. een voettekst (footer) en de tabel zelf (body). In het volgende voorbeeld zien we de
  2314. basisstructuur van een tabel:
  2315. <table>
  2316. <thead> . . . </thead>
  2317. <tfoot> . . . </tfoot>
  2318. <tbody> . . . </tbody>
  2319. </table>
  2320. thead
  2321. De tag <thead> gebruiken we om alle <th>-elementen of alle kopteksten van een
  2322. tabel te groeperen. Bijvoorbeeld:
  2323. <table>
  2324. <thead>
  2325. <tr>
  2326. <th>Naam</th>
  2327. <th>Adres</th>
  2328. <th>Postcode</th>
  2329. <th>Stad</th>
  2330. </tr>
  2331. </thead>
  2332. <tfoot> . . . </tfoot>
  2333. <tbody> . . . </tbody>
  2334. </table>
  2335. tr
  2336. Het element <tr> markeert het begin van een tabelrij.
  2337. th
  2338. Het element <th> gebruiken we voor kopteksten van de <thead>-elementen en voor
  2339. de voetteksten van de <tfoot>-elementen.
  2340. tfoot
  2341. Het <tfoot>-element gebruiken we om alle voetteksten van een tabel te
  2342. groeperen. Bijvoorbeeld:
  2343. <table>
  2344. <thead>
  2345. <tr>
  2346. <th>Naam</th>
  2347. <th>Adres</th>
  2348. <th>Postcode</th>
  2349. <th>Stad</th>
  2350. </tr>
  2351. </thead>
  2352. 1.9 De playlist-pagina 71
  2353. <tfoot>
  2354. <tr>
  2355. <th colspan="4">NAW-gegevens</th>
  2356. </tr>
  2357. </tfoot>
  2358. <tbody> . . . </tbody>
  2359. </table>
  2360. colspan
  2361. Het attribuut colspan geeft aan hoeveel kolommen een element breed is. In dit geval is de voettekst van de tabel 4 kolommen breed.
  2362. <th colspan="4">NAW-gegevens</th>
  2363. tbody
  2364. Het <tbody>-element gebruiken we om alle <td>-elementen of alle cellen van een
  2365. tabel te groeperen. Bijvoorbeeld:
  2366. <tbody>
  2367. <tr>
  2368. <td>Marco Leeman</td>
  2369. <td>Kruislaan 222</td>
  2370. <td>3333XX</td>
  2371. <td>Rotterdam</td>
  2372. </tr>
  2373. <tr>
  2374. <td>Gebre Gebrmariam</td>
  2375. <td>Middenweg 111</td>
  2376. <td>1000AB</td>
  2377. <td>Utrecht</td>
  2378. </tr>
  2379. </tbody>
  2380. </table>
  2381. Met de bovenstaande code genereren we de volgende tabel:
  2382. Naam Adres Postcode Plaats
  2383. Marco Leeman Kruislaan 222 3333XX Rotterdam
  2384. Gebre Gebrmariam Middenweg 111 1000AB Utrecht
  2385. NAW-gegevens
  2386. • Lab 09
  2387. Open een nieuw bestand en sla het op als lab09.html. In deze lab-opdracht maak
  2388. je de volgende tabel aan.
  2389. Figuur Lab 09
  2390. 72 1 Basis HTML5 en CSS3
  2391. Open een nieuw bestand en sla het op als lab09.css. Codeer de volgende stijlen.
  2392. – Geef de tabel een dubbele border.
  2393. – Geef een achtergrond met een linear-gradient.
  2394. – Geef alle tabelcellen <td> een padding-left en padding-right van 15px.
  2395. In de volgende opgave maken we een tabel voor een playlist van drie tracks voor
  2396. het eerste album.
  2397. • Webbouw 32
  2398. Open playlist.html en voeg de volgende tabel eraan toe.
  2399. . . .
  2400. </video>
  2401. <table>
  2402. <thead>
  2403. <tr>
  2404. <th>Track</th><th>Titel</th><th>Tijd</th><th>Play</th>
  2405. </tr>
  2406. </thead>
  2407. <tbody>
  2408. <tr>
  2409. <td>1</td>
  2410. <td>Titel 1</td>
  2411. <td>02:08</td>
  2412. <td>
  2413. <a onclick="
  2414. document.getElementById('audio').src='muziek/2121.mp3';
  2415. v=document.getElementById('audio');
  2416. v.play();">|></a>
  2417. </td>
  2418. </tr>
  2419. <tr>
  2420. <td>2</td>
  2421. <td>Titel 2</td>
  2422. <td>03:18</td>
  2423. <td>
  2424. <a onclick="
  2425. document.getElementById('audio').src='muziek/2121.mp3';
  2426. v=document.getElementById('audio');
  2427. v.play();">|></a>
  2428. </td>
  2429. </tr>
  2430. <tr>
  2431. <td>3</td>
  2432. <td>Titel 3</td>
  2433. <td>02:08</td>
  2434. <td>
  2435. <a onclick="
  2436. document.getElementById('audio').src='muziek/2121.mp3';
  2437. v=document.getElementById('audio');
  2438. v.play();">|></a>
  2439. 1.9 De playlist-pagina 73
  2440. </td>
  2441. </tr>
  2442. </tbody>
  2443. </table>
  2444. <audio style="display: block" id="audio" src="muziek/2121.mp3" controls>
  2445. </audio>
  2446. </div> <!-- einde album-1 -->
  2447. <div id="album-2" style='display: none'>
  2448. . . .
  2449. </div> <!-- einde album-2 -->
  2450. <div id="album-3" style='display: none'>
  2451. . . .
  2452. </div> <!-- einde album-3 -->
  2453. </div> <!-- einde multimedia -->
  2454. </main>
  2455. . . .
  2456. Hier hebben we de tekens |> gebruikt voor de PLAY-knop.
  2457. In de vorige opgave maakten we weer gebruik van het onclick-event. In dit geval
  2458. willen we dat als er op een track wordt geklikt de bron en de naam van de track die
  2459. afgespeeld moet worden afgespeeld. Dit doen we als volgt:
  2460. <a onclick="
  2461. document.getElementById('audio').src='muziek/2121.mp3';
  2462. v=document.getElementById('audio');
  2463. v.play();">|></a>
  2464. audio
  2465. Het element audio gebruiken we voor het bepalen van de audiocontroles van het
  2466. audio-object. De controles zijn: volume, play en pause.
  2467. source
  2468. Het attribuut src (bron) geeft de bron aan van het audio-object. De bron kan een
  2469. MP3- of MPEG4-bestand in een map van de eigen website zijn of een externe website zoals iTunes. In ons geval is de map muziek de bron van de tracks.
  2470. <audio style="display: block" id="audio" src="muziek/2121.mp3" controls>
  2471. play-methode
  2472. De play-methode hoort bij het audio-object en speelt het aangegeven bestand af.
  2473. Bijvoorbeeld:
  2474. v=document.getElementById('audio');
  2475. v.play();">|></a>
  2476. audioformat
  2477. Hieronder zien we de verschillende audioformats voor het audio-object.
  2478. 74 1 Basis HTML5 en CSS3
  2479. Formaat Extensie Omschrijving
  2480. WAV .wav Ontwikkeld door IBM en Microsoft voor Windows
  2481. OGG .ogg Ontwikkeld door Xiph.org
  2482. MP3 .mp3 Het populairste formaat, werkt in alle browsers
  2483. In de volgende opgave maken we de stijlen voor de playlist-tabel.
  2484. • Webbouw 33
  2485. Open styles.css en voeg de volgende stijlen eraan toe.
  2486. table {
  2487. width: 100%;
  2488. }
  2489. table th{
  2490. text-transform: uppercase;
  2491. }
  2492. tbody tr:nth-child(odd) {
  2493. backgroundColor: #868585;
  2494. }
  2495. tbody tr:hover{
  2496. opacity: 0.6; filter: alpha(opacity=6);
  2497. }
  2498. audio{
  2499. width: 100%;
  2500. }
  2501. LET OP
  2502. Bij tr:nth-child en tr:hover mag je geen spaties typen.
  2503. text-transform
  2504. Dit attribuut gebruiken we voor het omzetten van teksten in hoofdletters of kleine
  2505. letters.
  2506. transform Omschrijving
  2507. lowercase Omzetten in kleine letters
  2508. uppercase Omzetten in hoofdletters
  2509. capitalize Eerste letter omzetten in hoofdletter
  2510. Bijvoorbeeld:
  2511. h1{text-transform: lowercase}
  2512. resultaat: radio gaga
  2513. h1{text-transform: uppercase}
  2514. resultaat: RADIO GAGA
  2515. 1.9 De playlist-pagina 75
  2516. h1{text-transform: capitalize}
  2517. resultaat: Radio Gaga
  2518. nth-child()
  2519. Met dit attribuut selecteren we child-elementen in geneste elementen, bijvoorbeeld
  2520. in een lijst of tabel. Onze playlist tabel heeft meerdere rijen voor tracks. Met dit attribuut kunnen we de stijlen coderen voor bijvoorbeeld de even of oneven rijen:
  2521. Nth-child Omschrijving
  2522. tbody tr:nth-child(odd) Selecteer even tabelrijen
  2523. tbody tr:nth-child(even) Selecteer oneven tabelrijen
  2524. tbody tr:nth-child(2) Selecteer de tweede tabelrij
  2525. We selecteren de oneven rijen om vervolgens een andere achtergrondkleur te specifi ceren. Dit doen we als volgt:
  2526. tbody tr:nth-child(odd) {
  2527. backgroundColor: #868585;
  2528. }
  2529. Daarna coderen we een hover-eff ect met een ondoorzichtigheid als volgt:
  2530. tbody tr:hover{
  2531. opacity: 0.6; filter: alpha(opacity=6);
  2532. }
  2533. Het resultaat zien we hieronder:
  2534. Figuur 1.44
  2535. 76 1 Basis HTML5 en CSS3
  2536. • Webbouw 34
  2537. In deze opgave maak je de code en de stijlen voor album-2 en album-3.
  2538. <div id="album-2" style='display: none'>
  2539. . . .
  2540. </div>
  2541. <div id="album-3" style='display: none'>
  2542. . . .
  2543. </div>
  2544. Bij ieder album vervang je de puntjes door een:
  2545. • video-object
  2546. • playlist-tabel
  2547. • audio-object
  2548. Bijvoorbeeld, als we op het tweede album klikken, moeten de video, de tracks en
  2549. het audio-object voor het tweede album verschijnen. Het resultaat zie je hieronder:
  2550. Figuur 1.45
  2551. • Webbouw 35
  2552. In deze opgave maak je de code van het bladerknop-element in de playlist-pagina
  2553. als volgt:
  2554. – vorige knop gaat naar index.html;
  2555. – volgende knop gaat naar formulier.html.
  2556. 1.10 De formulierpagina
  2557. In deze paragraaf maken we de code van de formulierpagina. We maken kennis
  2558. met de volgende HTML-elementen:
  2559. 1.10 De formulierpagina 77
  2560. • form
  2561. • fi eldset
  2562. • legend
  2563. • input type text
  2564. • datalist
  2565. • input type radio
  2566. • textarea
  2567. • input type checkbox
  2568. • input type submit
  2569. We maken ook kennis met de volgende CSS-attributen:
  2570. • input: required
  2571. • input: invalid
  2572. • input: focus
  2573. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  2574. Planning Inleveren
  2575. Webbouw 36 t/m 49
  2576. Lab 10
  2577. In de formulierpagina willen we een formulier maken waar de user gratis kaarten
  2578. kan bestellen voor een concert. Hieronder zie je het gewenste resultaat van de formulierpagina:
  2579. Figuur 1.46
  2580. 78 1 Basis HTML5 en CSS3
  2581. Codering van het formulier
  2582. In de volgende opgave maken we een formulier voor het bestellen van gratis concertkaarten.
  2583. • Webbouw 36
  2584. Stap 1: Open index.html en sla het op als formulier.html.
  2585. Stap 2: Vervang het <main>-element door het volgende <main>-element:
  2586. . . .
  2587. <main>
  2588. <form name="formulier"
  2589. action = "mailto: postmaster@radiogaga.com"
  2590. method = "post">
  2591. <fieldset>
  2592. . . .
  2593. </fieldset>
  2594. </form>
  2595. </main>
  2596. . . .
  2597. Hier zien we dat in codering de spaties vóór en na het =-teken optioneel zijn.
  2598. In de volgende opgaven gaan we de puntjes van het formulier invullen.
  2599. form
  2600. Met het <form>-element coderen we formulieren. Tussen de <form>- en </form>-tags
  2601. in mag je alleen formulier-elementen plaatsen. Aan de <form>-tag kun je een actie
  2602. (action) en een methode (method) toekennen. Zo kunnen de gegevens in een formulier in combinatie met scripts (bijvoorbeeld PHP, Personal Home Page) via de server lopen. Om de gegevens te kunnen mailen gebruik je bij action de term mailto:
  2603. <form name="formulier"
  2604. action = "mailto: postmaster@radiogaga.com"
  2605. method = "post">
  2606. Bij method geef je aan wat er met de informatie gedaan moet worden. In dit voorbeeld kiezen we voor post, want de informatie moet verzonden worden naar het
  2607. email-adres.
  2608. De basiselementen van een formulier zijn:
  2609. • invoervelden
  2610. • selectievakjes
  2611. • keuzerondjes
  2612. • keuzemenu
  2613. • knoppen
  2614. 1.10 De formulierpagina 79
  2615. Hieronder zien we een voorbeeld van de basiselementen van een formulier:
  2616. Figuur 1.47
  2617. • Webbouw 37
  2618. Open formulier.html en voeg de volgende formulier-elementen eraan toe:
  2619. . . .
  2620. <fieldset>
  2621. <legend>Bestel gratis kaarten</legend>
  2622. <input required type="text" id="naam"
  2623. name="naam" placeholder="Naam" /><br>
  2624. <input required type="email" id="email"
  2625. name="email" placeholder="E-mail" /><br>
  2626. <input required type="text" id="mobiel"
  2627. name="mobiel" placeholder="Mobiel" /><br>
  2628. </fieldset>
  2629. . . .
  2630. fi eldset
  2631. Met het <fieldset>-element groeperen we een aantal formulier-elementen.
  2632. legend
  2633. Het <legend>-element is de legenda of beschrijving van een fieldset.
  2634. input type="text"
  2635. Het element <input type="text"> is een formulier-element met een invulvenster.
  2636. Bijvoorbeeld:
  2637. <input required type="text" id="naam" placeholder="vul uw naam in" />
  2638. • input type="text" geeft aan dat het een invulvenster voor tekst is.
  2639. • id="naam" geeft aan dat de referentienaam van het veld naam is.
  2640. • required geeft aan dat het invulvenster verplicht ingevuld moet worden.
  2641. • placeholder geeft de tekst die automatisch in het invulvenster verschijnt.
  2642. 80 1 Basis HTML5 en CSS3
  2643. • Webbouw 38
  2644. Open formulier.html en voeg de volgende elementen eraan toe:
  2645. . . .
  2646. <input required type="text" placeholder="Woonplaats" name="woonplaats"
  2647. id="woonplaats" list="steden" />
  2648. <datalist id="steden">
  2649. <option value="Amsterdam" />
  2650. <option value="Utrecht" />
  2651. <option value="Antwerpen" />
  2652. <option value="Apeldoorn" />
  2653. <option value="Brussel" />
  2654. <option value="Rotterdam" />
  2655. </datalist>
  2656. <br>
  2657. </fieldset>
  2658. . . .
  2659. list
  2660. Het list-attribuut van een element <input type="text"> geeft aan dat dit een optielijst is. Het attribuut geef de naam van de lijst aan:
  2661. list="steden"
  2662. datalist
  2663. Het datalist-element is de lijst met een aantal keuze-opties.
  2664. <datalist id="steden">
  2665. <option value="Amsterdam" />
  2666. <option value="Utrecht" />
  2667. <option value="Antwerpen" />
  2668. <option value="Apeldoorn" />
  2669. <option value="Brussel" />
  2670. <option value="Rotterdam" />
  2671. </datalist>
  2672. Niet alle steden staan in de lijst, we mogen ook onze eigen optie intypen. Het datalist-element is ook handig als we een lange lijst met opties hebben. Bijvoorbeeld
  2673. in ons geval: als we de letter A intikken krijgen we alleen de steden die de letter A
  2674. bevatten.
  2675. Figuur 1.48
  2676. 1.10 De formulierpagina 81
  2677. • Webbouw 39
  2678. Open formulier.html en voeg de volgende elementen eraan toe:
  2679. . . .
  2680. <select required naam="concerten" id="concerten">
  2681. <option value="0">Kies een concert</option>
  2682. <option value="Manu Chau">Manu Chau</option>
  2683. <option value="Evanescence">Evanescence</option>
  2684. <option value="Sade">Sade</option>
  2685. </select>
  2686. <br>
  2687. </fieldset>
  2688. . . .
  2689. select
  2690. Het select-element is een keuzemenu met een beperkte aantal opties. Hier mogen
  2691. we geen eigen opties intypen.
  2692. option
  2693. Het option-element geeft de opties aan. De tekst tussen de tags <option> en
  2694. </ option> is de tekst die in het keuzemenu verschijnt.
  2695. • Webbouw 40
  2696. Open formulier.html en voeg de volgende elementen eraan toe:
  2697. . . .
  2698. <label for="datum">Geboortedatum: </label> <br>
  2699. <input required type="date" name="datum" id="datum" /> <br>
  2700. <label for="geslacht">Geslacht: </label>
  2701. Man <input type="radio" name="geslacht" value="M" />
  2702. Vrouw <input type="radio" name="geslacht" value="V" />
  2703. <br>
  2704. </fieldset>
  2705. . . .
  2706. input type="date"
  2707. Het date-element genereert een maandkalender waarin we een datum kunnen
  2708. kiezen.
  2709. input type="radio"
  2710. Een keuzerondje (radio-button) gebruik je uitsluitend om een optie uit een lijst te
  2711. kunnen kiezen. Bij het maken van een groep keuzerondjes moeten alle keuzerondjes dezelfde naam krijgen, bijvoorbeeld: name="geslacht".
  2712. 82 1 Basis HTML5 en CSS3
  2713. • Webbouw 41
  2714. Open formulier.html en voeg de volgende elementen eraan toe:
  2715. . . .
  2716. <textarea placeholder="Schrijf een commentaar..."></textarea><br>
  2717. </fieldset>
  2718. . . .
  2719. textarea
  2720. Omdat een tekstveld weinig ruimte biedt om veel tekst kwijt te kunnen, kun je gebruik maken van <textarea>. We kunnen het aantal kolommen en rijen aangeven.
  2721. Bijvoorbeeld:
  2722. <textarea cols="35" rows="4"> </textarea>
  2723. checkbox
  2724. Selectievakjes (checkboxes) gebruik je om één of meer opties te kunnen kiezen. Bij
  2725. het maken van een selectievakje krijgen alle vakjes een eigen naam.
  2726. • Webbouw 42
  2727. Open formulier.html en voeg de volgende elementen eraan toe:
  2728. . . .
  2729. <label for="abonnementen">Gratis abonnementen:</label><br>
  2730. Nieuwsbrief:
  2731. <input type = "checkbox" name="nieuwsbrief"
  2732. id = "nieuwsbrief" value="nieuwsbrief" /><br>
  2733. Concertagenda:
  2734. <input type = "checkbox" name="agenda"
  2735. id = "agenda" value="agenda" /><br>
  2736. <label for="ranking">Album Ranking</label>
  2737. <input type="range" name="ranking" id="ranking" min="1" max="5">
  2738. </fieldset>
  2739. . . .
  2740. Input type = "range"
  2741. Met dit range-element kunnen we een getal tussen een minimale en een maximale
  2742. waarde aangeven.
  2743. Input type = "submit"
  2744. Bij online-formulieren kun je ook knoppen (buttons) gebruiken. Een verplicht onderdeel van een formulier is de verzendknop (submit-button). Dit doen we op de
  2745. volgende manier.
  2746. • Webbouw 43
  2747. Open formulier.html en voeg de volgende elementen eraan toe:
  2748. 1.10 De formulierpagina 83
  2749. . . .
  2750. </fieldset>
  2751. <input type="submit" id="verzend"
  2752. name="verzend" value="Verzend" />
  2753. </form>
  2754. </main>
  2755. . . .
  2756. Het resultaat van de codering van het formulier zie je hieronder:
  2757. Figuur 1.49
  2758. • Webbouw 44
  2759. In deze opgave codeer je het bladerknop-element in de formulierpagina als volgt:
  2760. – vorige knop gaat naar playlist.html;
  2761. – volgende knop gaat naar contact.html.
  2762. Design van het formulier
  2763. In de volgende opgave maken we het design voor het formulier.
  2764. • Webbouw 45
  2765. Open styles.css en voeg de volgende stijlen eraan toe.
  2766. form{
  2767. width: 100%;
  2768. margin: 0;
  2769. text-align: center;
  2770. }
  2771. legend{
  2772. font-size: 1.5em;
  2773. font-weight: bold;
  2774. }
  2775. fieldset{
  2776. border: solid 2px #009D22;
  2777. width: 70%;
  2778. margin: auto;
  2779. border-radius: 2%;
  2780. background-image: linear-gradient(to bottom, hsl(0, 80%, 50%), #bada55);
  2781. }
  2782. 84 1 Basis HTML5 en CSS3
  2783. Hier geven we het fieldset-element hetzelfde lineaire kleurverloop als het multimedia-element van de playlist-pagina. In de volgende opgave maken we het design
  2784. van de input-, select- en textarea-elementen.
  2785. • Webbouw 46
  2786. Open styles.css en voeg de volgende stijlen eraan toe.
  2787. input, select, textarea{
  2788. border: solid 1px rgb(0, 0, 0);
  2789. margin: 5px;
  2790. padding: 5px 30px 5px 50px;
  2791. width: 50%;
  2792. text-align: center;
  2793. font-size: 1em;
  2794. border-radius: 5px;
  2795. }
  2796. In de volgende opgave zorgen we ervoor dat het vakje dat ingevuld moet worden
  2797. extra opvalt (focus) door een groene schaduw.
  2798. • Webbouw 47
  2799. Open styles.css en voeg de volgende stijlen eraan toe.
  2800. input: focus, textarea: focus{
  2801. box-shadow: 6px 6px 10px #2eef1e;
  2802. }
  2803. select{
  2804. width: 35%;
  2805. }
  2806. In de volgende opgave coderen we de opmaak voor de rest van de input-elementen.
  2807. Bij ieder element geven we het type tussen vierkante haakjes [ ] aan.
  2808. • Webbouw 48
  2809. Open styles.css en voeg de volgende stijlen eraan toe.
  2810. input[type=date]{
  2811. width: 25%;
  2812. }
  2813. input[type=checkbox],
  2814. input[type=radio] {
  2815. width: 4%;
  2816. }
  2817. input[type=submit] {
  2818. backgroundColor: #bada55;
  2819. width: 43%;
  2820. opacity: 0.6;
  2821. }
  2822. input[type=submit]: hover {
  2823. opacity: 1;
  2824. transition: opacity 0.5s linear;
  2825. }
  2826. 1.10 De formulierpagina 85
  2827. Merk op dat alle input-elementen gedefi nieerd waren met een breedte van 50.
  2828. Daarom moet nu worden aangegeven dat de radio-elementen een breedte van 4
  2829. moeten hebben. Het resultaat zie je hieronder:
  2830. Figuur 1.50
  2831. • Webbouw 49
  2832. In deze opgave codeer je het bladerknop-element in de playlist-pagina als volgt:
  2833. – vorige knop gaat naar playlist.html;
  2834. – volgende knop gaat naar contact.html.
  2835. • Lab 10
  2836. Open een nieuw bestand en sla het op als lab10.html. In deze lab-opdracht maak je
  2837. het volgende formulier aan.
  2838. Figuur Lab 10
  2839. 86 1 Basis HTML5 en CSS3
  2840. 1.11 De contactpagina
  2841. In deze paragraaf maken we de code van de contactpagina. We maken kennis met
  2842. de volgende html inline-elementen:
  2843. • p
  2844. • strong
  2845. • em
  2846. • mark
  2847. We maken ook kennis met de volgende CSS-attributen:
  2848. • overflow
  2849. • text-shadow
  2850. • line-height
  2851. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  2852. Planning Inleveren
  2853. Webbouw 50 t/m 52
  2854. Lab 11
  2855. Op de contactpagina willen we een korte tekst over onze organisatie plaatsen. We
  2856. willen ook een kort formulier waar de user vragen kan stellen of feedback aan de
  2857. webmaster kan geven.
  2858. Codering van de contactpagina
  2859. • Webbouw 50
  2860. Stap 1: Open index.html en sla het op als contact.html.
  2861. Stap 2: Vervang het <main>-element door het volgende <main>-element:
  2862. . . .
  2863. <main>
  2864. <p id="contact">
  2865. <span>Aliquam erat volutpat.</span> <em>Mauris</em> vel neque sit amet nunc
  2866. gravida
  2867. <strong>congue sed sit amet purus</strong>.<br> <mark>Quisque</mark> lacus
  2868. quam, egestas ac tincidunt a, lacinia vel velit.<br>
  2869. </p>
  2870. </main>
  2871. . . .
  2872. LET OP
  2873. In HTML mag je tekst afbreken met de <br>-tag. De Enter-toets heeft in je code
  2874. geen enkel eff ect.
  2875. 1.11 De contactpagina 87
  2876. Het element <p>
  2877. Met het <p>-element openen we een nieuwe alinea en met </p> sluiten we de alinea. Alle tekst ertussenin is de inhoud van de alinea. Op alinea’s kunnen we allerlei
  2878. tekstattributen toepassen, zoals lettertype, tekengrootte, vet, cursief en links, midden en rechts uitlijnen. Bijvoorbeeld:
  2879. <p>I Amsterdam</p>
  2880. em
  2881. Het <em>-element gebruiken we om een woord of tekst cursief weer te geven.
  2882. Bijvoorbeeld:
  2883. <p><em>I</em> Amsterdam</p>
  2884. geeft als resultaat:
  2885. I Amsterdam
  2886. strong
  2887. Het <strong>-element gebruiken we om een woord of tekst vet weer te geven.
  2888. Bijvoorbeeld:
  2889. <p><em>I</em> <strong>Am</strong>sterdam</p>
  2890. geeft als resultaat ...
  2891. I Amsterdam
  2892. mark
  2893. Het <mark>-element gebruiken we om een woord of tekst geel te markeren.
  2894. Bijvoorbeeld:
  2895. <p><em>I</em> <strong>Am</strong><mark>sterdam</mark></p>
  2896. geeft als resultaat ...
  2897. I Amsterdam
  2898. Design van de contactpagina
  2899. • Webbouw 51
  2900. Open styles.css en voeg de volgende stijlen eraan toe.
  2901. #contact{
  2902. margin-left: auto;
  2903. margin-right: auto;
  2904. width: 50%;
  2905. text-align: justify;
  2906. line-height: 1.6em;
  2907. }
  2908. 88 1 Basis HTML5 en CSS3
  2909. #contact span{
  2910. font-size: 1.3rem;
  2911. letter-spacing: 5px;
  2912. text-shadow: 2px 2px 4px #2eef1e;
  2913. text-transform: uppercase;
  2914. }input[type=submit]: hover {
  2915. opacity: 1;
  2916. transition: opacity 0.5s linear;
  2917. }
  2918. • Lab 11
  2919. In deze lab-opdracht maak je de contactpagina af door de code voor een feedbackformulier toe te voegen. Het design van de formulier-elementen hebben we al in de
  2920. vorige paragraaf gemaakt. Het resultaat moet er als volgt uitzien.
  2921. Figuur 1.51
  2922. • Webbouw 52
  2923. In deze opgave codeer je het bladerknop-element in de playlist-pagina als volgt:
  2924. – vorige knop gaat naar formulier.html;
  2925. – volgende knop gaat naar index.html.
  2926. 1.12 Responsive design
  2927. In deze paragraaf kijken we naar responsive design. Met responsive design maken
  2928. we vloeiende designs die zich aanpassen aan de resolutie van het scherm van de
  2929. user. Responsive design maken we met grid-frameworks of gridless.
  2930. 1.12 Responsive design 89
  2931. Planning Inleveren
  2932. Webbouw 53 t/m 55
  2933. Lab 12
  2934. Grid-frameworks
  2935. Een grid framework maakt gebruik van kolommen met een vast gedefi nieerde
  2936. breedte. De bekendste frameworks zijn Bootstrap en Foundation. Deze frameworks
  2937. gebruiken een aantal nuttige tools die ons designwerk vereenvoudigen. Het enige
  2938. nadeel is dat deze systemen in het algemeen bestaan uit veel te grote libraries die
  2939. de snelheid van onze website kunnen vertragen. De keuze voor het wel of niet gebruikmaken van een framework hangt af van de hoeveelheid functionaliteit die je
  2940. uit het framework haalt. Als je minder dan 30 van het systeem gebruikt, is het
  2941. niet de moeite waard om het framework toe te voegen aan je website, want veel van
  2942. de functionaliteit kun je zelf coderen in CSS.
  2943. Gridless
  2944. Gridless responsive design is een design waar we zelf de dimensies van kolommen
  2945. en div’s defi niëren in termen van percentages in plaats van vaste breedtes in pixels.
  2946. Bijvoorbeeld, als we een breedte van 95 toepassen op een element, betekent dit
  2947. dat de breedte van het element zich altijd zal aanpassen aan 95 van de breedte
  2948. van het venster of scherm van de user. Het maakt niet uit of het scherm groot, middel of klein is. In deze paragraaf werken we met gridless responsive design, zodat
  2949. we basiskennis van responsive design opdoen.
  2950. Voorbeeld van niet vloeiend design
  2951. In de volgende fi guur zien we een voorbeeld van niet-responsive design. Hier hebben we de breedte van de elementen in pixels gedefi nieerd. Het resultaat is dat bij
  2952. smallere beeldschermen de breedte van de kolommen niet wordt aangepast en een
  2953. deel van de pagina niet meer zichtbaar is.
  2954. Figuur 1.52
  2955. 90 1 Basis HTML5 en CSS3
  2956. Voorbeeld van vloeiend design
  2957. In de volgende fi guur zien we een vloeiend design waar de dimensies van de elementen in termen van percentages zijn gedefi nieerd en zich aanpassen aan de
  2958. breedte van het scherm.
  2959. Figuur 1.53
  2960. Responsive browser-knop
  2961. Als je bijvoorbeeld in je Chrome-browser op Control-Shift-C klikt krijg je het volgende venster waar je onderin de linkerhoek op het mobiel icon kunt klikken. Je
  2962. krijgt onderstaand venster te zien.
  2963. Figuur 1.54
  2964. Hier zien we dat bij een venster van 900 pixels breed ons design niet optimaal is.
  2965. Met andere woorden, het scherm ziet er veel te vol uit.
  2966. 1.12 Responsive design 91
  2967. @media query
  2968. We hebben een manier nodig om te kunnen bepalen wat voor apparaat door de
  2969. user wordt gebruikt. Is het scherm van een desktop, tablet of mobiel? Hiervoor
  2970. gebruiken we @media queries in CSS. In de volgende opgave gaan we @media queries uitvoeren om ons design aan te passen.
  2971. • Webbouw 53
  2972. Open een nieuw bestand en sla het op als responsive.css. Voeg de volgende stijlen
  2973. eraan toe.
  2974. /* max 900px (tablets) */
  2975. @media only screen
  2976. and (max-width: 900px){
  2977. body{
  2978. max-width: 900px;
  2979. }
  2980. main{
  2981. backgroundColor: #97D0AC;
  2982. }
  2983. nav ul li a{
  2984. font-size: 1.2rem;
  2985. }
  2986. #logo{
  2987. margin-top: 35px;
  2988. padding-top: 10%;
  2989. background-size: 50% 50%;
  2990. }
  2991. #albums{
  2992. width: 100%;
  2993. padding-left: 5%;
  2994. float: left;
  2995. }
  2996. #albums ul li img{
  2997. width: 18%;
  2998. margin-top: 3%;
  2999. margin-left: 7%;
  3000. margin-bottom: 5%;
  3001. float: left;
  3002. }
  3003. #multimedia{
  3004. margin-left: auto;
  3005. margin-right: auto;
  3006. float: none;
  3007. }
  3008. }
  3009. Voeg deze responsive.css-stijlen als volgt toe aan je index-, playlist-, formulier- en
  3010. contactpagina’s:
  3011. <link rel="stylesheet" href="responsive.css">
  3012. 92 1 Basis HTML5 en CSS3
  3013. Hier hebben we een @media query uitgevoerd voor apparaten met resoluties onder de 900 pixels, bijvoorbeeld de meeste tablets – hoewel sommige tablets nu
  3014. al hogere resoluties hebben. Het enige wat voor ons belangrijk is is om te zien in
  3015. welke resolutie ons design wordt verstoord. Met deze @media query op 900 pixels
  3016. in Webbouw 53 doen we het volgende:
  3017. – het main-element krijgt een nieuwe achtergrondkleur;
  3018. – de font-size van de navigatie maken we kleiner.
  3019. nav ul li a{
  3020. font-size: 1.2rem;
  3021. }
  3022. Background-size
  3023. De breedte van het logo wordt in percentages weergegeven.
  3024. #logo{
  3025. margin-top: 35px;
  3026. padding-top: 10%;
  3027. background-size: 50%;
  3028. }
  3029. Het albums-element wordt naar boven gebracht en de afbeeldingen worden kleiner
  3030. weergegeven.
  3031. #albums{
  3032. width: 100%;
  3033. padding-left: 5%;
  3034. float: left;
  3035. }
  3036. #albums ul li img{
  3037. width: 18%;
  3038. margin-top: 3%;
  3039. margin-left: 7%;
  3040. margin-bottom: 5%;
  3041. float: left;
  3042. }
  3043. Het multimedia-element wordt gecentreerd.
  3044. #multimedia{
  3045. margin-left: auto;
  3046. margin-right: auto;
  3047. float: none;
  3048. }
  3049. Om het resultaat van de vorige opgave te testen moet je de breedte van je browser
  3050. kleiner maken. Het resultaat moet zoals hieronder zijn:
  3051. 1.12 Responsive design 93
  3052. Figuur 1.55
  3053. Als we ons scherm nog kleiner maken zien we dat bij ongeveer 600 pixels ons
  3054. design weer wordt verstoord. Met name de lettergrootte van de playlist is veel te
  3055. groot. In de volgende opgave krijgt het main-element een nieuwe achtergrondkleur
  3056. en maken we de tekst kleiner.
  3057. • Webbouw 54
  3058. Open responsive.css. Voeg de volgende stijlen eraan toe.
  3059. @media only screen
  3060. and (max-width: 600px){
  3061. body{
  3062. max-width: 600px;
  3063. }
  3064. main{
  3065. backgroundColor: #D4808B;
  3066. }
  3067. table th{
  3068. font-size: 0.8rem;
  3069. }
  3070. table td{
  3071. font-size: 0.8rem;
  3072. }
  3073. }
  3074. 94 1 Basis HTML5 en CSS3
  3075. Het resultaat is een playlist met kleinere letters.
  3076. Figuur 1.56
  3077. Als we ons scherm nog kleiner maken zien we dat bij ongeveer 480 pixels breed
  3078. ons design weer wordt verstoord. Met name de navigatie is te klein geworden. In
  3079. de laatste @media query zorgen we ervoor dat de navigatieknoppen onder elkaar
  3080. komen te staan.
  3081. • Webbouw 55
  3082. Open responsive.css. Voeg de volgende stijlen eraan toe.
  3083. @media only screen
  3084. and (max-width: 480px){
  3085. body{
  3086. max-width: 480px;
  3087. }
  3088. main{backgroundColor: #FF4E00;
  3089. }
  3090. nav ul li{
  3091. float: none;
  3092. width: 100%;
  3093. }
  3094. }
  3095. Het resultaat zie je hieronder:
  3096. 1.13 Material design 95
  3097. Figuur 1.57
  3098. • Lab 12
  3099. In deze lab-opdracht maak je @media queries voor de formulier- en de contactpagina’s.
  3100. 1.13 Material design
  3101. Material design is een door Google ontworpen designtaal voor websites en apps.
  3102. De oorsprong van material design ligt in de vraag: ‘Hoe kunnen ons voorbereiden
  3103. op de toekomst, uitgaande van zaken die we al kennen?’ Matias Duarte, hoofd design bij Google Android, denkt door materialen te nemen die we al kennen, zoals
  3104. een vierkant wit vlak als papier en een cirkel als knop, een design-omgeving te kunnen maken die logisch en natuurlijk, maar ook futuristisch over moet komen.
  3105. Material design is een uitgebreide gids voor beeldend, bewegend en interactief
  3106. ontwerp voor verschillende platforms en apparaten. Material design is een set van
  3107. richtlijnen waar grafi sche web-elementen zoals knoppen en menu’s worden gezien
  3108. als papier-elementen. Met deze richtlijnen creëren we interfaces waar we typografi e, ruimte, schaal en kleur gebruiken om hiërarchie, betekenis en focus weer te
  3109. geven.
  3110. Planning Inleveren
  3111. Materials opgaven 1 t/m 4
  3112. 96 1 Basis HTML5 en CSS3
  3113. Materiaaleigenschappen
  3114. Het materiaal van material design kun je je voorstellen als een vel papier. Een vel
  3115. papier heeft een hoogte, een breedte en een dikte. De breedte geven we aan op de
  3116. x-as, de hoogte op de y-as en de dikte op de z-as – zie fi guur 1.59.
  3117. Doordat het papier dikte heeft creëren we diepte, zoals te zien is in fi guur 1.58. De
  3118. vellen papier kunnen in laagjes over elkaar heen liggen. De dikte van elk ‘vel papier’
  3119. (z-as) is altijd 1 dp (ongeveer 1px).
  3120. Figuur 1.58 Overlappende materialen creëren diepte
  3121. Materiaal is stevig en kan niet door ander materiaal heen. Om materiaal van elkaar
  3122. te onderscheiden gebruiken we de z-as zoals in de volgende fi guur:
  3123. Figuur 1.59 Materiaal met diepte in de z-as
  3124. 1.13 Material design 97
  3125. Materiaal met objecten
  3126. Materiaal (het vel papier) kan objecten bevatten. In de volgende fi guur zien we een
  3127. blauw object op een grijze materiaal-achtergrond. In de volgende opgave coderen
  3128. we een object op een materiaal zoals in fi guur 1.60.
  3129. • Materials opgave 1
  3130. Open een nieuw bestand en sla het op als materialopgave1.html. Voeg de volgende
  3131. code eraan toe.
  3132. <!DOCTYPE html>
  3133. <html lang="nl">
  3134. <head>
  3135. <meta http-equiv="Content-Type"
  3136. content="text/html;
  3137. charset=UTF-8">
  3138. <title>RadioX</title>
  3139. <style>
  3140. #papier{
  3141. height: 300px;
  3142. backgroundColor: #EEEEEE;
  3143. display: flex;
  3144. justify-content: center;
  3145. align-items: center;
  3146. }
  3147. #object{
  3148. backgroundColor: #03A9F4;
  3149. width: 150px;
  3150. height: 150px;
  3151. box-shadow: 1px 1px 5px rgba(0,0,0,0.5);
  3152. }
  3153. </style>
  3154. </head>
  3155. <body>
  3156. <section id="papier">
  3157. <div id="object"></div>
  3158. </section>
  3159. </body>
  3160. </html>
  3161. Het resultaat zie je hieronder:
  3162. Figuur 1.60
  3163. 98 1 Basis HTML5 en CSS3
  3164. Een object kan reageren op contact van de user. Dat object kan een knop zijn op de
  3165. papieren materiaalachtergrond. Om de knop duidelijk te maken kunnen we deze
  3166. afbeelden door een verhoging ten opzichte van het materiaal te suggereren. Dit kan
  3167. door het gebruik van schaduw.
  3168. Licht en schaduw van objecten
  3169. We creëren het gevoel van licht door het gebruik van schaduwen. Een gericht
  3170. licht op een object geeft een scherpe schaduw, een lichtbron in de omgeving geeft
  3171. een zachtere schaduw. In de volgende fi guur zien we links een object met scherpe
  3172. schaduwen aan de linker- en onderkant. Rechts zien we een actief object met een
  3173. grotere schaduw.
  3174. Figuur 1.61
  3175. We kunnen het idee creëren dat de knoppen bewegen (aan – uit) door een scherpe
  3176. of zachte schaduw. Een grotere en zachtere schaduw geeft het idee van meer
  3177. diepte.
  3178. Materiaalomvorming
  3179. Materiaal (een vel papier) kan zich omvormen, uitbreiden en inkrimpen, terwijl de
  3180. diekte (z-as) gelijk blijft, zoals in de volgende opgave.
  3181. • Materials opgave 2
  3182. Open een nieuw bestand en sla het op als materialopgave2.html. Voeg de volgende code eraan toe.
  3183. <!DOCTYPE html>
  3184. <html lang="nl">
  3185. <head>
  3186. <meta http-equiv="Content-Type"
  3187. content="text/html;
  3188. charset=UTF-8">
  3189. <title>Materials</title>
  3190. <style>
  3191. #papier{
  3192. height: 300px;
  3193. display: flex;
  3194. justify-content: center;
  3195. align-items: center;
  3196. }
  3197. 1.13 Material design 99
  3198. #object{
  3199. z-index: 2;
  3200. backgroundColor: #03A9F4;
  3201. width: 50px;
  3202. height: 50px;
  3203. border-radius: 50%;
  3204. border: 2px solid #ccc;
  3205. box-shadow: 1px 1px 5px rgba(0,0,0,0.5);
  3206. -moz-transition-duration: 6.0s;
  3207. -moz-transition-timing-function: ease-in-out;
  3208. transition: border-radius, height, width linear;
  3209. transition-duration: 6.0s;
  3210. transition-timing-function: ease-in-out;
  3211. }
  3212. #object:hover{
  3213. box-shadow: 3px 8px 8px rgba(0,0,0,0.5);
  3214. height: 200px;
  3215. width: 300px;
  3216. border-radius: 5px;
  3217. transform: translate(0, 0);
  3218. }
  3219. </style>
  3220. </head>
  3221. <body>
  3222. <section id="papier">
  3223. <div id="object"></div>
  3224. </section>
  3225. </body>
  3226. </html>
  3227. Het resultaat zie je hieronder: een cirkel wordt omgevormd tot een vierkant.
  3228. Figuur 1.62
  3229. Beweging en betekenis
  3230. In de vorige fi guur hebben we gezien hoe materiaal reageert op de hover-actie van
  3231. de user.
  3232. In de volgende fi guur zien we de transitie van een knop tot een knop met een grotere afmeting met dezelfde schaduw. De afstand tussen de knop en het materiaal is
  3233. niet veranderd.
  3234. 100 1 Basis HTML5 en CSS3
  3235. Figuur 1.63
  3236. In de volgende fi guur zien we de transitie van een knop tot een knop met een grotere afmeting en een grotere schaduw. Bijvoorbeeld: wanneer de user een knop
  3237. aanraakt maken we de knop iets groter met een grotere schaduw zoals hieronder:
  3238. Figuur 1.64
  3239. Hier zien we dat de schaduw van een normale knop scherp en klein is. We zien ook
  3240. dat een actieve knop een grotere en zachtere schaduw krijgt. Dit geeft het idee van
  3241. meer diepte.
  3242. Eigenschappen van objecten en schaduwen
  3243. Hier volgen eigenschappen voor schaduwen van verschillende objecten:
  3244. 1.13 Material design 101
  3245. Object Normaal Geactiveerd
  3246. App-bar 4dp
  3247. Knop 2dp 8dp
  3248. Floating action
  3249. button (FAB)
  3250. 6dp 12dp
  3251. Card 2dp 8dp
  3252. Menu 8dp
  3253. Submenu 9dp
  3254. Dialoog 24dp
  3255. Nav Drawer 16dp
  3256. Een drawer is een navigatiepaneel met navigatie-opties. Deze beweegt als een la die
  3257. open en dicht gaat.
  3258. Hiërarchie van objecten
  3259. Een object mag onafhankelijk van andere objecten bewegen, maar is wel beperkt
  3260. tot de ruimte van het parent-object. We defi niëren hiërarchie als de positie van een
  3261. child-object binnen een parent-object. De volgende specifi caties gelden voor parent- en child-objecten:
  3262. • Alle objecten hebben een parent-object.
  3263. • Objecten mogen een of meer child-objecten hebben.
  3264. • Child-objecten erven transformaties zoals:
  3265. – positie
  3266. – schaal
  3267. – diepte
  3268. – rotatie
  3269. Alle child-objecten binnen hetzelfde parent-object krijgen hetzelfde niveau in de
  3270. hiërarchie, behalve drawers, action-bars en dialoog-boxes.
  3271. Interactie
  3272. Interactie gebeurt tussen zusterobjecten met hetzelfde niveau. Bijvoorbeeld, in een
  3273. verzameling van cards zijn de cards zusters en mogen ze met elkaar interacteren.
  3274. Beweging
  3275. Beweging in material design imiteert beweging in de fysieke wereld. Bij het observeren van een beweging zien we of een object zwaar, licht, groot, klein of fl exibel is.
  3276. In de fysieke wereld zien we dat krachten beweging beïnvloeden, zoals versnelling
  3277. en richting van een object. Deze veranderingen zijn soepel, niet abrupt, en hebben
  3278. tijd nodig voor een natuurlijke transformatie.
  3279. 102 1 Basis HTML5 en CSS3
  3280. In de volgende opgave coderen we een bal die langzamer beweegt bij het naderen
  3281. van de randen van een kader.
  3282. • Materials opgave 3
  3283. Open een nieuw bestand en sla het op als materialopgave3.html. Voeg de volgende code eraan toe.
  3284. <!DOCTYPE html>
  3285. <html lang="nl">
  3286. <head>
  3287. <meta http-equiv="Content-Type"
  3288. content="text/html;
  3289. charset=UTF-8">
  3290. <title>Materials</title>
  3291. <style>
  3292. #papier{
  3293. height: 300px;
  3294. backgroundColor: #EEEEEE;
  3295. }
  3296. #veld{
  3297. z-index: 1;
  3298. width: 300px;
  3299. height: 250px;
  3300. border: 1px #000 solid;
  3301. }
  3302. .centreren{
  3303. display: flex;
  3304. justify-content: center;
  3305. align-items: center;
  3306. }
  3307. #bal{
  3308. z-index: 2;
  3309. margin-left: auto;
  3310. margin-right: auto;
  3311. backgroundColor: #03A9F4;
  3312. width: 50px;
  3313. height: 50px;
  3314. border-radius: 50%;
  3315. border: 0px solid #ccc;
  3316. box-shadow: 1px 1px 5px rgba(0,0,0,0.5);
  3317. }
  3318. </style>
  3319. </head>
  3320. <body>
  3321. <section id="papier" class="centreren">
  3322. <div id="veld">
  3323. <div id="bal"></div>
  3324. </div>
  3325. </section>
  3326. </body>
  3327. </html>
  3328. Het resultaat zie je hieronder:
  3329. 1.13 Material design 103
  3330. Figuur 1.65
  3331. Display fl ex
  3332. Door de flex-context op een element toe te passen kunnen we de child-elementen
  3333. ordenen en uitlijnen, bijvoorbeeld:
  3334. display: flex;
  3335. justify-content: center;
  3336. align-items: center;
  3337. In de volgende opgave voegen we een beweging van boven naar beneden aan de bal
  3338. toe.
  3339. • Materials opgave 4
  3340. Open materialopgave3.html en voeg de volgende keyframes binnen de <style>-
  3341. tags eraan toe:
  3342. @-webkit-keyframes play {
  3343. from, to {
  3344. top: 0;
  3345. -webkit-animation-timing-function: ease-in;
  3346. }
  3347. 50% {
  3348. top: 200px;
  3349. -webkit-animation-timing-function: ease-in;
  3350. }
  3351. }
  3352. @keyframes play {
  3353. from, to {
  3354. top: 0;
  3355. animation-timing-function: ease-in;
  3356. }
  3357. 50% {
  3358. top: 200px;
  3359. animation-timing-function: ease-in;
  3360. }
  3361. }
  3362. 104 1 Basis HTML5 en CSS3
  3363. #bal {
  3364. position: relative;
  3365. -webkit-animation-name: play;
  3366. -webkit-animation-iteration-count: infinite;
  3367. -webkit-animation-duration: 4.2s;
  3368. animation-name: play;
  3369. animation-iteration-count: infinite;
  3370. animation-duration: 4.2s;
  3371. }
  3372. We zien in het resultaat een meer natuurlijke beweging waar de bal versnelt maar
  3373. vertraagt bij het naderen van de randen van het kader.
  3374. 1.14 Een material-design-sjabloon
  3375. In deze paragraaf coderen we een sjabloon voor een webapp om te oefenen met de
  3376. material-design-richtlijnen. We realiseren de volgende basisingrediënten van material design:
  3377. • hoofdmenu met drawer-element
  3378. • tabs voor drie cards
  3379. • cards met content
  3380. • betekenisvolle beweging
  3381. Het resultaat van de te maken webapp zie je hieronder:
  3382. Figuur 1.66
  3383. 1.14 Een material-design-sjabloon 105
  3384. Hoofdmenu
  3385. Het hoofdmenu coderen we als een drawer (la) die verschijnt van boven naar beneden wanneer we op het menu-icon klikken.
  3386. Het resultaat moet eruitzien zoals de volgende fi guur:
  3387. Figuur 1.67
  3388. De omvorming of verandering van de menuknop tot sluitknop met een X heeft een
  3389. duidelijk betekenis van openen en sluiten van het drawer-element.
  3390. Met het klikken op een tabknop verschijnt een card met eigen content. De kleur
  3391. van de tab komt terug in de card die bij de tab hoort.
  3392. 106 1 Basis HTML5 en CSS3
  3393. Figuur 1.68
  3394. Planning Inleveren
  3395. Webbouw 56 t/m 62
  3396. Het header-element
  3397. We beginnen met het coderen van het header-element. In de volgende opgave coderen we het header-element met het menu.
  3398. • Webbouw 56
  3399. Open een nieuw bestand en sla het op als materials.html. Voeg de volgende code
  3400. eraan toe:
  3401. <!DOCTYPE html>
  3402. <html>
  3403. <head>
  3404. <title>Material design</title>
  3405. <link rel="stylesheet" href="materials.css" />
  3406. </head>
  3407. <body>
  3408. <div class="header">
  3409. <input type="checkbox" id="menu" class="menu" />
  3410. <label class="menu-cirkel" for="menu" >
  3411. <span class="menu-streep"></span>
  3412. </label>
  3413. <nav class="drawer" >
  3414. 1.14 Een material-design-sjabloon 107
  3415. <ul>
  3416. <li>Card 1</li>
  3417. <li>Card 2</li>
  3418. <li>Card 3</li>
  3419. </ul>
  3420. </nav>
  3421. </div>
  3422. </body>
  3423. </html>
  3424. Hier hebben we het header-element gecodeerd met het menu-icon als een checkbox. De checkbox is een element met een status van checked of niet checked. Met
  3425. deze checkbox kunnen we de status van ons menu (open of gesloten) representeren. We gebruiken het menu-icon om de drawer of la te openen en te sluiten.
  3426. In het label-element creëren we een cirkel en in het span-element creëren we een
  3427. streep binnen de cirkel.
  3428. In het drawer-element plaatsen we de navigatie-elementen van het menu. Dit doen
  3429. we met de volgende stijlen.
  3430. • Webbouw 57
  3431. Open een nieuw bestand en sla het op als materials.css. Voeg de volgende code
  3432. eraan toe:
  3433. body {
  3434. font-family: 'Roboto 2', 'Helvetica Neue';
  3435. margin: 0;
  3436. background: #dad4d4;
  3437. text-align: center;
  3438. }
  3439. .header {
  3440. position: absolute;
  3441. top: 0;
  3442. right: 0;
  3443. left: 0;
  3444. height: 100px;
  3445. background: #70c26f;
  3446. box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.5);
  3447. }
  3448. li {
  3449. background: #70c26f;
  3450. list-style-type: none;
  3451. }
  3452. .menu {
  3453. left: -9999px;
  3454. position: absolute;
  3455. top: -9999px;
  3456. }
  3457. .menu-cirkel {
  3458. display: none;
  3459. cursor: pointer;
  3460. 108 1 Basis HTML5 en CSS3
  3461. display: block;
  3462. position: fixed;
  3463. top: 15px;
  3464. z-index: 99;
  3465. width: 70px;
  3466. height: 70px;
  3467. transition: all 400ms ease-in-out;
  3468. border: 2px solid #d34237;
  3469. border-radius: 50%;
  3470. -webkit-user-select: none;
  3471. -moz-user-select: none;
  3472. -ms-user-select: none;
  3473. -o-user-select: none;
  3474. user-select: none;
  3475. -webkit-tap-highlight-color: transparent;
  3476. }
  3477. .menu-cirkel:hover {
  3478. border-color: #416ef8;
  3479. }
  3480. Het resultaat zie je hieronder:
  3481. Figuur 1.69
  3482. Vervolgens coderen we de streepjes binnen het menu-icon met de volgende stijlen.
  3483. • Webbouw 58
  3484. Open materials.css. Voeg de volgende code eraan toe:
  3485. /* insert strepen voor en na menu-streep */
  3486. .menu-cirkel .menu-streep,
  3487. .menu-cirkel .menu-streep:before,
  3488. .menu-cirkel .menu-streep:after {
  3489. position: absolute;
  3490. top: 50%;
  3491. left: 50%;
  3492. height: 4px;
  3493. width: 35px;
  3494. cursor: pointer;
  3495. background: #d34237;
  3496. display: block;
  3497. content: '';
  3498. transition: all 500ms ease-in-out;
  3499. }
  3500. .menu-cirkel:hover .menu-streep,
  3501. .menu-cirkel:hover .menu-streep:before,
  3502. .menu-cirkel:hover .menu-streep:after {
  3503. backgroundColor: #416ef8;
  3504. }
  3505. 1.14 Een material-design-sjabloon 109
  3506. /* menu-strepen positioneren */
  3507. .menu-cirkel .menu-streep {
  3508. transform: translate3d(-50%, -4px, 0);
  3509. -webkit-transform: translate3d(-50%, -4px, 0);
  3510. }
  3511. .menu-cirkel .menu-streep:before {
  3512. transform: translate3d(-50%, -14px, 0);
  3513. -webkit-transform: translate3d(-50%, -14px, 0);
  3514. }
  3515. .menu-cirkel .menu-streep:after {
  3516. transform: translate3d(-50%, 10px, 0);
  3517. -webkit-transform: translate3d(-50%, 10px, 0);
  3518. }
  3519. Translate3d
  3520. De strepen binnen de menu-cirkel bevinden zich op een andere laag dan de cirkel
  3521. zelf, zodat ze kunnen bewegen. Dit kan met translate3d. Het resultaat zie je hieronder:
  3522. Figuur 1.70
  3523. In de volgende opgave defi niëren we het drawer-element en centreren we het
  3524. menu-element.
  3525. • Webbouw 59
  3526. Open materials.css. Voeg de volgende code eraan toe:
  3527. /* drawer definiëren */
  3528. .drawer {
  3529. position: fixed;
  3530. top: 100px;
  3531. left: 0;
  3532. margin-left: auto;
  3533. margin-right: auto;
  3534. z-index: 1;
  3535. height: 10%;
  3536. visibility: hidden;
  3537. transition-property: all;
  3538. transition-duration: 500ms;
  3539. transition-timing-function: ease-out;
  3540. width: 100%;
  3541. box-shadow: 0px 8px 10px rgba(0, 0, 0, 0.5);
  3542. }
  3543. 110 1 Basis HTML5 en CSS3
  3544. /* menu centreren */
  3545. .menu-cirkel {
  3546. left: 50%;
  3547. -webkit-transform: translate3d(-50%, 0, 0);
  3548. transform: translate3d(-50%, 0, 0);
  3549. }
  3550. Het resultaat zie je hieronder:
  3551. Figuur 1.71
  3552. In de volgende opgave coderen we het klik-eff ect op de menu-cirkel als volgt: de
  3553. middenstreep verdwijnt, de boven- en onderstreep krijgen een roterende beweging
  3554. en vormen een X. Het element verandert van menu- tot sluitenknop.
  3555. • Webbouw 60
  3556. Open materials.css. Voeg de volgende code eraan toe:
  3557. /* on klick */
  3558. .menu:checked .menu-cirkel {
  3559. border-color: #d34237;
  3560. }
  3561. .menu:checked ~ .menu-cirkel .menu-streep {
  3562. backgroundColor: transparent;
  3563. }
  3564. .menu:checked ~ .menu-cirkel .menu-streep:before {
  3565. transform: translateX(-50%) rotate(45deg);
  3566. -webkit-transform: translateX(-50%) rotate(45deg);
  3567. }
  3568. .menu:checked ~ .menu-cirkel .menu-streep:after {
  3569. transform: translateX(-50%) translateY(-10px)
  3570. rotate(-45deg);
  3571. -webkit-transform: translateX(-50%) translateY(-10px) rotate(-45deg);
  3572. top: 10px;
  3573. }
  3574. Het ~-teken
  3575. Met het ~-teken selecteren we alle zuster-elementen van het eerste geselecteerde
  3576. zuster-element, bijvoorbeeld:
  3577. div ~ p {}
  3578. selecteert alle p-zuster-elementen binnen het div-element na het eerste p-element.
  3579. In ons geval maken we de middenstreep transparant en de boven- en onderstreep
  3580. krijgen een rotatie en vormen een X. Het resultaat zie je hieronder:
  3581. 1.14 Een material-design-sjabloon 111
  3582. Figuur 1.72
  3583. In de volgende opgave coderen we de slide-down-animatie van het drawer-element.
  3584. • Webbouw 61
  3585. Open materials.css. Voeg de volgende code eraan toe:
  3586. /* drawer slide down animatie */
  3587. .drawer {
  3588. z-index: 3;
  3589. transition-duration: 500ms;
  3590. background: #70c26f;
  3591. }
  3592. .drawer {
  3593. -webkit-transform: translate3d(0, -100%, 0);
  3594. transform: translate3d(0, -100%, 0);
  3595. }
  3596. .menu:checked ~ .drawer {
  3597. visibility: visible;
  3598. -webkit-transform: translate3d(0, 0, 0);
  3599. transform: translate3d(0, 0, 0);
  3600. }
  3601. Wanneer er op het menu wordt geklikt, menu:checked, verschijnt het drawer-element van boven naar beneden.
  3602. Hier volgen de stijlen van de li-elementen van het menu.
  3603. • Webbouw 62
  3604. Open materials.css. Voeg de volgende code eraan toe:
  3605. div{
  3606. margin: 0;
  3607. padding: 0;
  3608. }
  3609. ul{
  3610. padding: 0;
  3611. margin: 0;
  3612. width: 100%;
  3613. }
  3614. li {
  3615. background: #70c26f;
  3616. list-style-type: none;
  3617. }
  3618. 112 1 Basis HTML5 en CSS3
  3619. li: hover{
  3620. background: #0afa76;
  3621. opacity: 0.4; filter: alpha(opacity=4);
  3622. }
  3623. Het resultaat zie je hieronder.
  3624. Figuur 1.73
  3625. Planning Inleveren
  3626. Webbouw 63 t/m 68
  3627. Tabs
  3628. De tweede navigatie binnen de pagina coderen we met tabs voor drie verschillende
  3629. cards.
  3630. In de volgende opgave coderen we de HTML-tab-elementen binnen de webpagina
  3631. als volgt.
  3632. • Webbouw 63
  3633. Open materials.html. Voeg de volgende code eraan toe:
  3634. <div class="tabs">
  3635. <div class="tab" id="tab1" onclick=
  3636. "document.getElementById('card1').style.display='block';
  3637. document.getElementById('card2').style.display='none';
  3638. document.getElementById('card3').style.display='none';">
  3639. Tab 1
  3640. </div>
  3641. <div class="tab" id="tab2" onclick=
  3642. "document.getElementById('card1').style.display='none';
  3643. document.getElementById('card2').style.display='block';
  3644. document.getElementById('card3').style.display='none';">
  3645. Tab 2
  3646. </div>
  3647. <div class="tab" id="tab3" onclick=
  3648. "document.getElementById('card1').style.display='none';
  3649. document.getElementById('card2').style.display='none';
  3650. document.getElementById('card3').style.display='block';">
  3651. Tab 3
  3652. </div>
  3653. </div>
  3654. 1.14 Een material-design-sjabloon 113
  3655. Het resultaat zie je nog niet, want het header-element is naar voren en de tabs naar
  3656. achteren op de z-as weergegeven. Hier volgen de stijlen van de tab-elementen.
  3657. • Webbouw 64
  3658. Open materials.css. Voeg de volgende code eraan toe:
  3659. /* tabs */
  3660. .tabs {
  3661. position: absolute;
  3662. top: 150px;
  3663. right: 0;
  3664. left: 0;
  3665. text-align: center;
  3666. }
  3667. .tab {
  3668. display: inline-block;
  3669. position: relative;
  3670. border-radius: 4px;
  3671. margin: 10px;
  3672. overflow: hidden;
  3673. text-align: center;
  3674. width: 20%;
  3675. height: 50px;
  3676. line-height: 48px;
  3677. box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.5);
  3678. }
  3679. .tab:hover{
  3680. box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.5);
  3681. }
  3682. #tab1{
  3683. backgroundColor: #F4DB33;
  3684. }
  3685. #tab2{
  3686. backgroundColor: #972FF8;
  3687. }
  3688. #tab3{
  3689. backgroundColor: #DC3C84;
  3690. }
  3691. Het resultaat zie je hieronder:
  3692. Figuur 1.74
  3693. 114 1 Basis HTML5 en CSS3
  3694. Deze tabs zorgen ervoor dat een klik-event de geassocieerde card zichtbaar maakt
  3695. en de andere onzichtbaar.
  3696. Codering van de cards
  3697. In de volgende opgave coderen we de cards als volgt.
  3698. • Webbouw 65
  3699. Open materials.html. Voeg de volgende code eraan toe:
  3700. <div class="cards" id="card1" style="display: none;">
  3701. <div class="content-left">
  3702. Card 1
  3703. <div class="x-icon" onclick=
  3704. "document.getElementById('card1').style.display='none';">
  3705. x</div>
  3706. </div>
  3707. <div class="content-right"> Content 1 </div>
  3708. </div>
  3709. <div class="cards" id="card2" style="display: none;">
  3710. <div class="content-left">
  3711. Card 2
  3712. <div class="x-icon" onclick=
  3713. "document.getElementById('card2').style.display='none';">
  3714. x</div>
  3715. </div>
  3716. <div class="content-right"> Content 2 </div>
  3717. </div>
  3718. <div class="cards" id="card3" style="display: none;">
  3719. <div class="content-left">
  3720. Card 3
  3721. <div class="x-icon" onclick=
  3722. "document.getElementById('card3').style.display='none';">
  3723. x</div>
  3724. </div>
  3725. <div class="content-right"> Content 3 </div>
  3726. </div>
  3727. Deze cards zijn nog steeds onzichtbaar:
  3728. style="display: none;"
  3729. Het klikken op een tab maakt de cards zichtbaar. Hier volgen de stijlen van de
  3730. cards.
  3731. 1.14 Een material-design-sjabloon 115
  3732. • Webbouw 66
  3733. Open materials.css. Voeg de volgende code eraan toe:
  3734. /* cards */
  3735. .cards {
  3736. position: relative;
  3737. top: 150px;
  3738. left: 60px;
  3739. height: 300px;
  3740. width: 80%;
  3741. border-radius: 4px;
  3742. text-align: start;
  3743. overflow: hidden;
  3744. background: #fff;
  3745. box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.5);
  3746. }
  3747. .content-left {
  3748. float: left;
  3749. width: 22%;
  3750. height: 300px;
  3751. padding: 15px;
  3752. text-align: center;
  3753. }
  3754. .content-right {
  3755. padding-top: 15px;
  3756. padding-left: 15px;
  3757. float: right;
  3758. width: 60%;
  3759. height: 300px;
  3760. }
  3761. .x-icon {
  3762. border-radius: 50%;
  3763. width: 60px;
  3764. height: 60px;
  3765. margin: 10px;
  3766. font-size: 2.5em;
  3767. backgroundColor: #70c26f;
  3768. box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.5);
  3769. }
  3770. .x-icon:hover{
  3771. box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.5);
  3772. }
  3773. #card1 .content-left{
  3774. backgroundColor: #F4DB33;
  3775. }
  3776. #card2 .content-left{
  3777. backgroundColor: #972FF8;
  3778. }
  3779. #card3 .content-left{
  3780. backgroundColor: #DC3C84;
  3781. }
  3782. Het resultaat zie je hieronder:
  3783. 116 1 Basis HTML5 en CSS3
  3784. Figuur 1.75
  3785. Als laatste passen we een in-zoom-animatie toe op de cards. Dat doen we in de
  3786. volgende opgave.
  3787. • Webbouw 67
  3788. Open materials.css. Voeg de volgende code eraan toe:
  3789. @keyframes zoomIn {
  3790. 0% {
  3791. opacity: 0;
  3792. -webkit-transform: scale3d(.3, .3, .3);
  3793. transform: scale3d(.3, .3, .3);
  3794. }
  3795. 50% {
  3796. opacity: 0.5;
  3797. }
  3798. }
  3799. .cards{
  3800. -webkit-animation-name: zoomIn;
  3801. -webkit-animation-duration: 0.6s;
  3802. -webkit-animation-iteration-count: 1;
  3803. -webkit-animation-timing-function: linear;
  3804. -moz-animation-name: zoomIn;
  3805. -moz-animation-duration: 0.6s;
  3806. -moz-animation-iteration-count: 1;
  3807. -moz-animation-timing-function: linear;
  3808. animation-name: zoomIn;
  3809. animation-duration: 0.6s;
  3810. animation-iteration-count: 1;
  3811. animation-timing-function: linear;
  3812. }
  3813. 1.15 Material-design-project 117
  3814. Deze in-zoom-animatie zorgt ervoor dat de card zichtbaar wordt als volgt:
  3815. – op 0 is de opacity: 0;
  3816. – op 50 is de opacity: 0.5;
  3817. – op 100 is de opacity: 1.0.
  3818. Het in-zoom-eff ect gaat van een derde tot vol als volgt:
  3819. transform: scale3d(.3, .3, .3);
  3820. Figuur 1.76
  3821. 1.15 Material-design-project
  3822. XtreemTravel is een nieuw reisbureau dat opgericht is met het idee om avontuurlijke vakantiepakketten aan klanten en bedrijven aan te bieden. Denk bijvoorbeeld
  3823. aan windsurfen, mountain climbing en snorkelen. XtreemTravel wil een website
  3824. krijgen die opgebouwd is in de stijl van material design, met een moderne look en
  3825. feel.
  3826. De website XtreemTravel
  3827. Het doel van de website XtreemTravel is om klanten online te kunnen informeren
  3828. over de verschillende reispakketten. XtreemTravel heeft de content van de site als
  3829. volgt geschetst:
  3830. Een welkomstpagina met een links naar reispakketten:
  3831. – Windsurfi ng-pagina
  3832. – Mountainclimbing-pagina
  3833. – Snorkelenpagina
  3834. – Last-minutes-pagina
  3835. – About-us-pagina
  3836. – Een contactpagina waar users vragen kunnen stellen.
  3837. 118 1 Basis HTML5 en CSS3
  3838. De welkomstpagina
  3839. De welkomstpagina krijgt de volgende content:
  3840. Welkom bij XtreemTravel, de online booking website voor de extreemste vakanties. Book je vakantie nu voor de voordeligste bestemmingen. Ons specialisme:
  3841. de actiefste vakanties voor windsurfers, snorkelaars en mountainclimbers op alle
  3842. continenten.
  3843. Daarna krijgt de homepage drie tabs met reispakketten.
  3844. Tab 1: Windsurfi ng
  3845. Afbeelding 1
  3846. Windsurfi ng in Cancún México
  3847. Deze maand is het aantrekkelijkst voor windsurfi ng in Cancún, México.
  3848. Lees verder ... (link naar de windsurfi ng-pagina).
  3849. Tab 2: Mountainclimbing
  3850. Afbeelding 2
  3851. Himalayas
  3852. Deze week vertrekt een groep enthousiaste klimmers naar de Himalayas.
  3853. Lees verder ... (link naar de mountainclimbing-pagina).
  3854. Tab 3: Snorkelen
  3855. Afbeelding 3
  3856. Costa Rica
  3857. Snorkelen in Costa Rica. Naast de natuurreservaten heeft Costa Rica ’s werelds
  3858. tweede grootste koraalrif.
  3859. Lees verder ... (link naar de snorkelenpagina).
  3860. De windsurfi ng-pagina
  3861. De windsurfi ng-pagina krijgt de volgende content:
  3862. Afbeelding 1
  3863. Windsurfi ng in Cancún México
  3864. Deze maand is het aantrekkelijkst voor windsurfi ng in Cancún, México. XtreemTravel heeft een fantastisch vakantiepakket voor u in de aanbieding. Tien dagen
  3865. inclusief alles. Geniet van het populairste hotel bij surfers: Hotel Vientos.
  3866. Totale prijs is € 599 p.p.
  3867. We vliegen met KLM. Vertrek is 15 mei om 08.00 uur vanaf Schiphol. De terugreis
  3868. is 25 mei om 13.00 uur. Aankomst 26 mei om 06.00 uur lokale tijd.
  3869. 1.15 Material-design-project 119
  3870. De mountainclimbing-pagina
  3871. De mountainclimbing-pagina krijgt de volgende content:
  3872. Afbeelding 2
  3873. Mountainclimbing in de Himalayas
  3874. Volgende maand vertrekt een groep enthousiaste klimmers naar de Himalayas.
  3875. Doe mee met deze klimtocht naar 8000 meter hoogte onder begeleiding van experts. Na de tien dagen lange tocht geniet je van een driedaagse verblijf in het Everest Hotel en Spa Resort.
  3876. Totale prijs € 799 p.p.
  3877. We vliegen met KLM. Vertrek is aanstaande donderdag om 08.00 uur vanaf Schiphol. De terugreis is dinsdag 12 mei om 13.00 uur. Aankomst 12 mei om 16.00 uur
  3878. lokale tijd.
  3879. De snorkelenpagina
  3880. De snorkelenpagina krijgt de volgende content:
  3881. Afbeelding 3
  3882. Snorkelen in Costa Rica
  3883. Dit pakket is de beste combinatie: natuurreservaten en koraalrif. Speciale aanbieding voor backpackers. Begeleiding van experts. Na de drie dagen lange tocht door
  3884. het oerwoud geniet je van drie dagen snorkelen met verblijf in Hotel Ecosta.
  3885. Totale prijs € 499 p.p.
  3886. We vliegen met KLM. Vertrekdatum is elke donderdag om 08.00 uur vanaf Schiphol. De terugreis is elke donderdag om 13.00 uur. Aankomst de volgende dag om
  3887. 16.00 uur lokale tijd.
  3888.  
  3889. 121
  3890. 2 JavaScript
  3891. 2.1 Inleiding JavaScript
  3892. In dit hoofdstuk behandelen we de basiskennis van JavaScript en objectgeoriënteerd JavaScript.
  3893. Een interactieve website is veel meer dan webpagina’s met afbeeldingen. Een interactieve website kan vragen aan de gebruiker stellen en reacties krijgen. Om een site
  3894. interactief te maken gebruik je JavaScript.
  3895. In deze paragraaf maken we kennis met de volgende JavaScript-concepten en methodes:
  3896. • alert
  3897. • JavaScript-console
  3898. • write
  3899. • confi rm
  3900. • prompt
  3901. • variabelen
  3902. • operatoren
  3903. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  3904. Planning Inleveren
  3905. Opgaven 1 t/m 9
  3906. Lab 01
  3907. Wat is JavaScript?
  3908. JavaScript is in 1995 ontwikkeld door Brendan Eich van Netscape Communications
  3909. Corporation, speciaal voor het gebruik in Netscape Navigator. De oorspronkelijke
  3910. naam was Mocha en later LiveScript. De naam JavaScript komt uit de tijd dat in
  3911. de Netscape-browser ook ondersteuning voor Java-applets werd ingebouwd. Door
  3912. het gebruik van JavaScript werd het mogelijk om webpagina’s interactief te maken.
  3913. Dynamic HTML was hier een logisch vervolg op.
  3914. JScript is de Microsoft-implementatie van JavaScript. JavaScript is een scripttaal.
  3915. Een script is een stukje code op een HTML-pagina. Met JavaScript voeg je functionaliteit aan je webpagina’s toe. Er bestaat client-side en server-side JavaScript.
  3916. 122 2 JavaScript
  3917. • Client-side JavaScript wordt direct uitgevoerd via de browser van de bezoeker
  3918. (client).
  3919. • Server-side JavaScript wordt uitgevoerd via een server, waarna het resultaat wordt
  3920. teruggestuurd naar de browser van de bezoeker.
  3921. De browser herkent een JavaScript aan de volgende <script>-tags. De syntaxis is als
  3922. volgt:
  3923. <script> ...... </script>
  3924. Op de puntjes plaatsen we JavaScript-code. Alle JavaScript-code tussen de
  3925. <script>-tags vormt de body van je script. In de volgende opgave coderen we ons
  3926. eerste JavaScript.
  3927. Figuur 2.1 Client-side en server-side JavaScript
  3928. • Opgave 1
  3929. Codeer het volgende script met je favoriete HTML-editor en sla het op als interactieve.html.
  3930. <!DOCTYPE html>
  3931. <html lang="nl">
  3932. <head>
  3933. <meta http-equiv="Content-Type"
  3934. content="text/html;
  3935. charset=UTF-8">
  3936. <title>Interactive HTML</title>
  3937. </head>
  3938. <body>
  3939. <h3>Interactieve HTML</h3>
  3940. <p>Opgave 1: alertbox</p>
  3941. <script>
  3942. alert("Welcome to my world!!!");
  3943. </script>
  3944. </body>
  3945. </html>
  3946. • Het woord alert is een standaard-JavaScript-methode die een alertbox op het
  3947. scherm weergeeft.
  3948. • Alle opdrachten binnen de <script>-tags moeten eindigen met een puntkomma (;).
  3949. • JavaScript kan zowel aan de <head>- als in de <body>-secties worden toegevoegd.
  3950. 2.1 Inleiding JavaScript 123
  3951. Figuur 2.2 Het resultaat van opgave 1
  3952. JavaScript-console
  3953. Het komt vaak voor dat we tijdens het coderen van onze scripts type- of syntaxisfouten maken, waardoor we een leeg scherm te zien krijgen. Dit gebeurt doordat
  3954. ons script niet goed werkt. Wat we dan moeten doen is teruggaan naar de code van
  3955. het script om de fouten te verbeteren. Dit noemen we debugging.
  3956. Ga terug naar de code van je script interactieve.html en maak een typefout: wijzig
  3957. alert in lert en sla het script weer op.
  3958. <script>
  3959. lert("Welcome to my world!!!");
  3960. </script>
  3961. Alle browsers hebben hulpmiddelen om ons te helpen deze fouten te herstellen. In
  3962. de volgende fi guur zien we de JavaScript-console van de browser Chrome. Om dit
  3963. scherm te krijgen klik je op Instellingen, daarna op Extra en dan kies je JavaScriptconsole. Voor de Mac-computer kun je Cmd+Shift+C gebruiken. Voor Windows:
  3964. Ctrl+Shift+C. Onderaan de JavaScript-console zien we de volgende foutmelding:
  3965. Uncaught ReferenceError: lert is not defined
  3966. Interactieve.html: 10
  3967. De foutconsole heeft onze typefout gedetecteerd in regel 10. Dit wordt vermeld aan
  3968. de rechterkant.
  3969. Het resultaat is een leeg scherm, zoals te zien is in de volgende fi guur. Onderaan
  3970. zien we in de JavaScript-console de foutmelding staan. lert is ongedefi nieerd, het is
  3971. geen ingebouwde methode van JavaScript.
  3972. Figuur 2.3 Leeg scherm met onderaan de foutconsole
  3973. 124 2 JavaScript
  3974. We kunnen ook gebruikmaken van de console om fouten of resultaten weer te geven. Dat gaat als volgt:
  3975. console.log("Welcome to my world!!!");
  3976. • Opgave 2
  3977. Open interactieve.html. Verbeter de syntaxisfout en codeer een alertbox met de
  3978. volgende tekst:
  3979. "Opgave 2: Welkom bij mijn eerste JavaScript."
  3980. Taalcomponenten
  3981. De JavaScript-syntaxis is hetzelfde als de syntaxis van andere programmeertalen,
  3982. zoals C en Java. De volgende tabel is een samenvatting van de JavaScript-syntaxis.
  3983. Taalcomponenten JavaScript-syntaxis
  3984. Open- en close-tags <script> . . . </script>
  3985. Blok { . . . }
  3986. Commentaar // mijn commentaar
  3987. /* mijn commentaar */
  3988. Declaratie variabele var variabelenaam
  3989. Strings Een string geef je aan tussen aanhalingstekens
  3990. Bijvoorbeeld: "Titel JavaScript is nieuw"
  3991. Escape-teken \ Aanhalingsteken binnen een string geef je aan met \"
  3992. Bijvoorbeeld: "Titel \"JavaScript\" is nieuw"
  3993. Ingebouwde methodes
  3994. Alle programmeertalen hebben een ingebouwde library (bibliotheek) met methodes die de meest voorkomende taken uitvoeren en de werklast van de programmeur verlichten. Zoals de methode alert() heeft JavaScript nog meer methodes. In
  3995. de volgende paragrafen komen een aantal van deze methodes ter sprake.
  3996. document.write()
  3997. Deze methode gebruiken we om teksten en HTML-elementen vanuit JavaScript op
  3998. het beeldscherm te tonen. De write-opdracht heeft de volgende syntaxis:
  3999. document.write("jouw tekst");
  4000. • Opgave 3
  4001. Open interactieve.html en voeg de volgende code toe tussen je <script>-tags.
  4002. document.write("<p>Opgave 3: Dit is een paragraaf</p>");
  4003. 2.1 Inleiding JavaScript 125
  4004. confi rm( )
  4005. Bij een interactieve webpagina hoort feedback van de gebruiker. Een manier om
  4006. feedback te vragen is met de methode confirm(). Deze methode genereert een confi rmbox waarmee je de user kunt vragen om informatie te verifi ëren. De confirmmethode heeft de volgende syntaxis:
  4007. confirm("jouw vraag?");
  4008. • Opgave 4
  4009. Open interactieve.html en voeg de volgende regel eraan toe.
  4010. confirm("Opgave 4: Wilt u doorgaan?");
  4011. Figuur 2.4 Het resultaat van opgave 4
  4012. • Klik je op OK, dan is het resultaat van de confi rmbox true.
  4013. • Klik je op Cancel of Annuleren, dan is het resultaat van de confi rmbox false.
  4014. prompt()
  4015. Met de promptbox vraag je om input van de user. Als je bijvoorbeeld meer gegevens van de user nodig hebt om een bepaald proces uit te voeren, kun je de user
  4016. ‘prompten’ met de vraag naar meer informatie. De prompt-methode heeft de volgende syntaxis:
  4017. prompt("jouw prompttekst", "default waarde");
  4018. • Opgave 5
  4019. Open interactieve.html en maak de volgende promptbox:
  4020. prompt("Opgave 5: Typ uw wachtwoord in", "******");
  4021. Figuur 2.5 Het resultaat van Opgave 5
  4022. • Klik je op OK, dan is het resultaat van de promptbox de inputtekst.
  4023. • Klik je op Annuleren, dan is het resultaat van de promptbox een nul (leeg).
  4024. 126 2 JavaScript
  4025. • Opgave 6
  4026. Open interactive.html en codeer het volgende:
  4027. 1 Codeer de volgende promptbox: Typ uw gebruikersnaam in
  4028. 2 Codeer de volgende confi rmbox: Wilt u abonnee worden?
  4029. JavaScript-variabelen
  4030. Een JavaScript-variabele is een datacontainer met een naam en een waarde. De
  4031. naam van de variabele is het adres van de variabele in het computergeheugen. Op
  4032. dit adres kun je data tijdelijk bewaren. Een variabele kun je je voorstellen als een
  4033. laatje met een naam in het geheugen van de computer. Door middel van de naam
  4034. kun je de inhoud van dat laatje bekijken of wijzigen.
  4035. Een variabele kan de volgende datatypen en waarden hebben:
  4036. Datatype Voorbeeld
  4037. date 11/11/2014
  4038. string "Carl"
  4039. boolean true/false
  4040. integer 19
  4041. fl oat (decimaal) 3.56
  4042. Namen van variabelen
  4043. De naam van een variabele mag letters, getallen of underscores bevatten. De naam
  4044. van de variabele moet een beschrijving zijn van de content van de variabele, bijvoorbeeld:
  4045. stad = "Amsterdam";
  4046. LET OP
  4047. JavaScript is hoofdlettergevoelig: er is onderscheid tussen namen met en zonder
  4048. hoofdletters: Stad en stad zijn twee verschillende variabelen.
  4049. Hieronder declareren we een variabele met een string:
  4050. var student = "Carl Jung";
  4051. Hiermee declareer je de variabele student en sla je die op met de inhoud "Carl
  4052. Jung" Je zou je dit als volgt kunnen voorstellen:
  4053. student
  4054. "Carl Jung"
  4055. Hieronder declareren we een variabele met een booleaanse waarde:
  4056. var leerplichtig = true;
  4057. 2.1 Inleiding JavaScript 127
  4058. Je zou je dit als volgt kunnen voorstellen:
  4059. leerplicht
  4060. true
  4061. Hieronder declareren we een variabele met als waarde een getal:
  4062. var leeftijd = 16;
  4063. Je zou je dit als volgt kunnen voorstellen:
  4064. leeftijd
  4065. 16
  4066. De waarde van een variabele kun je wijzigen. Bijvoorbeeld:
  4067. leeftijd = leeftijd + 1;
  4068. Hiermee verander je de waarde van de variabele leeftijd in 17.
  4069. leeftijd
  4070. 17
  4071. Hier is nog een voorbeeld:
  4072. som
  4073. 3
  4074. som = som + som;
  4075. Wat is het resultaat NU in som?
  4076. Operatoren van variabelen
  4077. Hieronder zie je de belangrijkste rekenkundige operatoren:
  4078. Betekenis Voorbeeld Resultaat in prijs
  4079. + optellen prijs = 10 + 5 15
  4080. - aftrekken prijs = prijs - 1 14
  4081. ++ plus 1 prijs++ 15
  4082. -- min 1 prijs-- 14
  4083. += optellen prijs += 10
  4084. kort voor:
  4085. prijs = prijs + 10
  4086. 24
  4087. -= aftrekken prijs -= 10
  4088. kort voor:
  4089. prijs = prijs - 10
  4090. 14
  4091. * vermenigvuldigen prijs = prijs * 2 28
  4092. / delen prijs = prijs / 2 14
  4093. 128 2 JavaScript
  4094. Bij het rekenen hanteren alle programeertalen dezelfde volgorde van operatoren
  4095. voor het uitrekenen. Bijvoorbeeld, eerst vermenigvuldigen of delen en daarna optellen of aftrekken.
  4096. • Opgave 7
  4097. Wat is het resultaat van:
  4098. 2 + 3 * 4 = ______
  4099. 2 + 6 / 3 = ______
  4100. 7 - 4 / 2 = ______
  4101. We kunnen de volgorde bepallen met haakjes, waardoor de operaties binnen de
  4102. haakjes als eerste worden uitgevoerd.
  4103. Wat is het resultaat van:
  4104. (2 + 3) * 4 = ______
  4105. (2 + 6) / 4 = ______
  4106. 7 - (4 / 3) = ______
  4107. In de volgende opgave gaan we rekenen oefenen met variabelen.
  4108. • Opgave 8
  4109. Codeer het volgende script en sla het op als variabelen.html.
  4110. <!DOCTYPE html>
  4111. <html lang="nl">
  4112. <head>
  4113. <meta http-equiv="Content-Type"
  4114. content="text/html;
  4115. charset=UTF-8">
  4116. <title>Variabelen</title>
  4117. </head>
  4118. <body>
  4119. <script>
  4120. var voornaam = "Carl";
  4121. var achternaam = "Petersen";
  4122. var schoolgeld = 1000;
  4123. var boekengeld = 100;
  4124. var bedrag = schoolgeld + boekengeld;
  4125. var studiefinanciering = 600;
  4126. var totaal = bedrag - studiefinanciering;
  4127. var volledigenaam = voornaam + "<br />" + achternaam;
  4128. document.write(
  4129. "<p>Opgave 8</p>" + volledigenaam +
  4130. "<br>Totaal te betalen: " + totaal);
  4131. </script>
  4132. </body>
  4133. </html>
  4134. Het resultaat moet er als volgt uitzien:
  4135. 2.1 Inleiding JavaScript 129
  4136. Opgave ς
  4137. Carl
  4138. Petersen
  4139. Totaal te betalen: οκκ
  4140. Overload operatoren
  4141. In het vorige voorbeeld hebben we de operator + op twee manieren gebruikt.
  4142. Ten eerste hebben we het bedrag als volgt berekend:
  4143. var bedrag = schoolgeld + boekengeld;
  4144. Ten tweede hebben we met de + drie stukken tekst aan elkaar geplakt:
  4145. var volledigenaam = voornaam + "<br />" + achternaam;
  4146. We zeggen dat de operator + wordt overloaded. Dit betekent dat deze operator
  4147. opereert in twee contexten: hij kan gebruikt worden voor het optellen van twee
  4148. getallen én hij kan gebruikt worden voor het aan elkaar plakken van teksten. De
  4149. context bepaalt de gebruikswijze van de operator. Bijvoorbeeld:
  4150. Geval 1:
  4151. resultaat = schoolgeld + boekengeld;
  4152. // resultaat is het bedrag 500
  4153. Geval 2:
  4154. resultaat = voornaam + boekengeld;
  4155. // resultaat is de string "Carl 100"
  4156. Bij geval 1 heeft de + operator twee getallen opgeteld.
  4157. Bij geval 2 is de context rond de + operator veranderd naar een string voornaam en
  4158. een getal boekengeld. De operator + heeft een string en een getal aan elkaar geplakt.
  4159. • Opgave 9
  4160. Open variabelen.html en maak de volgende variabelen aan:
  4161. – de variabele achternaam met de waarde Bolt;
  4162. – de variabele voornaam met de waarde Zakaria;
  4163. – de variabele nederlands met de waarde 9;
  4164. – de variabele engels met de waarde 8;
  4165. – de variabele rekenen met de waarde 7;
  4166. – de variabele gemiddeld met het berekende gemiddelde cijfer.
  4167. Geef de variabelen weer.
  4168. Het resultaat moet er als volgt uitzien:
  4169. 130 2 JavaScript
  4170. Opgave σ
  4171. Zakaria Bolt
  4172. Nederlands: σ
  4173. Engels: ς
  4174. Rekenen: ρ
  4175. Gemiddeld: ς
  4176. • Lab 01
  4177. Codeer het volgende script en sla het op als lab01.html.
  4178. <!DOCTYPE html>
  4179. <html lang="nl">
  4180. <head>
  4181. <meta http-equiv="Content-Type"
  4182. content="text/html;
  4183. charset=UTF-8">
  4184. <title>Lab 01</title>
  4185. <!--dit script werkt met variabelen
  4186. auteur:
  4187. datum:
  4188. -->
  4189. </head>
  4190. <body>
  4191. <h2>Lab 01</h2>
  4192. <h3>Factuur</h3>
  4193. <script>
  4194. var klantnaam = prompt("voer je eigen naam in");
  4195. var aantal =
  4196. parseInt(prompt("aantal boeken te bestellen?"));
  4197. var titel = "JavaScript";
  4198. var prijs = 29.90;
  4199. document.write(
  4200. "<br>Bedankt voor je bestelling: " + klantnaam);
  4201. document.write("<br>Boektitel is: " + titel);
  4202. document.write("<br>Aantal te bestellen: " + aantal);
  4203. document.write("<br>Prijs per boek is: " + prijs.toFixed(2));
  4204. </script>
  4205. </body>
  4206. </html>
  4207. Het resultaat moet er ongeveer als volgt uitzien:
  4208. 2.2 Datatypes 131
  4209. Lab κλ
  4210. Factuur
  4211. Bedankt voor je bestelling: Jan
  4212. Boekti tel is: JavaScript
  4213. Aantal te bestellen: λκ
  4214. Prijs per boek is: μσ.σκ
  4215. Voer nu de volgende stappen uit:
  4216. 1 Maak een nieuwe variabele bedrag.
  4217. 2 Reken het bedrag uit (bedrag is aantal boeken maal de prijs).
  4218. 3 Maak een nieuwe variabele btw.
  4219. 4 Reken de btw van het bedrag uit (btw is 6 van het bedrag).
  4220. 5 Maak een nieuwe variabele totaal.
  4221. 6 Reken het totaal te betalen bedrag uit (totaal is bedrag + btw).
  4222. Het resultaat moet er als volgt uitzien:
  4223. Lab κλ
  4224. Factuur
  4225. Bedankt voor je bestelling: Peter
  4226. Boekti tel is: JavaScript
  4227. Aantal te bestellen: μμ
  4228. Prijs per boek is: μσ.σκ
  4229. Bedrag is: πορ.ςκ
  4230. BTW is: νσ.ξρ
  4231. Totaal inclusief BTW is: πσρ.μρ
  4232. 2.2 Datatypes
  4233. In deze paragraaf maken we kennis met de volgende datatypes en methodes:
  4234. • string
  4235. • boolean
  4236. • number
  4237. • parseInt()
  4238. • parseFloat()
  4239. • toString()
  4240. • toFixed()
  4241. 132 2 JavaScript
  4242. Planning Inleveren
  4243. Opgaven 10 t/m 20
  4244. Lab 02
  4245. Zoals elke programmeertaal heeft JavaScript verschillende datatypes: nummers,
  4246. teksten, boolean (true of false), null en undefi ned. Het is belangrijk om goed te
  4247. begrijpen waanneer en waarom je een bepaald datatype moet gebruiken.
  4248. Het datatype string
  4249. Strings zijn tekenreeksen. Een string geef je aan als een tekst tussen aanhalingstekens, bijvoorbeeld "tekst". De meeste informatie in databases en webapplicaties
  4250. bestaat uit tekst, bijvoorbeeld NAW-gegevens, productinformatie enzovoort.
  4251. • Opgave 10
  4252. Codeer het volgende script en sla het op als datatypes.html.
  4253. <!DOCTYPE html>
  4254. <html lang="nl">
  4255. <head>
  4256. <meta http-equiv="Content-Type"
  4257. content="text/html;
  4258. charset=UTF-8">
  4259. <title>Datatypes</title>
  4260. </head>
  4261. <body>
  4262. <script>
  4263. var naam = "Carl";
  4264. var adres = "Kruislaan 111";
  4265. document.write(
  4266. "<br />Opgave 10: Datatype van naam is: "+
  4267. typeof naam);
  4268. </script>
  4269. </body>
  4270. </html>
  4271. De methode typeof
  4272. In bovenstaand voorbeeld hebben we de twee stringvariabelen naam en adres aangemaakt. Daarna hebben we met behulp van de opdracht typeof gevraagd om het
  4273. datatype van de variabele naam.
  4274. Het resultaat moet er als volgt uitzien.
  4275. Opgave λκ: Datatype van naam is: string
  4276. 2.2 Datatypes 133
  4277. Het datatype: boolean
  4278. Het datatype boolean kan maar twee waarden krijgen: true of false (waar of onwaar). Op basis van de waarde van een boolean-variabele kunnen we straks interessante controles programmeren.
  4279. • Opgave 11
  4280. Open datatypes.html en voeg de volgende code eraan toe.
  4281. var leerplichtig = true;
  4282. var volwassen = false;
  4283. document.write(
  4284. "<br />Opgave 11: Datatype van leerplichtig is: " +
  4285. typeof leerplichtig);
  4286. Het resultaat is:
  4287. Opgave λλ: Datatype van leerplichti g is: boolean
  4288. Het datatype: number (integer)
  4289. Een integer is een getal zonder decimale punt; het getal 6 is bijvoorbeeld een integer. Een getal met het datatype number (integer) kan positief of negatief zijn.
  4290. • Opgave 12
  4291. Open datatypes.html en voeg de volgende code eraan toe.
  4292. var temperatuur = -10;
  4293. document.write(
  4294. "<br />Opgave 12: Datatype van temperatuur is: " +
  4295. typeof temperatuur);
  4296. Het resultaat is:
  4297. Opgave λμ: Datatype van temperatuur is: number
  4298. Het datatype: number (fl oating-point)
  4299. JavaScript behandelt alle getallen als een getal met een ‘fl oatingpoint’ (drijvende
  4300. komma). Een fl oating-point-getal is dus een getal met een decimale komma; in JavaScript wordt de decimale komma weergegeven met een punt, zoals in het Engels
  4301. gebruikelijk is. Bijvoorbeeld 19 van 100 codeer je als volgt.
  4302. 134 2 JavaScript
  4303. • Opgave 13
  4304. Open datatypes.html en voeg de volgende code eraan toe.
  4305. var btw = 0.19 * 100;
  4306. document.write(
  4307. "<br />Opgave 13: Waarde van btw is: " + btw);
  4308. Het resultaat 19 is van het datatype fl oating-point; de decimale
  4309. punt is naar een andere positie verschoven (‘gedreven’).
  4310. Opgave λν: Waarde van btw is: λσ
  4311. parseInt()
  4312. Met de functie parseInt() maak je conversies van tekst-datatypes
  4313. naar integer-datatypes.
  4314. • Opgave 14
  4315. Open datatypes.html en voeg de volgende code eraan toe.
  4316. var string = "33445";
  4317. var resultaat = parseInt(string);
  4318. document.write(
  4319. "<br />Opgave 14: parseInt(string) Resultaat is: " +
  4320. typeof resultaat);
  4321. Het resultaat is:
  4322. Opgave λξ: parseInt(string) Resultaat is: number
  4323. parseFloat()
  4324. Met de methode parseFloat() maak je conversies van tekst naar
  4325. fl oat datatypes.
  4326. • Opgave 15
  4327. Open datatypes.html en voeg de volgende code eraan toe.
  4328. var string = "3.3445";
  4329. var resultaat = parseFloat(string);
  4330. document.write(
  4331. "<br />Opgave 15: parseFloat(string) Resultaat is:" +
  4332. typeof resultaat);
  4333. Het resultaat is:
  4334. 2.2 Datatypes 135
  4335. Opgave λο: parseFloat(string) Resultaat is: number
  4336. parseInt()
  4337. Met de methode parseInt() maak je conversies van fl oat-datatypes
  4338. naar integer-datatypes.
  4339. • Opgave 16
  4340. Open datatypes.html en voeg de volgende code eraan toe.
  4341. var float = 3.3445;
  4342. var resultaat = parseInt(float);
  4343. document.write(
  4344. "<br />Opgave 16: parseInt(float) Resultaat is: " +
  4345. typeof resultaat);
  4346. Het resultaat is:
  4347. Opgave λπ: parseInt(fl oat) Resultaat is: number
  4348. toString()
  4349. Met de methode toString() maak je conversies van fl oat of integer naar tekst.
  4350. • Opgave 17
  4351. Open datatypes.html en voeg de volgende code eraan toe.
  4352. var float = 3.3445;
  4353. var resultaat = float.toString();
  4354. document.write(
  4355. "<br />Opgave 17: float.toString() Resultaat is: " +
  4356. typeof resultaat);
  4357. Het resultaat is:
  4358. Opgaveλρ: fl oat.toString() Resultaat is: string
  4359. Formatteren met toFixed(n)
  4360. Met de methode toFixed(n) formatteer je van fl oat naar n decimale posities.
  4361. 136 2 JavaScript
  4362. • Opgave 18
  4363. Open datatypes.html en voeg de volgende code eraan toe.
  4364. var float = 3.3445;
  4365. var resultaat = float.toFixed(2);
  4366. document.write(
  4367. "<br />Opgave 18: float.toFixed(2) Resultaat is: " +
  4368. typeof resultaat);
  4369. Het resultaat is:
  4370. Opgave λς: fl oat.toFixed(μ) Resultaat is: string
  4371. Het datatype: undefi ned
  4372. Als we een variabele willen gebruiken, moeten we deze variabele eerst defi niëren.
  4373. Een ongedefi nieerde variabele krijgt het datatype undefined.
  4374. • Opgave 19
  4375. Open datatypes.html en voeg het volgende eraan toe.
  4376. var twee; // variabele twee ongedefinieerd.
  4377. document.write(
  4378. "<br />Opgave 19: Datatype var twee is: " +
  4379. typeof twee);
  4380. Om niet alles te herhalen geven we steeds alleen het resultaat van de laatste opgave. Het resultaat is:
  4381. Opgave λσ: Datatype var twee is: undefi ned
  4382. Het datatype: NaN
  4383. Het datatype NaN betekent ‘Not a Number’. In de volgende opgave (de som van 10 +
  4384. Null) krijgt de variabele c het datatype NaN:
  4385. • Opgave 20
  4386. Open datatypes.html en voeg de volgende code eraan toe.
  4387. var een = 1;
  4388. var drie = een * twee; // var twee nog niet aangemaakt.
  4389. document.write(
  4390. "<br />Opgave 20: De waarde van drie is: " + drie);
  4391. Het resultaat is:
  4392. 2.3 Het Array-object 137
  4393. Opgave μκ: De waarde van drie is: NaN
  4394. • Lab 02
  4395. Codeer het volgende script en sla het op als lab02.html.
  4396. In deze lab-opdracht maak je gebruik van de volgende conversie:
  4397. 1 foot = 0.3048 meter
  4398. 1 meter = 3.28084 feet
  4399. Stap 1: Prompt de user voor zijn lengte in meters.
  4400. Stap 2: Converteer de lengte naar feet.
  4401. Stap 3: Geef het resultaat weer.
  4402. Het resultaat zie je hieronder:
  4403. 2.3 Het Array-object
  4404. In deze paragraaf maken we kennis met de volgende array-methodes:
  4405. • arrays
  4406. • shift
  4407. • unshift
  4408. • pop
  4409. • push
  4410. • splice
  4411. • sort
  4412. • reverse
  4413. • indexOf
  4414. • typeof
  4415. • splice
  4416. • join
  4417. Planning Inleveren
  4418. Opgaven 21 t/m 41
  4419. Lab 03
  4420. 138 2 JavaScript
  4421. Naast variabelen heb je ook datastructuren nodig waar je informatie tijdelijk in
  4422. kunt bewaren. Een van de eenvoudigste datastructuren is het Array-object (in
  4423. Java script beginnen objectnamen met een hoofdletter). Een array is een serie van
  4424. dezelfde soort of van verschillende data-elementen. Ieder element heeft een positie
  4425. in de array. De positie van een element in de array geef je aan met een index. Een
  4426. array kun je je voorstellen als een ladekastje met een naam in het geheugen van de
  4427. computer.
  4428. Elk laatje heeft een eigen volgnummer. Door middel van de naam en het volgnummer (index) kun je de inhoud van een laatje bekijken of wijzigen.
  4429. Een Array-object declareren
  4430. De syntaxis voor het declareren van een nieuwe array is:
  4431. var arraynaam = new Array();
  4432. De arraynaam bepalen we zelf. Met het keyword new maken we een
  4433. nieuw object dat gebaseerd is op het JavaScript Array-object. Het Array-object is
  4434. een sjabloon of model van een array. Vanuit dit sjabloon kunnen we onze eigen arrays aanmaken. De namen van de ingebouwde objecten beginnen met een hoofdletter. new Array() is juist maar new array() is syntactisch fout.
  4435. • Opgave 21
  4436. Zorg ervoor dat arrays.html er als volgt uitkomt te zien:
  4437. <!DOCTYPE html>
  4438. <html lang="nl">
  4439. <head>
  4440. <meta http-equiv="Content-Type"
  4441. content="text/html;
  4442. charset=UTF-8">
  4443. <title>Arrays</title>
  4444. </head>
  4445. <body>
  4446. <script>
  4447. var weekdag = new Array();
  4448. document.write("<br />Opgave 21: Array aangemaakt");
  4449. </script>
  4450. </body>
  4451. </html>
  4452. Array-elementen declareren
  4453. Een array mag een of meer elementen hebben. Een element declareer je met de volgende syntaxis:
  4454. weekdag[0] = "zondag";
  4455. Je zou je deze array in het computergeheugen als volgt kunnen voorstellen:
  4456. 2.3 Het Array-object 139
  4457. weekdag
  4458. [0]
  4459. "zondag"
  4460. Een array wordt intern in het computergeheugen aangemaakt, maar niet op het
  4461. beeldscherm. Als je de content van een array wilt zien, moet je de opdracht document.write gebruiken.
  4462. • Opgave 22
  4463. Open arrays.html en voeg de volgende code eraan toe binnen de <script>-tags:
  4464. weekdag[0] = "Maandag";
  4465. weekdag[1] = "Dinsdag";
  4466. weekdag[2] = "Woensdag";
  4467. weekdag[3] = "Donderdag";
  4468. weekdag[4] = "Vrijdag";
  4469. document.write("<br />Opgave 22: Elementen aangemaakt");
  4470. Je kunt je de array weekdag in het computergeheugen als volgt voorstellen:
  4471. weekdag
  4472. [0] [1] [2] [3] [4]
  4473. "Maandag" "Dinsdag" "Woensdag" "Donderdag" "Vrijdag"
  4474. Je verwijst naar een element door de array-naam en de index te gebruiken, bijvoorbeeld:
  4475. resultaat = weekdag[0]; // resultaat is "Maandag"
  4476. De indexnummers van een array beginnen altijd met 0.
  4477. Er is nog een manier om een array te declareren. Bovenstaande array zou je ook als
  4478. volgt kunnen aanmaken:
  4479. var weekdag = new Array
  4480. ('Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag');
  4481. • Opgave 23
  4482. Open arrays.html en voeg de volgende code eraan toe:
  4483. document.write(
  4484. '<br />Opgave 23: weekdag array: ' + weekdag);
  4485. document.write(
  4486. '<br />Eerste element in array is: ' + weekdag[0]);
  4487. Het resultaat moet er als volgt uitzien:
  4488. 140 2 JavaScript
  4489. Opgave μλ: Array aangemaakt
  4490. Opgave μμ: Elementen aangemaakt
  4491. Opgave μν: weekdag array: Maandag,Dinsdag,Woensdag,Donderdag,Vrijdag
  4492. Eerste element in array is: Maandag
  4493. Multidimensionale arrays
  4494. Een array kunnen we als volgt declareren:
  4495. var team = new Array();
  4496. Aan deze array kunnen we elementen als volgt toevoegen:
  4497. team[0] = 'Arsenal';
  4498. team[1] = 'Marseille';
  4499. team[2] = 'FC Barcelona';
  4500. team[3] = 'Ajax';
  4501. Maar een array-element kan zelf ook weer een array zijn, bijvoorbeeld:
  4502. team[0] = new Array();
  4503. Om naar een element van het array team te kunnen verwijzen, hebben we dus nu
  4504. twee indexen nodig, bijvoorbeeld:
  4505. team[0][0] = 3;
  4506. Zo hebben we een multidimensionale array aangemaakt. Kijk in de volgende tabel
  4507. naar de doelpunten van drie teams die ieder drie wedstrijden spelen:
  4508. Wedstrijd 1 Wedstrijd 2 Wedstrijd 3
  4509. Team 1 1 23
  4510. Team 2 456
  4511. Team 3 789
  4512. Deze gegevens kun je in een array van 3 × 3 cellen representeren. Eerst declareer je
  4513. je array team als volgt:
  4514. var team = new Array();
  4515. Dan declareer je drie team-elementen. Elk team krijgt een nieuw array, bijvoorbeeld:
  4516. team[1] = new Array();
  4517. team[2] = new Array();
  4518. team[3] = new Array();
  4519. Dan voer je de gegevens voor team[1] in, bijvoorbeeld:
  4520. team[1][1] = 1;
  4521. team[1][2] = 2;
  4522. team[1][3] = 3;
  4523. 2.3 Het Array-object 141
  4524. Het resultaat zou je je als volgt kunnen voorstellen:
  4525. [1] [2] [3]
  4526. team[1] 123
  4527. team[2] 456
  4528. team[3] 789
  4529. De eerste index [1] verwijst naar het team en de tweede index [1] verwijst naar de
  4530. wedstrijd. Dus bij team 1 wedstrijd 1 was het aantal doelpunten 1.
  4531. Als je de doelpunten van team 1 wilt zien, doe je dat als volgt:
  4532. document.write('Scores team 1: ' + team[1][1] + ' ' +
  4533. team[1][2] + ' ' + team[1][3]);
  4534. Of
  4535. document.write('Scores team 1: ' + team[1]);
  4536. LET OP
  4537. Ons doel is om <"tag">-namen met dubbele aanhalingstekens en JavaScript zoveel
  4538. mogelijk met enkele aanhalingstekens te coderen. Dit zorgt voor leesbare code
  4539. waneer je HTML en JavaScript in één script codeert.
  4540. Array-methodes
  4541. Arrays zijn objecten en we maken nu kennis met de array-methodes die ingebouwd
  4542. zijn in array-objecten. Deze methodes helpen ons om arrays te verwerken en om
  4543. allerlei bewerkingen op arrays uit te voeren.
  4544. • Opgave 24
  4545. Typ het volgende script over en sla het op als arraymethodes.html.
  4546. <!DOCTYPE html>
  4547. <html lang="nl">
  4548. <head>
  4549. <meta http-equiv="Content-Type"
  4550. content="text/html;
  4551. charset=UTF-8">
  4552. <title>Array methodes</title>
  4553. </head>
  4554. <body>
  4555. <script>
  4556. var studenten = new Array(
  4557. 'Zakaria','Albert','Hamsa','Mike','Pieter');
  4558. document.write('<br>Opgave 24: Studenten: ' + studenten);
  4559. </script>
  4560. </body>
  4561. </html>
  4562. 142 2 JavaScript
  4563. Het resultaat van deze opgave zie je hieronder.
  4564. Opgave μξ: Studenten: Zakaria,Albert,Hamsa,Mike,Pieter
  4565. Hier hebben we een array-object met vijf elementen aangemaakt ergens in het
  4566. computergeheugen. De naam van de array is studenten en verwijst naar het geheugenadres waar de array aangemaakt is.
  4567. Figuur 2.6
  4568. Array-pointers
  4569. Array-pointers zijn verwijzingen naar een array-object. Maar pointers zijn geen
  4570. objecten. In de volgende opgave creëren we de pointer team die naar de array studenten verwijst. Een pointer is een tweede naam voor een object.
  4571. • Opgave 25
  4572. Open arraymethodes.html en voeg de volgende pointer eraan toe.
  4573. team = studenten;
  4574. document.write('<br />Opgave 25: Team: '+team);
  4575. </script>
  4576. </body>
  4577. </html>
  4578. Het resultaat van deze opgave zie je hieronder. De array studenten heeft de pointer
  4579. team gekregen.
  4580. Opgave μο: Team: Zakaria,Albert,Hamsa,Mike,Pieter
  4581. Figuur 2.7
  4582. Zoals te zien is in deze fi guur verwijst de pointer team naar het array-object studenten. Het is geen kopie van het object. Dit testen we in de volgende opgave.
  4583. 2.3 Het Array-object 143
  4584. • Opgave 26
  4585. Open arraymethodes.html en voeg de volgende code eraan toe.
  4586. team[0] = 'Umut';
  4587. document.write(
  4588. '<br />Opgave 26: Element [0] is gewijzigd: '+ studenten);
  4589. Het resultaat van deze opgave zie je hieronder.
  4590. Opgave μπ: Element [κ] is gewijzigd: Umut,Albert,Hamsa,Mike,Pieter
  4591. Je ziet in de volgende fi guur dat we nog steeds bezig zijn met hetzelfde object. Met
  4592. de pointer team verwijzen we nog steeds naar het object studenten.
  4593. team[0] = 'Umut';
  4594. Figuur 2.8
  4595. array.shift()
  4596. Een object mag methodes hebben. Het array-object heeft een aantal handige methodes die ons helpen met het verwerken en manipuleren van arrays. In de volgende opgave gebruiken we de methode shift(). Met deze methode kunnen we het
  4597. eerste element van een array verwijderen.
  4598. • Opgave 27
  4599. Open arraymethodes.html en voeg de volgende code eraan toe.
  4600. studenten.shift();
  4601. document.write(
  4602. '<br />Opgave 27: Resultaat van shift: '+studenten);
  4603. Het resultaat zie je hieronder: ‘Umut’ is verwijderd.
  4604. Opgave μρ: Resultaat van shift : Albert,Hamsa,Mike,Pieter
  4605. Het resultaat van de methode shift() is dat de hele array een positie naar links
  4606. opschuift en het eerste element verdwijnt.
  4607. 144 2 JavaScript
  4608. array.unshift()
  4609. In de volgende opgave gebruiken we de methode unshift(). Met deze methode
  4610. kunnen we een of meer nieuwe elementen aan het begin van een array toevoegen.
  4611. • Opgave 28
  4612. Open arraymethodes.html en voeg de volgende code eraan toe.
  4613. studenten.unshift('Jozef','Umut');
  4614. document.write(
  4615. '<br /> Opgave 28: Resultaat van unshift: '+studenten);
  4616. Het resultaat zie je hieronder: ‘Jozef’ en ‘Umut’ zijn toegevoegd.
  4617. Opgave μς: Resultaat van unshift : Jozef,Umut,Albert,Hamsa,Mike,Pieter
  4618. Je ziet in de volgende fi guur dat er twee nieuwe elementen aan het begin van de
  4619. array zijn toegevoegd.
  4620. Figuur 2.9
  4621. array.pop()
  4622. In de volgende opgave gebruiken we de methode pop(). Met deze methode kunnen
  4623. we het laatste element uit een array verwijderen.
  4624. • Opgave 29
  4625. Open arraymethodes.html en voeg de volgende code eraan toe.
  4626. studenten.pop();
  4627. document.write(
  4628. '<br /> Opgave 29: Resultaat van pop: ' + studenten);
  4629. Het resultaat zie je hieronder: ‘Pieter’, het laatste element in je array, is verwijderd.
  4630. Opgave μσ: Resultaat van pop: Jozef,Umut,Albert,Hamsa,Mike
  4631. array.push()
  4632. In de volgende opgave gebruiken we de methode push(). Met deze methode kunnen we een of meer nieuwe elementen aan het einde van een array toevoegen.
  4633. 2.3 Het Array-object 145
  4634. • Opgave 30
  4635. Open arraymethodes.html en voeg de volgende code eraan toe.
  4636. studenten.push('Pieter','David');
  4637. document.write(
  4638. '<br />Opgave 30: Resultaat van push: ' + studenten);
  4639. Het resultaat zie je hieronder: ‘Pieter’ en ‘David’ zijn toegevoegd.
  4640. Opgave νκ: Resultaat van push: Jozef,Umut,Albert,Hamsa,Mike,Pieter,David
  4641. Je ziet in de volgende fi guur dat er twee nieuwe elementen aan het einde van de
  4642. array zijn toegevoegd.
  4643. Figuur 2.10
  4644. array.splice()
  4645. In de volgende opgave gebruiken we de methode splice(). Met deze methode kunnen we een array in tweeën splitsen. De syntaxis is:
  4646. arraynaam.splice(begin-element, aantal-elementen)
  4647. Als je bijvoorbeeld een nieuwe array wilt maken met de eerste drie elementen uit
  4648. de array team, dan doe je dat zo:
  4649. nieuwearray = team.splice(0,3)
  4650. • Opgave 31
  4651. Open arraymethodes.html en voeg de volgende code eraan toe.
  4652. klas = studenten.splice(2,4);
  4653. document.write(
  4654. '<br>Opgave 31: Resultaat<br>studenten: '+studenten+'<br>klas:'+klas);
  4655. Het resultaat zie je hieronder.
  4656. Opgave νλ: Resultaat
  4657. studenten: Jozef,Umut,David
  4658. klas: Albert,Hamsa,Mike,Pieter
  4659. 146 2 JavaScript
  4660. Je ziet in de volgende fi guur dat de array studenten gesplitst is in twee arrays. Eerst
  4661. krijgt de array klas vier elementen, beginnend met element[2]. Dan krijg je in de
  4662. array studenten de overgebleven drie elementen.
  4663. Figuur 2.11
  4664. array.sort()
  4665. In de volgende opgave gebruiken we de methode sort(). Met deze methode kunnen we een array ordenen in alfabetische volgorde.
  4666. • Opgave 32
  4667. Open arraymethodes.html en voeg de volgende code eraan toe.
  4668. studenten.sort();
  4669. document.write(
  4670. '<br />Opgave 32: Resultaat van sort: ' + studenten);
  4671. Het resultaat zie je hieronder.
  4672. Opgave νμ: Resultaat van sort: David,Jozef,Umut
  4673. Je ziet dat de volgorde van de elementen is veranderd.
  4674. Figuur 2.12
  4675. array.reverse()
  4676. In de volgende opgave gebruiken we de methode reverse(). Met deze methode
  4677. kunnen we een array ordenen in de omgekeerde volgorde.
  4678. • Opgave 33
  4679. Open arraymethodes.html en voeg de volgende code eraan toe.
  4680. studenten.reverse();
  4681. document.write(
  4682. '<br />Opgave 33: Resultaat van reverse: ' + klas);
  4683. 2.3 Het Array-object 147
  4684. Het resultaat zie je hieronder.
  4685. Opgave νν: Resultaat van reverse: Albert,Hamsa,Mike,Pieter
  4686. array.indexOf()
  4687. Met de methode indexOf() kunnen we kijken of er een bepaald element in een array bestaat. We zouden bijvoorbeeld kunnen vragen of een bepaalde student in de
  4688. array studenten bestaat. De syntaxis van de methode indexOf() is:
  4689. var index = arraynaam.indexOf('element')
  4690. Als het element bestaat, krijg je de juiste index van het element.
  4691. Als het element niet bestaat, krijg je (-1) als resultaat.
  4692. • Opgave 34
  4693. Open arraymethodes.html en voeg de volgende code eraan toe.
  4694. index = studenten.indexOf('Jozef');
  4695. document.write(
  4696. '<br />Opgave 34: Resultaat van indexOf: ' + index);
  4697. Het resultaat zie je hieronder.
  4698. Opgave νξ: Resultaat van indexOf Jozef: λ
  4699. Element verwijderen
  4700. Om een specifi ek array-element te verwijderen, gebruiken we de opdracht delete.
  4701. In de volgende opgave gebruiken we de opdracht delete om het derde element in
  4702. de array klas te verwijderen:
  4703. • Opgave 35
  4704. Open arraymethodes.html en voeg de volgende code eraan toe.
  4705. delete klas[2];
  4706. document.write(
  4707. '<br />Opgave 35: Resultaat van delete: '+klas);
  4708. Het resultaat zie je hieronder.
  4709. Opgave νο: Resultaat van delete: Albert,Hamsa,,Pieter
  4710. Je ziet dat de opdracht delete alleen maar de content 'Mike' van het derde element
  4711. heeft verwijderd, het derde element blijft staan, maar is leeg tussen 'Hamsa', ,'Pieter'
  4712. 148 2 JavaScript
  4713. Figuur 2.13
  4714. Dat kunnen we overigens controleren met de opdracht typeof.
  4715. De opdracht typeof
  4716. Met de opdracht typeof kunnen we checken wat voor datatype een element of een
  4717. variabele is.
  4718. • Opgave 36
  4719. Open arraymethodes.html en voeg de volgende code eraan toe.
  4720. document.write(
  4721. '<br />Opgave 36: Datatype van gedelete element is: '+ typeof klas[2]);
  4722. Het resultaat zie je hieronder.
  4723. Opgave νπ: Datatype van gedelete element is: undefi ned
  4724. Hier zien we dat het datatype van het gedelete element ‘undefi ned’ is.
  4725. Elementen verwijderen met splice()
  4726. Om een specifi ek array-element volledig te verwijderen, gebruiken we de
  4727. methode splice(). De syntaxis van de methode splice() is:
  4728. arraynaam.splice(element-index, 1)
  4729. element-index is de index van het te verwijderen element, 1 is het aantal te verwijderen elementen.
  4730. • Opgave 37
  4731. Open arraymethodes.html en voeg de volgende code eraan toe.
  4732. klas.splice(2,1);
  4733. document.write(
  4734. '<br />Opgave 37: Element volledig verwijderd: ' + klas);
  4735. Het resultaat zie je hieronder.
  4736. Opgave νρ: Element volledig verwijderd: Albert,Hamsa,Pieter
  4737. Zoals te zien is in de volgende fi guur is het derde element volledig verwijderd.
  4738. 2.3 Het Array-object 149
  4739. Figuur 2.14
  4740. In de volgende opgave gebruiken we de methodes splice() en indexOf() om een
  4741. specifi eke student te verwijderen.
  4742. • Opgave 38
  4743. Open arraymethodes.html en voeg de volgende code eraan toe.
  4744. index = studenten.indexOf('Jozef');
  4745. studenten.splice(index,1);
  4746. document.write(
  4747. '<br>Opgave 38: Specifieke student verwijderd: '+ studenten);
  4748. Hier zie je het resultaat: ‘Jozef’ is verwijderd.
  4749. Opgave νς: Specifi eke student verwijderd: Umut,David
  4750. Array kopiëren met slice()
  4751. Soms wil je een exacte kopie van een array maken. Dat kan met behulp van de methode slice() zonder indexen.
  4752. • Opgave 39
  4753. Open arraymethodes.html en voeg de volgende code eraan toe.
  4754. klas2 = klas.slice();
  4755. document.write(
  4756. '<br />Opgave 39: Resultaat van kopiëren: ' + klas2);
  4757. Als je de methode slice() zonder begin-index gebruikt, wordt de eerste index
  4758. gebruikt. Als je de methode gebruikt zonder eind-index wordt de laatste index gebruikt.
  4759. Het resultaat zie je hieronder:
  4760. Opgave νσ: Resultaat van kopiëren: Albert,Hamsa,Pieter
  4761. Array transporteren
  4762. Soms wil je een array naar de server transporteren. Om dit te realiseren converteren we de array naar een string. Daarna kunnen we de string in de vorm van een
  4763. cookie naar de server transporteren. We behandelen cookies aan het einde van dit
  4764. hoofdstuk in paragraaf 2.18.
  4765. 150 2 JavaScript
  4766. Array.join
  4767. De methode array.join(delimiter) converteert een array naar een string. In de
  4768. string wordt ieder element met de aangegeven delimiter of het scheidingsteken
  4769. gescheiden.
  4770. In de volgende opgave maken we gebruik van de methode array.join(delimiter)
  4771. om de array klas naar een string te converteren.
  4772. • Opgave 40
  4773. Open arraymethodes.html en voeg de volgende code eraan toe.
  4774. var myString = klas.join('|');
  4775. document.write(
  4776. '<br />Opgave 40: Resultaat van join: ' + myString);
  4777. Het resultaat is de volgende string met | tussen ieder element in:
  4778. Opgave ξκ: Resultaat van join: Albert|Hamsa|Pieter
  4779. String.split
  4780. De methode string.split(delimiter) converteert een string naar een array. In de
  4781. string wordt ieder element met het aangegeven delimiter-teken gescheiden, bijvoorbeeld een spatie of het |-teken.
  4782. In de volgende opgave maken we gebruik van de methode string.split(delimiter)
  4783. om de string myString uit de vorige opgave weer naar een array om te zetten.
  4784. • Opgave 41
  4785. Open arraymethodes.html en voeg de volgende code eraan toe.
  4786. var myArray = myString.split('|');
  4787. document.write(
  4788. '<br />Opgave 41: Resultaat van split: ' + myArray );
  4789. Het resultaat is de volgende string:
  4790. Opgave ξλ: Resultaat van split: Albert,Hamsa,Pieter
  4791. 2.3 Het Array-object 151
  4792. • Lab 03
  4793. Maak een nieuw script lab03.html en voer de volgende stappen uit.
  4794. 1 Codeer de volgende array met de naam ‘testarray’.
  4795. testarray
  4796. [0] [1] [2] [3]
  4797. "een" "twee" 3 "vier"
  4798. 2 Voeg het vijfde element met de waarde 5 eraan toe.
  4799. 3 Toon (testarray).
  4800. 4 Toon het datatype van het vijfde element.
  4801. 5 Verwijder het vijfde element.
  4802. 6 Toon (testarray).
  4803. 7 Voeg aan het begin een element toe met de waarde ‘nul’.
  4804. 8 Toon (testarray).
  4805. 9 Delete index[0].
  4806. 10 Toon het datatype van index[0].
  4807. 11 Verwijder het eerste element.
  4808. 12 Toon (testarray).
  4809. 13 Verwijder het tweede element.
  4810. 14 Toon (testarray).
  4811. 15 Als index[2] bestaat: verwijder deze.
  4812. 16 Toon (testarray).
  4813. Als alles goed verloopt, ziet het resultaat er als volgt uit:
  4814. Lab κν
  4815. ν een,twee,ν,vier,ο
  4816. ξ Datatype is: number
  4817. π een,twee,ν,vier
  4818. ς nul,een,twee,ν,vier
  4819. λκ Datatype [κ] is: undefi ned
  4820. λμ een,twee,ν,vier
  4821. λξ een,ν,vier
  4822. λπ een,ν
  4823. 152 2 JavaScript
  4824. 2.4 Objecten
  4825. In deze paragraaf maken we kennis met de volgende JavaScript-concepten en methodes:
  4826. • object
  4827. • property in object
  4828. Planning Inleveren
  4829. Opgaven 42 t/m 45
  4830. Lab 04
  4831. JavaScript kent fi rst class objecten. Dat zijn objecten die dynamisch gemaakt worden: CRUD (Create, Read, Update, Delete), Dat betekent dat we deze objecten dynamisch kunnen maken, lezen, wijzigen en verwijderen. Een object is een verzameling attributen of eigenschappen die toegevoegd en verwijderd kunnen worden. In
  4832. JavaScript maken we fi rst class objecten met accolades als volgt mijnObject = { }.
  4833. Syntaxis:
  4834. mijnObject = {
  4835. attribuut1: 'waarde1' [, attribuut2: 'waarde2', . . .]
  4836. }
  4837. Bijvoorbeeld:
  4838. student = {
  4839. id: 1,
  4840. naam: 'Jozef',
  4841. email: 'jozef@live.nl',
  4842. opleiding: 'Applicatie Ontwikkelaar'
  4843. }
  4844. We kunnen controleren of een object een specifi ek attribuut heeft met de binary
  4845. in-operator. Bijvoorbeeld:
  4846. 'email' in student;
  4847. Het resultaat is true.
  4848. De properties van het object student kunnen gewijzigd worden, bijvoorbeeld:
  4849. student.email = 'jozef@hotmail.com'
  4850. Stel dat we een array maken als volgt:
  4851. studenten = [];
  4852. We kunnen objecten aan deze array toevoegen met de push-methode:
  4853. 2.4 Objecten 153
  4854. studenten.push(
  4855. {
  4856. id: 1,
  4857. naam: 'Jozef',
  4858. email: 'jozef@live.nl',
  4859. opleiding: 'Applicatie Ontwikkelaar'
  4860. }
  4861. );
  4862. We kunnen specifi eke properties aanvragen als volgt:
  4863. document.write(studenten[0].naam);
  4864. Het resultaat is:
  4865. Jozef
  4866. Een hash-array is een array met elementen die in plaats van een index een
  4867. naam krijgen. Bijvoorbeeld, in plaats van: arraynaam[1] kunnen we ook zeggen:
  4868. arraynaam['elementnaam']
  4869. JavaScript kent geen hash-arrays, maar we kunnen een hash-array als volgt simuleren.
  4870. • Opgave 42
  4871. Open een nieuw script en sla het op als objecten.html. Voeg de volgende code eraan toe.
  4872. <!DOCTYPE html>
  4873. <html lang="nl">
  4874. <head>
  4875. <meta http-equiv="Content-Type" content="text/html;
  4876. charset=UTF-8">
  4877. <title>Objecten</title>
  4878. </head>
  4879. <body>
  4880. <script>
  4881. var laptops = [];
  4882. laptops['macbook'] =
  4883. {'model':'air', 'voorraad': 2000,'prijs': 1090};
  4884. document.write(
  4885. '<br />Opgave 42: laptops array aangemaakt');
  4886. </script>
  4887. </body>
  4888. </html>
  4889. Het resultaat is:
  4890. Opgave ξμ: laptops array aangemaakt
  4891. 154 2 JavaScript
  4892. In bovenstaand script hebben we een array laptops aangemaakt. Daarna hebben we
  4893. een object als volgt toegevoegd:
  4894. laptops['macbook'] =
  4895. {'model':'air', 'voorraad': 2000,'prijs': 1090};
  4896. In JavaScript is ['macbook'] geen element van de array laptops maar alleen een property. De array laptops is nog steeds leeg. We hebben er alleen de nieuwe property
  4897. ['macbook'] aan toegevoegd. Deze property hebben we verder als een nieuw object
  4898. gedefi nieerd.
  4899. Voor dit object hebben we weer drie nieuwe properties met waarden gedefi nieerd:
  4900. {'model':'air', 'voorraad': 2000, 'prijs': 1090}
  4901. Omdat onze array laptops leeg is, kunnen we de array-methodes zoals pop() en
  4902. push() uit de vorige paragraaf hier niet gebruiken. Maar we kunnen dit verder beschouwen als een hash-array.
  4903. • Opgave 43
  4904. Open objecten.html en voeg de volgende laptops eraan toe.
  4905. laptops['asusbook'] =
  4906. {'model':'wind', 'voorraad': 1000, 'prijs': 990};
  4907. laptops['dellbook'] =
  4908. {'model': 'fire', 'voorraad': 987, 'prijs': 890};
  4909. document.write('<br />Opgave 43: laptops array uitgebreid');
  4910. </script>
  4911. </body>
  4912. </html>
  4913. Het resultaat is:
  4914. Opgave ξν: laptops array uitgebreid
  4915. Array.length
  4916. We kunnen verder testen of inderdaad onze array laptops leeg is met behulp van de
  4917. property array.length.
  4918. • Opgave 44
  4919. Open objecten.html en voeg de volgende code eraan toe.
  4920. document.write(
  4921. '<br />Opgave 44: De laptops array heft '+
  4922. laptops.length + ' elementen');
  4923. Het resultaat is:
  4924. 2.4 Objecten 155
  4925. Opgave ξξ: De laptops array heeft κ elementen
  4926. Testen op array-properties
  4927. We kunnen nu gaan testen of een array een bepaalde property of object heeft.
  4928. Syntaxis: propertynaam in arraynaam
  4929. Bijvoorbeeld: var mac = ‘macbook’ in laptops;
  4930. Als de property in de array bestaat, dan is het resultaat true, anders false.
  4931. • Opgave 45
  4932. Open objecten.html en voeg de volgende code eraan toe.
  4933. var mac = 'macbook' in laptops;
  4934. var asus = 'asusbook' in laptops;
  4935. var dell = 'dellbook' in laptops;
  4936. document.write(
  4937. '<br>Opgave 45: De variabele mac is: ' + mac);
  4938. document.write(
  4939. '<br>Mac specificaties ------- ' +
  4940. '<br>Model: '+ laptops['macbook']['model'] +
  4941. '<br>Voorraad: '+ laptops['macbook']['voorraad'] +
  4942. '<br>Prijs: '+ laptops['macbook']['prijs']);
  4943. Het resultaat moet er als volgt uitzien:
  4944. Opgave ξο: De variabele mac is: true
  4945. Mac specifi cati es --------
  4946. Model: air
  4947. Voorraad: μκκκ
  4948. Prijs: λκσκ
  4949. • Lab 04
  4950. 1 Maak een nieuw JavaScript en sla het op als lab04.html.
  4951. 2 Codeer een nieuwe array met de naam palet en met vijf kleuren.
  4952. 3 Toon (palet).
  4953. 4 Codeer de volgende prompt:
  4954. var nieuwekleur = prompt('Typ een nieuwe kleur in: ');
  4955. 5 Codeer een array-methode die de nieuwe kleur aan het einde van de array
  4956. palet toevoegt.
  4957. 6 Toon (palet).
  4958. 7 Codeer de volgende prompt:
  4959. var nieuwekleur = prompt('Typ een nieuwe kleur in: ');
  4960. 156 2 JavaScript
  4961. 8 Codeer een array-methode die de nieuwe kleur aan het begin van array palet toevoegt.
  4962. 9 Toon (palet).
  4963. 10 Sorteer de array palet oplopend op alfabetische volgorde.
  4964. 11 Toon (palet).
  4965. 12 Splits de array palet in tweeën: palet en palet2.
  4966. 13 Toon (palet).
  4967. 14 Toon (palet2).
  4968. 15 Maak een exacte kopie van palet in palet3.
  4969. 16 Toon (palet3);
  4970. Hieronder zie je het resultaat met willekeurige kleuren:
  4971. Lab κξ
  4972. ν palet is nu: wit,blauw,groen,rood,zwart
  4973. π palet is nu: wit,blauw,groen,rood,zwart,geel
  4974. σ palet is nu: oranje,wit,blauw,groen,rood,zwart,geel
  4975. λλ palet is nu: blauw,geel,groen,oranje,rood,wit,zwart
  4976. λν palet is nu: rood,wit,zwart
  4977. λξ paletμ is nu: blauw,geel,groen,oranje
  4978. λπ paletν is nu: rood,wit,zwart
  4979. 2.5 Het Date-object
  4980. In deze paragraaf maken we kennis met het JavaScript Date-object. Omdat Date
  4981. een object is schrijven we dit met een hoofdletter. We behandelen de volgende:
  4982. • Date-object
  4983. • Date creëren
  4984. • Date wijzigen
  4985. Planning Inleveren
  4986. Opgaven 46 t/m 50
  4987. Lab 05
  4988. Het Date-object is ook een interessant object in JavaScript. Dit object heeft, zoals
  4989. het Array-object, methodes die ons helpen om een datum te verwerken.
  4990. Creëer een Date-object
  4991. De syntaxis voor het declareren van een Date-object is als volgt:
  4992. new Date();
  4993. 2.5 Het Date-object 157
  4994. Met het keyword new maken we een nieuw object dat gebaseerd is op het JavaScript
  4995. Date-object. Dit nieuwe object bevat de datum en de tijd van je computerklok.
  4996. • Opgave 46
  4997. Open een nieuw bestand en sla het op als dateobject.html. Voeg de volgende code
  4998. eraan toe.
  4999. <!DOCTYPE html> <html lang="nl">
  5000. <head>
  5001. <meta http-equiv="Content-Type"
  5002. content="text/html;
  5003. charset=UTF-8">
  5004. <title>Date Object</title>
  5005. </head>
  5006. <body>
  5007. <script>
  5008. var vandaag = new Date();
  5009. document.write('<br />Opgave 46: '+ vandaag);
  5010. </script>
  5011. </body>
  5012. </html>
  5013. Het resultaat is afhankelijk van de huidige datum:
  5014. Opgave ξπ:
  5015. Wed Nov λν μκλπ λξ:οπ:οπ GMT+κλκκ
  5016. De huidige datum en tijd worden weergegeven.
  5017. In het resultaat zien we de datum en de tijd van vandaag. De tijd wordt gelezen
  5018. vanuit je computerklok en is lokale tijd. Lokale tijd in Nederland is CET = Central
  5019. European Time. CET is een uur later dan GMT, dus (GMT+0100). GMT is de afkorting voor Greenwich Mean Time.
  5020. Een datum is een moment in de tijd. Dit moment wordt gerekend als het aantal
  5021. milliseconden sinds middernacht 1 januari 1970. Bijvoorbeeld:
  5022. var nu = Date.now();
  5023. geeft als resultaat het aantal milliseconden sinds 1 januari 1970.
  5024. Een dag bevat 86.400.000 milliseconden, dus we kunnen zeggen:
  5025. var eenDag = 86400000;
  5026. Creëer een Date-object met parameters
  5027. Een nieuw Date-object kunnen we creëren met meerdere parameters. In de volgende opgave creëren we een Date-object met de parameter value.
  5028. Syntaxis met de parameter value:
  5029. new Date(value);
  5030. 158 2 JavaScript
  5031. De datum van morgen kunnen we als volgt uitrekenen:
  5032. var morgen = new Date(nu + eenDag);
  5033. • Opgave 47
  5034. Open dateobject.html en voeg de volgende code eraan toe.
  5035. var nu = Date.now();
  5036. var eenDag = 86400000;
  5037. var morgen = new Date(nu + eenDag);
  5038. document.write( "<br />Opgave 47: De datum morgen is: "+ morgen);
  5039. </script>
  5040. </body>
  5041. </html>
  5042. Afhankelijk van de datum vandaag ziet het resultaat eruit als:
  5043. Opgave ξρ: De datum morgen is: Thu Nov λξ μκλο λο:κλ:οσ GMT+κλκκ
  5044. Creëer een Date-object met string
  5045. Nog een andere manier om een Date-object te creëren is met een string-parameter.
  5046. De syntaxis met de parameter date string is als volgt:
  5047. new Date(date string);
  5048. In de volgende opgave maken we een nieuw Date-object met een date-string.
  5049. • Opgave 48
  5050. Open dateobject.html en voeg de volgende code eraan toe.
  5051. // datum met date string
  5052. var schooljaar = new Date("2015-09-04");
  5053. // datum met datum en tijd string
  5054. var wintertijd = new Date("2015-10-28T03:00:00");
  5055. document.write("<br />Opgave 48: Begin wintertijd is: " + wintertijd);
  5056. // maak hieronder een var met eigen geboortedatum:
  5057. // geef hieronder je geboortedatum en tijd weer:
  5058. Het resultaat moet er ongeveer uitzien als:
  5059. Opgave ξς: Begin winterti jd is: Tue Oct μς μκλο κν:κκ:κκ GMT+κλκκ
  5060. Mijn geboortedatum is: Wed Oct κλ λσσο κμ:κκ:κκ GMT+κμκκ
  5061. 2.5 Het Date-object 159
  5062. Creëer een Date-object met getallen
  5063. Weer een andere manier om een Date-object te creëren is met getallen.
  5064. De syntaxis met getallenparameters is als volgt:
  5065. new Date(jaar,maand[,dag,uur,minuut,seconde,milliseconde])
  5066. • Opgave 49
  5067. Open dateobject.html en voeg de volgende code eraan toe.
  5068. beginSchooldag = new Date(2015,8,9,8,30);
  5069. document.write("<br>Opgave 49: Begin schooldag: "+beginSchooldag);
  5070. Het resultaat moet er ongeveer zo uitzien:
  5071. Opgave ξσ: Begin schooldag: Wed Sep κσ μκλο κς:νκ:κκ GMT+κμκκ
  5072. • Opgave 50
  5073. Open dateobject.html en voeg de volgende code eraan toe.
  5074. nu = Date.now();
  5075. document.write("<br />Opgave 50: Nu: " + nu);
  5076. var dagen = ((nu -beginSchooldag) / eenDag);
  5077. document.write("<br>Aantal dagen sinds begin schooldag: " + dagen.toFixed(0));
  5078. Afhankelijk van de datum van vandaag moet het resultaat er ongeveer zo uitzien:
  5079. Opgave οκ: Nu: λξξςνορλλπορλ
  5080. Aantal dagen sinds begin schooldag: ρπ
  5081. • Lab 05
  5082. Maak een nieuw script lab05.html en voer de volgende stappen uit.
  5083. 1 Codeer de volgende prompt:
  5084. einddatum = prompt("Wat is de einddatum JJJ-MM-DD?");
  5085. 2 Codeer een Date-object var deadline met de einddatum.
  5086. 3 Toon de datum deadline.
  5087. 4 Codeer een var nu met Date.now().
  5088. 5 Codeer de var dag = 86400000.
  5089. 6 In deze stap reken je de resterende dagen uit tussen nu en de deadline.
  5090. Toon het volgende:
  5091. document.write('<br>Er zijn nog: ' + resterende.toFixed(0) + ' dagen te gaan!');
  5092. Afhankelijk van de datum vandaag moet het resultaat er zo uitzien:
  5093. 160 2 JavaScript
  5094. Deadline: Sat Dec λμ μκμκ κλ:κκ:κκ GMT+κλκκ Er zijn nog: μοςξ dagen te gaan!
  5095. 2.6 Date-methodes
  5096. In deze paragraaf maken we kennis met de volgende JavaScript-concepten en methodes:
  5097. • getFullYear
  5098. • getMonth
  5099. • getDate
  5100. • getDay
  5101. • getHours
  5102. • getMinutes
  5103. • getSeconds
  5104. Planning Inleveren
  5105. Opgave 51
  5106. Lab 06
  5107. Het Date-object bevat een aantal methodes die ons helpen om data te verwerken.
  5108. Hier volgt een lijst met de meest gebruikelijk Date-methodes:
  5109. Methode Betekenis
  5110. getFullYear geeft het jaar als resultaat (JJJJ)
  5111. getMonth resultaat is de maand (0-11); januari is 0
  5112. getDate resultaat is de dag van de maand (1-31)
  5113. getDay resultaat is de dag van de week (0-6); zondag is 0
  5114. getHours resultaat is het uur (0-23)
  5115. getMinutes resultaat is minuten (0-59)
  5116. getSeconds resultaat is seconden (0-59)
  5117. getTime resultaat is milliseconden sinds 1 januari 1970
  5118. now resultaat is milliseconden sinds 1 januari 1970
  5119. toDateString resultaat is een leesbare datum
  5120. toTimeString resultaat is een leesbare tijd
  5121. setFullYear jaar resetten (JJJJ)
  5122. setMonth maand resetten (0-11)
  5123. setDate dag resetten (1-31)
  5124. setHours uur resetten (0-24)
  5125. setMinutes minuten resetten (0-60)
  5126. setSeconds seconden resetten (0-60)
  5127. 2.6 Date-methodes 161
  5128. getFullYear
  5129. Met behulp van deze methode kunnen we een Date-object verwerken. Bijvoorbeeld:
  5130. var vandaag = new Date();
  5131. var jaar = vandaag.getFullYear();
  5132. vandaag.setHours(0);
  5133. • Opgave 51
  5134. Open een nieuw bestand en sla het op als datemethodes.html. Voeg de volgende
  5135. code eraan toe.
  5136. 1 Codeer de volgende twee arrays:
  5137. var maanden = new Array('januari','februari','maart','april','mei','juni',
  5138. 'juli','augustus','september','oktober','november','december');
  5139. var weekdag = new Array('zondag','maandag','dinsdag','woensdag','donderdag',
  5140. 'vrijdag','zaterdag')
  5141. 2 Maak gebruik van deze twee arrays om de systeemdatum in het Nederlands te vertalen.
  5142. Afhankelijk van de datum van vandaag, moet het resultaat er zo uitzien:
  5143. Vandaag is: Mon Oct μς μκλν λξ:ξλ:μκ GMT+κλκκ
  5144. Vandaag is: maandag μς oktober μκλν
  5145. • Lab 06
  5146. 1 Open lab01.html en sla het op als lab06.html.
  5147. 2 Maak een nieuw Date-object.
  5148. 3 Geef de datum van vandaag weer als factuurdatum: dd-mm-jjjj.
  5149. 4 Reken betaaldatum uit als factuurdatum + 5 dagen.
  5150. 5 Geef de betaaldatum weer als dd-mm-jjjj.
  5151. Het resultaat moet er als volgt uitzien:
  5152. 162 2 JavaScript
  5153. Lab κπ
  5154. Factuur
  5155. Factuurdatum: dd-mm-jjjj
  5156. Betaaldatum: dd-mm-jjjj
  5157. Bedankt voor je bestelling: Peter
  5158. Boekti tel is: JavaScript
  5159. Aantal te bestellen: μμ
  5160. Prijs per boek is: μσ.σκ
  5161. Bedrag is: πορ.ςκ
  5162. BTW is: νσ.ξρ
  5163. Totaal inclusief BTW is: πσρ.μρ
  5164. 2.7 Beslissingsstructuren
  5165. In deze paragraaf maken we kennis met de volgende JavaScript-concepten en methodes:
  5166. • if-opdracht
  5167. • else-clausule
  5168. • AND
  5169. • OR
  5170. • else-if-clausule
  5171. • ternary operator
  5172. Planning Inleveren
  5173. Opgaven 52 t/m 56
  5174. Lab 07
  5175. Alle programmeertalen hebben beslissingsstructuren. Wanneer we een beslissingsstructuur gebruiken, bepalen we de volgorde van uitvoering van de instructies in
  5176. een programma. Om beslissingsmomenten duidelijk aan te geven gebruiken we
  5177. stroomdiagrammen.
  5178. De opdracht if
  5179. Een beslissingsmoment kunnen we aangeven met de opdracht if. Je gebruikt de
  5180. opdracht if om te beslissen wat er moet gebeuren als een situatie true of false is.
  5181. De syntaxis van de opdracht if is als volgt:
  5182. if (voorwaarde) {
  5183. acties uit te voeren als voorwaarde true is;
  5184. }
  5185. 2.7 Beslissingsstructuren 163
  5186. Figuur 2.15 Stroomdiagram van de opdracht if
  5187. Een voorwaarde in de opdracht if() kunnen we aangeven door twee waarden te
  5188. vergelijken. Dit doen we met vergelijkingsoperatoren. Bijvoorbeeld:
  5189. if(a == b)
  5190. == betekent gelijk aan, === is identiek aan. Hier gebruiken we het symbool === om
  5191. twee strings of teksten te vergelijken.
  5192. De gebruikelijke vergelijkingsoperatoren zie je hieronder:
  5193. Symbool Betekenis Voorbeeld
  5194. == Gelijk aan if(leeftijd == 16)
  5195. === Identiek aan if(naam=== "Carl")
  5196. ! NIET !true
  5197. != Niet gelijk aan if(naam != "Jan")
  5198. > Groter dan if(leeftijd > 17)
  5199. >= Groter dan of gelijk aan if(leeftijd >= 16)
  5200. <= Kleiner dan of gelijk aan if(leeftijd <= 16)
  5201. && AND if(naam == "Carl" && leeftijd > 16)
  5202. || OR if(naam == "Carl" || leeftijd == 16)
  5203. • Opgave 52
  5204. Open een nieuw bestand en sla het op als if-opdracht.html. Voeg de volgende
  5205. code eraan toe.
  5206. <!DOCTYPE html> <html lang="nl">
  5207. <head>
  5208. <meta http-equiv="Content-Type"
  5209. content="text/html;
  5210. charset=UTF-8">
  5211. <title>if-opdracht</title>
  5212. </head>
  5213. 164 2 JavaScript
  5214. <body>
  5215. <script>
  5216. doorgaan = confirm('Opgave 52: Doorgaan?');
  5217. if(doorgaan == true) {
  5218. alert('Welkom bij de if-opdracht');
  5219. }
  5220. </script>
  5221. </body>
  5222. </html>
  5223. De clausule else
  5224. De clausule else is optioneel. De clausule else is een alternatieve optie van de opdracht if. De syntaxis van de clausule else is als volgt:
  5225. if (voorwaarde) {
  5226. acties uit te voeren als voorwaarde true is;
  5227. } else {
  5228. acties uit te voeren als voorwaarde false is;
  5229. }
  5230. • Opgave 53
  5231. Open if-opdracht.html en voeg de volgende code eraan toe.
  5232. if(doorgaan == true) {
  5233. alert('Opgave 53: Klik op OK om te beginnen');
  5234. } else {
  5235. alert('Tot ziens!');
  5236. }
  5237. </script>
  5238. </body>
  5239. </html>
  5240. AND-vergelijking
  5241. Bij de AND-vergelijking is het hele if()-argument alleen true als zowel argument1
  5242. én argument2 true zijn. Bijvoorbeeld:
  5243. if(uur==24 && minuut>=0) {
  5244. alert('het is middernacht');
  5245. }
  5246. Hier krijg je alleen de alertbox te zien als uur gelijk is aan 24 en als ook minuut groter
  5247. of gelijk aan 0 is. Beide voorwaarden moeten waar zijn.
  5248. Beslissingtabel van AND
  5249. Argument 1 && Argument 2 Resultaat
  5250. true && true true
  5251. true && false false
  5252. false && false false
  5253. false && true false
  5254. 2.7 Beslissingsstructuren 165
  5255. OR-vergelijking
  5256. Bij een OR-vergelijking is het hele if()-argument true als één of beide argumenten
  5257. true zijn. Bijvoorbeeld:
  5258. var cola = true;
  5259. var thee = false;
  5260. if(cola || thee) {
  5261. alert('we mogen of cola of thee of allebei');
  5262. }
  5263. Beslissingtabel van OR
  5264. Argument 1 || Argument 2 Resultaat
  5265. true || true true
  5266. true || false true
  5267. false || false false
  5268. false || true true
  5269. • Opgave 54
  5270. Open if-opdracht.html en voeg de volgende code eraan toe.
  5271. if(doorgaan == true) {
  5272. leeftijd = parseInt(prompt('Wat is je leeftijd?'));
  5273. if(leeftijd < 17) {
  5274. leerplichtig = true;
  5275. } else {
  5276. leerplichtig = false;
  5277. }
  5278. gediplomeerd = confirm('Heb je je diploma behaald?');
  5279. if(leerplichtig && !gediplomeerd) {
  5280. alert('Doorstuderen!');
  5281. }
  5282. if(!leerplichtig && !gediplomeerd) {
  5283. alert('Je bent niet leerplichtig EN niet gediplomeerd');
  5284. }
  5285. if(gediplomeerd || !leerplichtig) {
  5286. alert(
  5287. 'Je bent gediplomeerd OF niet leerplichtig OF allebei');
  5288. }
  5289. }
  5290. </script>
  5291. </body>
  5292. </html>
  5293. In bovenstand script voeren we met de if-opdracht drie verschillende testen uit.
  5294. Ten eerste testen we of de user leerplichtig is én niet gediplomeerd:
  5295. if(leerplichtig && !gediplomeerd)
  5296. Ten tweede testen we of de user niet leerplichtig is én niet gediplomeerd:
  5297. if(!leerplichtig && !gediplomeerd)
  5298. 166 2 JavaScript
  5299. Als laatste testen we of de user niet leerplichtig is óf een diploma heeft:
  5300. if(gediplomeerd || !leerplichtig)
  5301. Dit zijn drie verschillende if-opdrachten. Maar we kunnen in feite alle testen binnen één if-opdracht uitvoeren met de clausule else-if.
  5302. De clausule else if
  5303. De clausule else if is ook optioneel en geeft ons de mogelijkheid meerdere alternatieve beslissingen te testen. De syntaxis van de clausule else if is als volgt:
  5304. if (voorwaarde1) {
  5305. acties uit te voeren als voorwaarde1 true is;
  5306. }
  5307. else if (voorwaarde2) {
  5308. acties uit te voeren als voorwaarde2 true is;
  5309. }
  5310. else {
  5311. anders voer deze acties uit;
  5312. }
  5313. Figuur 2.16 Stroomdiagram van de clausule else if
  5314. • Opgave 55
  5315. Open een nieuw bestand en sla het op als if-else-opdracht.html en voeg de volgende if-else-if-opdracht eraan toe.
  5316. Bevestig of de user een creditcard heeft.
  5317. Bevestig of de leeftijd van de user boven de 18 is.
  5318. Als de user wel een creditcard heeft en ook boven de 18 is dan alert je: ‘Je mag 1000
  5319. euro lenen.’
  5320. 2.7 Beslissingsstructuren 167
  5321. Anders: als de user geen creditcard heeft en ook boven de 18 is dan alert je: ‘Je mag
  5322. 500 euro lenen.’
  5323. Anders alert je: ‘Je mag geen geld lenen.’
  5324. De ternary-operator (? : )
  5325. De ternary-operator is een verkorting van de if-opdracht. De ternary-operator
  5326. gebruik je bij if-opdrachten die kort en simpel te schrijven zijn. De syntaxis is als
  5327. volgt:
  5328. (voorwaarde ? resultaat als true: resultaat als false);
  5329. Na de voorwaarde komt een vraagteken (?). Daarna komt het resultaat als de voorwaarde waar (true) is. Dan volgt een dubbele punt (:). Daarna komt het resultaat
  5330. als de voorwaarde niet waar (false) is. Bijvoorbeeld:
  5331. <script>
  5332. var leeftijd = 18;
  5333. var leerplichtig = (leeftijf < 17 ? true: false);
  5334. </script>
  5335. Het resultaat van deze test is: leerplichtig = false
  5336. In de volgende opgave is het rapport voldoende:
  5337. <script>
  5338. var gemiddeld = 8;
  5339. var rapport = (gemiddeld >= 6 ? 'voldoende': 'onvoldoende');
  5340. </script>
  5341. • Opgave 56
  5342. Open een nieuw bestand en sla het op als ternary.html. Voeg de volgende ternaryoperator eraan toe:
  5343. Vraag de user naar zijn postcode.
  5344. Als de postcode gelijk is aan ‘1010ST’ toon je de volgende alertbox:
  5345. ‘Kans op de Nationale Postcode Loterij is 90.’
  5346. Anders toon je de alertbox:
  5347. ‘Kans op de Nationale Postcode Loterij is 0,069.’
  5348. • Lab 07
  5349. Open lab06.html en sla het op als lab07.html.
  5350. Maak een nieuwe variabele met de naam bezorgkosten = 15;
  5351. Vraag (‘prompt’) de gebruiker om zijn woonplaats.
  5352. Maak een nieuwe variabele met de naam woonplaats.
  5353. Maak een nieuwe variabele met de naam postcode.
  5354. Vraag (‘prompt’) de gebruiker om zijn postcode.
  5355. 168 2 JavaScript
  5356. Codeer de volgende if-opdracht:
  5357. Als de woonplaats Amsterdam is en de postcode ligt tussen 1000AA en 2000BB,
  5358. dan moet de user de volgende alertbox krijgen:
  5359. ‘U betaalt geen bezorgkosten’
  5360. en de variabele bezorgkosten moeten nul zijn.
  5361. Totaal te betalen moet totaal te betalen plus bezorgkosten zijn.
  5362. Als de woonplaats Amsterdam is en de postcode ligt tussen 1000AA en 2000BB,
  5363. dan betaalt de klant dus geen bezorgkosten.
  5364. Een mogelijk resultaat zie je hieronder:
  5365. Lab κρ
  5366. Factuur
  5367. Factuurdatum: dd-mm-jjjj
  5368. Betaaldatum: dd-mm-jjjj
  5369. Bedankt voor je bestelling: Jozef
  5370. Woonplaats ........Amsterdam
  5371. Postcode ............λκσκAC
  5372. Boekti tel .............JavaScript
  5373. Aantal te bestellen.... λκ
  5374. Prijs per boek.............μσ.σκ
  5375. Bedrag .......................μσσ.κκ
  5376. BTW......................... λρ.σξ
  5377. Bezorgkosten .............κ
  5378. Totaal inclusief BTW en bezorgkosten .....νλπ.σξ
  5379. Tip:
  5380. Gebruik de functies toLowerCase() en toUpperCase() om een string
  5381. om te zetten in hoofdletters of in kleine letters, bijvoorbeeld:
  5382. <script>
  5383. var stad = 'Amsterdam';
  5384. stad = stad.toLowerCase(); //resultaat is 'amsterdam'
  5385. stad = stad.toUpperCase(); //resultaat is 'AMSTERDAM'
  5386. </script>
  5387. 2.8 Stroomdiagrammen 169
  5388. 2.8 Stroomdiagrammen
  5389. In deze paragraaf maken we kennis met stroomdiagrammen:
  5390. Planning Inleveren
  5391. Opgave 57
  5392. Lab 08
  5393. Er zijn verschillende soort diagrammen die de communicatie tussen programmeurs en andere specialisten zoals informatieanalisten vereenvoudigen. Het eenvoudigste diagram is het stroomdiagram. De basiselementen van een stroomdiagram zie je in afbeelding 2.17.
  5394. Figuur 2.17 Basiselementen van het stroomdiagram
  5395. Er bestaat speciale software voor het maken van stroomdiagrammen, bijvoorbeeld
  5396. Visio of Word. In Word kun je bij Vormen kiezen voor Stroomdiagram.
  5397. • Opgave 57
  5398. Teken de volgende stappen in een stroomdiagram.
  5399. Is er sprake van een printerprobleem?
  5400. Is er sprake van een modemprobleem?
  5401. Als het een modemprobleem is, is het error E93?
  5402. Als het E93 is 1. Mogelijk vuiltje op het startoog
  5403. 2. Schakel de machine uit en blaas in het startoogje
  5404. Als het een modemprobleem, is het error E402?
  5405. Als het E402 is 1. Controleer of het aan-lampje brandt
  5406. 2. Schakel de machine uit en aan
  5407. 170 2 JavaScript
  5408. Als het een modemprobleem, is het error E405?
  5409. Als het E405 is 1. Is er sprake van een beschadiging?
  5410. 2. Reparatiekosten vallen buiten het contract
  5411. • Lab 08
  5412. In deze lab-opdracht codeer je een script volgens onderstaand stroomdiagram. Dit
  5413. script sla je op als lab08.html.
  5414. begin
  5415. maak een
  5416. vandaag Date Object
  5417. maak een
  5418. factuur Date Object
  5419. toon
  5420. datum vandaag
  5421. toon
  5422. factuurdatum
  5423. toon
  5424. betaaldatum
  5425. JA toon
  5426. “meld
  5427. incassobureau”
  5428. maak een
  5429. termijn Date Object
  5430. van 30 dagen
  5431. var betaaltijd =
  5432. (factuurdatum.getTime( ) +
  5433. termijn.getTime( ));
  5434. var betaaldatum = new
  5435. Date(betaaltijd);
  5436. stop
  5437. NEE
  5438. U hebt nog
  5439. resterende dagen
  5440. om te betalen
  5441. resterende dagen
  5442. uitrekenen
  5443. stop
  5444. Figuur 2.18 Stroomdiagram bij Lab 08
  5445. 2.9 Switch 171
  5446. Afhankelijk van de datum vandaag zal het resultaat er ongeveer zo uitzien:
  5447. Lab ς
  5448. Vandaag is: Mon Oct μς μκλν
  5449. factuurdatum is: Fri Oct λλ μκλν
  5450. betaaldatum is: Sun Nov λκ μκλν
  5451. U hebt nog: λμ dagen om te betalen
  5452. 2.9 Switch
  5453. In deze paragraaf maken we kennis met de switch-opdracht:
  5454. Planning Inleveren
  5455. Opgave 58
  5456. Lab 09
  5457. De opdracht switch is ook een beslissingsstructuur. Deze kan effi ciënter zijn dan de
  5458. opdracht if. We gebruiken de opdracht switch om te beslissen welk blok uit veel
  5459. blokken code moet worden uitgevoerd. De syntaxis van de opdracht switch is als
  5460. volgt:
  5461. switch(n) {
  5462. case 1:
  5463. acties uit te voeren als n==1
  5464. break;
  5465. case 2:
  5466. acties uit te voeren als n==2
  5467. break;
  5468. default:
  5469. acties uit te voeren als n anders is dan 1 en 2
  5470. }
  5471. Figuur 2.19 Stroomdiagram van de opdracht switch
  5472. 172 2 JavaScript
  5473. • Opgave 58
  5474. Open een nieuw bestaand en sla het op als switch-opdracht.html. Voeg de volgende code eraan toe.
  5475. <!DOCTYPE html>
  5476. <html lang="nl">
  5477. <head>
  5478. <meta http-equiv="Content-Type"
  5479. content="text/html;
  5480. charset=UTF-8">
  5481. <title>switch-opdrachten</title>
  5482. </head>
  5483. <body>
  5484. <script>
  5485. var datum=new Date();
  5486. var vandaag=datum.getDay();
  5487. var uur=datum.getHours();
  5488. document.write('Het is vandaag: ' + datum);
  5489. switch(vandaag) {
  5490. case 1:
  5491. document.write('maandag is mijn eerste stagedag');
  5492. break;
  5493. case 2:
  5494. document.write('dinsdag is mijn tweede stagedag');
  5495. break;
  5496. case 3:
  5497. document.write('woensdag is mijn JavaScriptdag');
  5498. break;
  5499. case 4:
  5500. document.write( 'donderdag is mijn werkdag');
  5501. break;
  5502. case 5:
  5503. document.write('vrijdag is mijn roostervrije dag');
  5504. break;
  5505. }
  5506. </script>
  5507. </body>
  5508. </html>
  5509. • Lab 09
  5510. Al je veel beslissingen of opties moet coderen met alleen de if-opdracht, eindig je
  5511. met if-opdrachten binnen if-opdrachten binnen nog meer if-opdrachten. Dan
  5512. wordt je code vrijwel onbegrijpelijk. Met de opdracht switch kunnen we op een
  5513. meer gestructureerde manier beslissingen of opties coderen.
  5514. In deze lab-opdracht codeer je een script volgens onderstaand stroomdiagram. Dit
  5515. script sla je op als lab09.html.
  5516. 2.10 Eigen functies 173
  5517. Figuur 2.20 Stroomdiagram bij Lab 09
  5518. 2.10 Eigen functies
  5519. In deze paragraaf maken we kennis met de volgende JavaScript-opdrachten en concepten:
  5520. • functies
  5521. • externe functies
  5522. • functieparameters
  5523. • scope van variabelen
  5524. Planning Inleveren
  5525. Opgaven 59 t/m 68
  5526. Lab 10
  5527. We hebben kennisgemaakt met een aantal methodes, bijvoorbeeld de methodes
  5528. voor het Array-object en het Date-object. Maar we kunnen ook onze eigen functies
  5529. coderen en hergebruiken. In deze paragraaf van hoofdstuk 2 leren we hoe we onze
  5530. eigen functies coderen.
  5531. 174 2 JavaScript
  5532. Functie of methode
  5533. Een methode is een functie binnen een object. Een eigen functie is code die een
  5534. specifi eke taak uitvoert. Eigen functies codeer je apart. Ze zijn dan leesbaarder en
  5535. je kunt ze hergebruiken wanneer je dezelfde taak moet uitvoeren. In JavaScript
  5536. declareer je een functie binnen de <script>-tag als volgt:
  5537. function functienaam ( input parameters ) {
  5538. acties uit te voeren;
  5539. return (output) // return is optioneel;
  5540. }
  5541. Figuur 2.21 Stroomdiagram van een functie
  5542. Nadat je een functie hebt gecodeerd en gedefi nieerd, kun je de functie aanroepen.
  5543. Een functie roep je als volgt a:
  5544. functienaam();
  5545. Of
  5546. functienaam(input-parameters);
  5547. Functie met input
  5548. Hier maken we een nieuwe functie met de naam print en de parameter input.
  5549. Dit is de syntaxis van de functie: print(input).
  5550. function print(input) {
  5551. document.write(input);
  5552. }
  5553. We hebben een nieuwe functie gedefi nieerd die een input-string verwacht om vervolgens de string op het beeldscherm weer te geven. Je zou voortaan deze functie
  5554. kunnen gebruiken in plaats van
  5555. document.write('String')
  5556. Dit kun je je als volgt voorstellen: de functie is als een zwarte doos. Je gooit wat input in de zwarte doos (input-parameter). De zwarte doos kan dan iets met de input
  5557. doen. De acties tussen de accolades worden binnen de zwarte doos uitgevoerd –
  5558. zie fi guur 2.22.
  5559. 2.10 Eigen functies 175
  5560. Figuur 2.22 Een functie met input
  5561. Functie met input en output
  5562. Hier volgt een voorbeeld van een functie met input en output. Deze functie gebruikt de input om een resultaat te genereren en vervolgens de output te leveren:
  5563. function verdubbelen(input) {
  5564. output = input*2;
  5565. return(output);
  5566. }
  5567. Figuur 2.23
  5568. Een functie aanroepen
  5569. Om een functie te gebruiken (‘aanroepen’) moet je de juiste syntaxis van de functie
  5570. gebruiken. De syntaxis van een functie is de functienaam plus de functieparameters tussen haakjes. De volgende functie verdubbelen heeft als input een getal nodig
  5571. of een variabele met een getalwaarde, bijvoorbeeld:
  5572. verdubbelen(10);
  5573. of
  5574. verdubbelen(variabele);
  5575. Figuur 2.24 Een functie aanroepen
  5576. • Opgave 59
  5577. Open een nieuw bestaand en sla het op als mijnfunctions.html. Voeg de volgende
  5578. code eraan toe.
  5579. <html lang="nl">
  5580. <head>
  5581. <meta http-equiv="Content-Type"
  5582. content="text/html;
  5583. charset=UTF-8">
  5584. <title>mijn functies</title>
  5585. 176 2 JavaScript
  5586. <!--dit script: werkt met functies
  5587. auteur: typ je eigen naam hier -->
  5588. <script>
  5589. function verdubbel(inputgetal) {
  5590. outputgetal = inputgetal * 2;
  5591. return(outputgetal);
  5592. }
  5593. </script>
  5594. </head>
  5595. <body>
  5596. <script>
  5597. mijngetal = prompt('Typ een getal in');
  5598. resultaat = verdubbel(mijngetal);
  5599. document.write('<br />Input-getal:' + mijngetal);
  5600. document.write('<br />Output-getal:' + resultaat);
  5601. </script>
  5602. </body>
  5603. </html>
  5604. • De functie verdubbel() wordt in JavaScript in de <body> als volgt opgeroepen:
  5605. verdubbel(mijngetal)
  5606. • De input is: mijngetal
  5607. • De functie verdubbel() in de <head>-sectie wordt als volgt uitgevoerd: functie
  5608. verdubbel(inputgetal)
  5609. • De input-parameter (inputgetal) wordt vervangen door de werkelijk input: mijngetal
  5610. • De functie voert de volgende acties uit:
  5611. outputgetal = inputgetal * 2
  5612. • De functie geeft als resultaat: return(outputgetal)
  5613. Het resultaat zou er als volgt uit kunnen zien:
  5614. Input-getal: ξξ
  5615. Output-getal: ςς
  5616. Externe functies
  5617. Je codeert een interne functie binnen een HTML-pagina. Maar je kunt ook een
  5618. externe functie in een extern JavaScript-bestand coderen. Zo kan een groot deel
  5619. van je programmacode buiten je webpagina blijven.
  5620. Een externe functie is ideaal wanneer je herbruikbare code wilt programmeren. Je
  5621. kunt vanuit je webpagina’s de externe functies oproepen.
  5622. LET OP
  5623. Het externe JavaScript-bestand mag geen HTML-tags hebben. Hieronder zie je een
  5624. voorbeeld van een extern JavaScript-bestand.
  5625. 2.10 Eigen functies 177
  5626. • Opgave 60
  5627. Zorg ervoor dat mijnfunctions.js er als volgt uitziet:
  5628. function afmelden() {
  5629. var antwoord = confirm('Wilt u zich afmelden?');
  5630. if(antwoord == true) {
  5631. alert('U wordt afgemeld!!!');
  5632. }
  5633. }
  5634. Figuur 2.25 Je herkent het mijnfunctions.js-bestand aan het js-pictogram.
  5635. De functie afmelden() genereert een confi rmbox met de vraag:
  5636. 'Wilt u zich afmelden?'
  5637. Het resultaat van de confi rmbox wordt bewaard in de variabele antwoord.
  5638. Als de waarde van de variabele antwoord true is, wordt een alertbox gegenereerd
  5639. met de volgende melding: 'U wordt afgemeld!!!'
  5640. De tag <script source>
  5641. Elke webpagina kan gelinkt worden met een extern .js-bestand door de tag <script
  5642. src="extern bestand.js">. Deze tag typ je binnen de <head>-sectie.
  5643. • Opgave 61
  5644. Open mijnfunctions.html en voeg de volgende <script>-tags in de <head>-sectie en
  5645. in de <body>-sectie eraan toe:
  5646. <html lang="nl">
  5647. <head>
  5648. <meta http-equiv="Content-Type"
  5649. content="text/html;
  5650. charset=UTF-8>
  5651. <title>mijn functies</title>
  5652. <script src="mijnfunctions.js"></script>
  5653. <script>
  5654. function verdubbel(inputgetal ) {
  5655. outputgetal = inputgetal * 2;
  5656. return(outputgetal);
  5657. }
  5658. </script>
  5659. </head>
  5660. <body>
  5661. <script>
  5662. mijngetal = prompt('Typ een getal in');
  5663. 178 2 JavaScript
  5664. resultaat = verdubbel(mijngetal);
  5665. document.write('<br>Input-getal:' + mijngetal);
  5666. document.write('<br>Output-getal:' + resultaat);
  5667. afmelden();
  5668. </script>
  5669. </body>
  5670. </html>
  5671. Hierboven hebben we vanuit de <head>-sectie een link naar het externe bestand
  5672. mijnfunctions.js gemaakt. In de <body>-sectie hebben we de functie afmelden()
  5673. vanuit het externe script opgeroepen. Het resultaat zie je hieronder.
  5674. Figuur 2.26
  5675. Deze twee boxes worden gegenereerd door de functie afmelden() in het externe
  5676. JavaScript (mijnfunctions.js).
  5677. • Opgave 62
  5678. Open mijnfunctions.js en voeg de volgende functionaliteit eraan toe.
  5679. Maak de nieuwe functie begroeten() aan met de volgende functionaliteit:
  5680. 1 Maak een Date()-object dat de systeemdatum genereert.
  5681. 2 Maak een variabele uur met de waarde van de methode getHours().
  5682. 3 Maak een if()-opdracht die het uur als volgt test:
  5683. – Als uur tussen 0 t/m 11 is, groet je: Goedemorgen!
  5684. – Anders als uur tussen 12 t/m 17 is, groet je: Goedemiddag!
  5685. – Anders groet je: Goedenavond!
  5686. Open mijnfunctions.html. Roep de functie begroeten() als volgt aan:
  5687. begroeten();
  5688. Het resultaat moet, afhankelijk van de tijd, een van de begroetingen zijn.
  5689. Input-getal: λλ
  5690. Output-getal: μμ
  5691. Goedemorgen!
  5692. 2.10 Eigen functies 179
  5693. • Opgave 63
  5694. Open het externe bestand mijnfunctions.js en codeer de volgende functie
  5695. dollarKoers() die de huidige dollarkoers voor een euro oplevert.
  5696. function dollarKkoers() {
  5697. return(1.36);
  5698. }
  5699. function euroKoers() {
  5700. return(0.74);
  5701. }
  5702. Open mijnfunctions.html en voeg de volgende document.write-opdrachten toe.
  5703. document.write('<br />De dollarkoers is ' + dollarKoers());
  5704. document.write('<br />De eurokoers is ' + euroKoers());
  5705. In dit geval wordt de binnenste functie dollarKoers() als eerste uitgevoerd. De opgeleverde waarde van de functie dollarKoers() wordt dan de input voor de buitenste functie document.write(). De functie geeft dan 1.36 weer.
  5706. De dollarkoers is λ.νπ
  5707. De eurokoers is κ.ρξ
  5708. • Opgave 64
  5709. Open het externe bestand mijnfunctions.js en codeer de volgende functie
  5710. dollar_naar_euro() die de conversie van dollars naar euro’s uitvoert.
  5711. function dollar_naar_euro(dollars) {
  5712. return(dollars * euroKoers());
  5713. }
  5714. Deze functie verwacht een getal als input-parameter. Dat getal representeert een
  5715. bedrag in dollars, bijvoorbeeld:
  5716. dollar_naar_euro(100)
  5717. De functie moet dit bedrag naar euro’s omzetten.
  5718. De functie zegt: als je me een bedrag in dollars geeft, vermenigvuldig ik dat bedrag
  5719. met de eurokoers en geef het resultaat.
  5720. Open mijnfunctions.html. Roep de functie dollar_to_euro() als volgt aan:
  5721. document.write(
  5722. '<br>100 dollar is ' + dollar_naar_euro(100) + ' euro\'s');
  5723. In de tweede regel wordt dollar_naar_euro(100) vervangen door 74.
  5724. In deze regel zie je het escapeteken \ binnen een string. Hiermee zeggen we dat het
  5725. (\')-teken niet het einde van de string is, maar dat het deel uitmaakt van de string.
  5726. 'euros\'s' wordt weergegeven als euro's
  5727. 180 2 JavaScript
  5728. Het resultaat moet er als volgt uitzien:
  5729. λκκ dollars is ρξ euro's
  5730. Functies met meerdere parameters
  5731. In de volgende opgave coderen we een nieuwe functie wissel(). Deze functie heeft
  5732. twee input-parameters: bedrag en valuta. De functie moet het bedrag van de aangegeven valuta wisselen.
  5733. • Opgave 65
  5734. Open het externe bestand mijnfunctions.js en codeer de volgende functie:
  5735. function wissel(bedrag, valuta) {
  5736. if(valuta == 'euro') {
  5737. return(bedrag * dollarKoers());
  5738. }
  5739. else if(valuta == 'dollar') {
  5740. return(bedrag * euroKoers());
  5741. }
  5742. }
  5743. Open mijnfunctions.html. Roep de functie wissel() als volgt aan:
  5744. document.write('<br>wissel 100 euro\'s in dollars: ' +
  5745. wissel(100,'euro'));
  5746. document.write('<br>wissel 20 dollars in euro\'s: ' +
  5747. wissel(20,'dollar'));
  5748. wissel λκκ euro’s in dollars: λνπ
  5749. wissel μκ dollars in euro’s: λξ.ς
  5750. Functies dynamisch uitvoeren
  5751. In de volgende opgave coderen we een formulier met een inputveld en een knop.
  5752. In het inputveld gaan we een bedrag intikken. Aan de knop koppelen we de functie
  5753. dollar_naar_euro(), zodat de functie wordt uitgevoerd als je op de knop klikt.
  5754. • Opgave 66
  5755. Open mijnfunctions.html en voeg het volgende formulier eraan toe:
  5756. <form name='form'>
  5757. <input type="text" name="bedrag" placeholder="bedrag" />
  5758. <input type= "button" value="converteren"
  5759. onclick="document.write('conversie in euros:' +
  5760. dollar_naar_euro(document.form.bedrag.value)) "/>
  5761. </form>
  5762. </body>
  5763. </html>
  5764. 2.10 Eigen functies 181
  5765. Het resultaat zie je hieronder:
  5766. Figuur 2.27
  5767. Scope van variabelen
  5768. Een globale variabele is een variabele die zichtbaar is binnen het hele JavaScript.
  5769. Dit noemen we de scope van de variabele. Dat betekent dat een globale variabele
  5770. overal in je script gewijzigd of gelezen kan worden. Een variabele is globaal wanneer je deze een waarde geeft, bijvoorbeeld:
  5771. variabeleNaam = 'globalscope';
  5772. Een lokale variabele is een variabele binnen een functie. Dit noemen we de scope
  5773. van de functie. Je mag dezelfde naam van een globale variabele binnen een functie
  5774. gebruiken als je vooraf het keyword var gebruikt, bijvoorbeeld:
  5775. function scope(){
  5776. // function scope
  5777. var variabeleNaam = 'localescope';
  5778. eersteKeer = 'globalescope';
  5779. }
  5780. In de functie is variabeleNaam een tweede variabele met een andere waarde.
  5781. LET OP
  5782. Als je een variabelenaam voor de eerste keer binnen een functie declareert dan
  5783. krijgt deze een globale scope.
  5784. • Opgave 67
  5785. Typ het volgende script en sla het op als scope.html.
  5786. <!DOCTYPE html>
  5787. <html lang="nl">
  5788. <head>
  5789. <meta http-equiv="Content-Type"
  5790. content="text/html;
  5791. charset=UTF-8" />
  5792. </head>
  5793. <body>
  5794. <script>
  5795. // Globale scope
  5796. scope = 'globaal';
  5797. bevolking = 1000;
  5798. document.write('<br>scope:'+scope + '<br>bevolking:'+ bevolking);
  5799. 182 2 JavaScript
  5800. function functionScope(){
  5801. // lokale scope
  5802. var scope = 'lokaal';
  5803. var lokaleBevolking = 10;
  5804. bevolking += lokaleBevolking;
  5805. forensen = 2;
  5806. document.write('<br>scope:'+scope + '<br>bevolking:'+ lokaleBevolking);
  5807. }
  5808. functionScope();
  5809. document.write('<br>scope:'+scope + '<br>bevolking:'+ bevolking);
  5810. document.write('<br>Als eerste benoemd in functie forensen:'+ forensen);
  5811. </script>
  5812. </body>
  5813. </html>
  5814. Het resultaat is:
  5815. scope:globaal
  5816. bevolking:λκκκ
  5817. scope:lokaal
  5818. bevolking:λκ
  5819. scope:globaal
  5820. bevolking:λκλκ
  5821. Als eerste benoemd in functi e forensen: μ
  5822. In het resultaat zien we dat:
  5823. • globale bevolking is 1000
  5824. • lokale bevolking is 10
  5825. • bevolking is globaal en opgeteld binnen de functie 1010
  5826. • forensen binnen de functie gedefi nieerd zonder var dus globaal
  5827. Samenvattend zeggen we dat de globale variabele bevolking zichtbaar is binnen
  5828. de scope van de functie, maar de lokale variabele lokaleBevolking onzichtbaar is
  5829. buiten de scope van de functie. Dit betekent dat lokaleBevolking buiten de functie
  5830. onzichtbaar, ongedefi nieerd en buiten scope is.
  5831. De array arguments[]
  5832. De array arguments[] is de array binnen een functie waar de input-parameters van
  5833. de functie worden opgeslagen. Als we een functie defi niëren, geven we de syntaxis
  5834. van de functie aan, bijvoorbeeld:
  5835. function bestelAuto(merk,klasse,kleur)
  5836. In dit geval zijn er drie input-parameters: (merk,klasse,kleur). Dit betekent dat we
  5837. maximaal drie input-parameters kunnen doorgeven. Deze parameters worden in
  5838. de array arguments[] als volgt opgeslagen:
  5839. 2.10 Eigen functies 183
  5840. arguments[0] = merk;
  5841. arguments[1] = klasse;
  5842. arguments[2] = kleur;
  5843. We kunnen binnen de functie bestelAuto() controleren welke parameters doorgegeven zijn. Bijvoorbeeld of er nul, een, twee of drie parameters zijn. Dit doen we als
  5844. volgt:
  5845. if(typeof arguments[0] === 'undefined'){
  5846. // gebruik default waarde
  5847. merk = 'Audi';
  5848. }
  5849. In deze if-opdracht controleren we of de eerste parameter is doorgegeven. Als dat
  5850. niet het geval is, zetten we de default waarde ‘Audi’ in merk.
  5851. • Opgave 68
  5852. Open scope.html en voeg de volgende code onderaan het script toe.
  5853. function bestelAuto(merk,klasse,kleur){
  5854. if(typeof arguments[0] === 'undefined'){
  5855. // gebruik default waarde
  5856. merk = 'Audi';
  5857. }
  5858. document.write(
  5859. 'Bestelde: een ' + merk + ' ' + klasse + ' in ' + kleur);
  5860. }
  5861. Codeer twee nieuwe if-opdrachten voor default waarden als volgt:
  5862. • default waarde voor voor klasse is C
  5863. • default waarde voor kleur is Rood
  5864. Test de if-opdrachten door de functie als volgt op te roepen:
  5865. bestelAuto();
  5866. bestelAuto('Porsche');
  5867. bestelAuto('Volvo', 'Klasse A');
  5868. bestelAuto('BMW', 'Klasse B', 'Blauw');
  5869. Het resultaat is:
  5870. Bestelde: een Audi Klasse C in Rood
  5871. Bestelde: een Porsche Klasse C in Rood
  5872. Bestelde: een Volvo Klasse A in Rood
  5873. Bestelde: een BMW Klasse B in Blauw
  5874. 184 2 JavaScript
  5875. • Lab 10
  5876. Maak een nieuw bestand lab 10.html met de volgende functionaliteit:
  5877. 1 Maak een formulier zoals te zien is in de volgende fi guur:
  5878. Figuur 2.28 Formulier in Lab 11
  5879. 2 Koppel de knop converteren aan de functie exchange() in het externe bestand mijnfunctions.js.
  5880. 3 Codeer de functie exchange() als volgt:
  5881. function exchange(bedrag, conversie) { . . . }
  5882. Zorg dat het bedrag wordt geconverteerd met een van de volgende koersen:
  5883. euro_dollarkoers = 1.36
  5884. dollar_eurokoers = 0.74
  5885. euro_roebelkoers = 48.40
  5886. roebel_eurokoers = 0.02
  5887. Het resultaat zou bijvoorbeeld het volgende kunnen zijn:
  5888. λκ roebel voor κ.μλ euro
  5889. 2.11 Lussen
  5890. In deze paragraaf oefenen we met de volgende lusstructuren.
  5891. • for()-lus
  5892. • for(in)-lus
  5893. • while()-lus
  5894. • do-while()-lus
  5895. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  5896. Planning Inleveren
  5897. Opgaven 69 t/m 73
  5898. Lab 11
  5899. 2.11 Lussen 185
  5900. Controlestructuren zoals de if-opdracht, de switch-opdracht en functies helpen
  5901. ons de volgorde van uitvoering van de instructies in een programma te bepalen.
  5902. Met lussen kunnen we blokken code herhalen, bijvoorbeeld als je een blok code
  5903. drie of meerdere keren wil laten uitvoeren. Er zijn verschillende lusstructuren.
  5904. De for()-lus
  5905. Met de for()-lus kun je een aantal keren hetzelfde blok instructies herhalen. Het
  5906. aantal keren dat een blok code wordt herhaald, controleren we met een controlevariabele. In de volgende voorbeelden is x onze controlevariabele. De syntaxis is als
  5907. volgt:
  5908. for() is de constructie van de lus {
  5909. body van de lus;
  5910. }
  5911. De constructie splitsen we in drie delen:
  5912. for(deel 1; deel 2; deel 3)
  5913. Bijvoorbeeld:
  5914. for(x=0; x<10; x++) {
  5915. body van de lus
  5916. }
  5917. In deel 1 maken we de controlevariabele, bijvoorbeeld: x=0
  5918. In deel 2 bepalen we de voorwaarde, bijvoorbeeld: x < 10
  5919. In deel 3 tellen we de controlevariabele op, bijvoorbeeld: x++
  5920. In de body van de for()-lus coderen we de acties die worden uitgevoerd zolang de
  5921. voorwaarde true is. Bijvoorbeeld:
  5922. for(x=0;x<6;x++) {
  5923. document.write(x);
  5924. }
  5925. Hier wordt de actie document.write(x) zes keer uitgevoerd en de controlevariabele x
  5926. zes keer opgeteld.
  5927. • Opgave 69
  5928. Open een nieuw bestand en sla het op als for-lus.html. Codeer het volgende script:
  5929. <!DOCTYPE html> <html lang="nl">
  5930. <head>
  5931. <meta http-equiv="Content-Type"
  5932. content="text/html;
  5933. charset=UTF-8">
  5934. <title>De for-lus</title>
  5935. <!--dit script: werkt met de for-lus -->
  5936. </head>
  5937. 186 2 JavaScript
  5938. <body>
  5939. <script>
  5940. for (x = 0; x < 3; x++){
  5941. document.write('Dit is lus: ' + x);
  5942. }
  5943. </script>
  5944. </body>
  5945. </html>
  5946. Het resultaat moet er zo uitzien:
  5947. Dit is lus: κ
  5948. Dit is lus: λ
  5949. Dit is lus: μ
  5950. De for()-lus herhaalt de functie write() drie keer. We hebben de lus als volgt geconstrueerd:
  5951. Deel 1: x=0 declareert de controlevariabele x en zet deze op 0.
  5952. Deel 2: x<3 is de voorwaarde. Zolang deze voorwaarde true is, wordt de lus herhaald. Als de voorwaarde false is, wordt de lus beëindigd.
  5953. Deel 3: x++ de variabele x wordt bij elke lus opgeteld.
  5954. De actie uit te voeren in de body van de lus is de volgende:
  5955. document.write( 'Dit is lus: ' + x );
  5956. Figuur 2.29 Stroomdiagram van de for()-lus
  5957. 2.11 Lussen 187
  5958. • Opgave 70
  5959. Open for-lus.html en voeg de volgende array en lus eraan toe:
  5960. var student = new Array(
  5961. 'Zakaria','Albert','Hamsa','Mike','Pieter','Harry');
  5962. for(x=0; x<student.length; x++) {
  5963. document.write('<br/>Element '+x+' is '+student[x]);
  5964. }
  5965. Hier gebruiken we de for()-lus om door de elementen van de array te
  5966. lopen. Het resultaat moet er als volgt uitzien:
  5967. Element κ is Zakaria
  5968. Element λ is Albert
  5969. Element μ is Hamsa
  5970. Element ν is Mike
  5971. Element ξ is Pieter
  5972. Element ο is Harry
  5973. De for-lus scant de array student[] als volgt:
  5974. – Bij de eerste lus krijgt var x de waarde 0, dus wordt student[0] weergegeven.
  5975. – Bij de tweede lus krijgt var x de waarde 1, dus wordt student[1] weergegeven, enzovoort – zolang de voorwaarde (x<6) true is.
  5976. – Na de zesde lus krijgt var x de waarde 6, dus de voorwaarde (x<6) is false. De
  5977. for()-lus wordt beëindigd.
  5978. • Opgave 71
  5979. Open for-lus.html en voeg de volgende for-lus eraan toe:
  5980. Codeer een for-lus die alleen de even elementen weergeeft.
  5981. Het resultaat moet er als volgt uitzien:
  5982. Element κ is Zakaria
  5983. Element μ is Hamsa
  5984. Element ξ is Pieter
  5985. De functie charAt()
  5986. Kijk eens naar de volgende functie:
  5987. charAt(index)
  5988. Deze functie scant een tekst en geeft als output het teken op positie x van een bepaalde tekst. De input index is een getal, de output is het teken op die positie in de
  5989. tekst. Een voorbeeld:
  5990. 188 2 JavaScript
  5991. tekst = 'JavaScript';
  5992. letter = tekst.charAt(0);
  5993. De variabele tekst kunnen we ons als volgt voorstellen:
  5994. [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
  5995. J a v a S c r i p t
  5996. Na het uitvoeren van deze regels heeft de variabele letter de waarde 'J'. Dit is het
  5997. teken op positie 0 van de tekst. Zo kunnen we vanaf alle posities van de tekst het
  5998. juiste teken halen. Bijvoorbeeld:
  5999. letter = tekst.charAt(1);
  6000. Na deze opdracht heeft de variabele letter de waarde ‘a’.
  6001. Het volgende script leest een tekst om vervolgens de spaties in de tekst op te tellen.
  6002. Hiervoor gebruiken we de for()-lus.
  6003. • Opgave 72
  6004. Open for-lus.html en voeg de volgende code eraan toe:
  6005. var tekst = 'Hij lijkt een beetje op Nelson Mandela.';
  6006. lengte = tekst.length;
  6007. spaties = 0;
  6008. document.write('<br>');
  6009. for(x=0; x<lengte; x++) {
  6010. teken = tekst.charAt(x);
  6011. document.write(teken);
  6012. if(teken == ' '){
  6013. spaties++;
  6014. }
  6015. }
  6016. document.write('<br>Tekst bevat ' + spaties + ' spaties');
  6017. </script>
  6018. </body>
  6019. </html>
  6020. Het resultaat moet er als volgt uitzien:
  6021. Hij lijkt een beetje op Nelson Mandela.
  6022. Tekst bevat π spati es
  6023. In dit script wordt de var tekst gedeclareerd met de volgende inhoud:
  6024. Hij lijkt een beetje op Nelson Mandela.
  6025. De var lengte krijgt de lengte (39) van de tekst en de variabele spaties is (0). De
  6026. voorwaarde voor de for()-lus is dat x kleiner moet zijn dan de lengte van de tekst
  6027. dus (x<lengte). Zo kan de for()-lus de hele tekst scannen.
  6028. 2.11 Lussen 189
  6029. Je zou de variabele tekst als de volgende array kunnen zien:
  6030. [0] [1] [2] [3] [4] [5] . . .
  6031. H i j l i . . .
  6032. Met behulp van de functie charAt(x) kijken we naar het teken op elke positie [x].
  6033. Als het teken gelijk is aan een spatie wordt de spatieteller spaties verhoogd. Aan
  6034. het einde van de lus geef je het resultaat weer.
  6035. • Opgave 73
  6036. Open for-lus.html en voeg de volgende code eraan toe zodat het script de tekens
  6037. a, e, i, o, u optelt en vervolgens het totale aantal verschillende klinkers in de tekst
  6038. weergeeft.
  6039. Het resultaat moet er als volgt uitzien:
  6040. Opgave ρν
  6041. Hij lijkt een beetje op Nelson Mandela.
  6042. Aantal a’s: μ
  6043. Aantal e’s: ρ
  6044. Aantal i’s: μ
  6045. Aantal o’s: μ
  6046. Aantal u’s: κ
  6047. • Lab 11
  6048. Open for-lus.html en voeg de volgende code eraan toe:
  6049. var getal = new Array();
  6050. getal[0] = 'nul';
  6051. getal[1] = 'een';
  6052. getal[2] = 'twee';
  6053. getal[3] = 'drie';
  6054. getal[4] = 'vier';
  6055. getal[5] = 'vijf';
  6056. getal[6] = 'zes';
  6057. getal[7] = 'zeven';
  6058. getal[8] = 'acht';
  6059. getal[9] = 'negen';
  6060. Voeg de volgende functionaliteit eraan toe:
  6061. – Vraag de gebruiker om zijn telefoonnummer.
  6062. – Geef vervolgens alle cijfers van het telefoonnummer weer als tekst.
  6063. Maak hiervoor een for-lus die het telefoonnummer scant.
  6064. Gebruik de getal-array om alle cijfers van het telefoonnummer te vertalen naar
  6065. tekst. Het resultaat moet er ongeveer als volgt uitzien:
  6066. 190 2 JavaScript
  6067. Figuur 2.30
  6068. Tip: Het telefoonnummer scan je met de for-lus. Gebruik de functie charAt() in de
  6069. for-lus om het juiste getal te vertalen door middel van de getal-array.
  6070. 2.12 De for(in)-lus
  6071. In deze paragraaf oefenen we met de for(in)-lus.
  6072. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  6073. Planning Inleveren
  6074. Opgaven 74 t/m 75
  6075. Lab 12
  6076. De for(in)-lus gebruiken we om de properties van een object te wijzigen. De syntaxis van de for(in)-lus is als volgt:
  6077. for(var property in array) {
  6078. acties met var property;
  6079. }
  6080. Bij de eerste lus krijgt property de naam van de eerste property. Bij de tweede lus
  6081. krijgt property de naam van de tweede property, enzovoort.
  6082. • Opgave 74
  6083. Openen een nieuw bestand en sla het op als for-in-lus.html. Voeg de volgende
  6084. code eraan toe:
  6085. <!DOCTYPE html> <html lang="nl">
  6086. <head>
  6087. <meta http-equiv="Content-Type"
  6088. content="text/html;
  6089. charset=UTF-8">
  6090. <title>for(in)-lus</title>
  6091. </head>
  6092. 2.12 De for(in)-lus 191
  6093. <body>
  6094. <script>
  6095. var laptops = new Array();
  6096. laptops['macbook'] =
  6097. {'model':'air', 'voorraad': 2000, 'prijs': 1090};
  6098. laptops['asusbook'] =
  6099. {'model':'wind' , 'voorraad': 1000,'prijs': 990};
  6100. laptops['dellbook'] =
  6101. {'model':'fire' , 'voorraad': 987,'prijs': 890};
  6102. for(var merk in laptops) {
  6103. document.write('<br>Merk: '+ merk);
  6104. }
  6105. </script>
  6106. </body>
  6107. </html>
  6108. Deze for(in)-lus loopt door alle properties van de array laptops[]. De properties
  6109. zijn: 'macbook', 'asusbook' en 'dellbook'. Het resultaat moet er als volgt uitzien:
  6110. Merk: macbook
  6111. Merk: asusbook
  6112. Merk: dellbook
  6113. • Opgave 75
  6114. We gaan nu hetzelfde doen met de properties van alle merken.
  6115. Open for-in-lus.html en voeg de volgende for(in)-lus eraan toe binnen de eerste
  6116. for(in)-lus:
  6117. for(var property in laptops[merk]) {
  6118. document.write(
  6119. '<br>'+property + ': ' + laptops[merk][property]);
  6120. }
  6121. Hier willen we alle properties van alle laptops zien. Het resultaat moet er als volgt
  6122. uitzien:
  6123. 192 2 JavaScript
  6124. Merk: macbook
  6125. model: air
  6126. voorraad: μκκκ
  6127. prijs: λκσκ
  6128. Merk: asusbook
  6129. model: wind
  6130. voorraad: λκκκ
  6131. prijs: σσκ
  6132. Merk: dellbook
  6133. model: fi re
  6134. voorraad: σςρ
  6135. prijs: ςσκ
  6136. • Lab 12
  6137. Zorg ervoor dat lab12.html er als volgt uitziet:
  6138. <!DOCTYPE html>
  6139. <html lang="nl">
  6140. <head>
  6141. <title>lab 12</title>
  6142. <!--
  6143. dit script: werkt met de for(in)-lus
  6144. -->
  6145. </head>
  6146. <body>
  6147. <script>
  6148. . . .
  6149. </script>
  6150. </body>
  6151. </html>
  6152. Codeer nu een for(in)-lus die alle properties van de array laptops weergeeft. Als de
  6153. voorraad onder de 1000 is dan dan toon je een waarschuwing zoals hieronder.
  6154. 2.13 De while()-lus 193
  6155. Merk: macbook
  6156. model:air
  6157. voorraad:μκκκ
  6158. prijs:λκσκ
  6159. Merk: asusbook
  6160. model:wind
  6161. voorraad:λκκκ
  6162. prijs:σσκ
  6163. Merk: dellbook
  6164. model:fi re
  6165. voorraad:σςρ---waarschuwing---
  6166. prijs:ςσκ
  6167. 2.13 De while()-lus
  6168. In deze paragraaf oefenen we met de volgende lusstructuren.
  6169. • while()-lus
  6170. • do-while()-lus
  6171. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  6172. Planning Inleveren
  6173. Opgaven 76 t/m 79
  6174. Lab 13
  6175. De while()-lus gebruik je net als de for()-lus om een blok instructies te herhalen.
  6176. Of het blok instructies wordt herhaald, bepaal je met een voorwaarde. Aan het einde van elke herhaling wordt gecontroleerd of nog steeds aan de voorwaarde wordt
  6177. voldaan. Als je de lus voortijdig wilt beëindigen, gebruik je de opdracht break. Als
  6178. je een bepaalde lus wilt overslaan, gebruik je de opdracht continue. De syntaxis van
  6179. de while()-lus is als volgt:
  6180. while(voorwaarde) {
  6181. acties;
  6182. // als je een lus wilt overslaan gebruik continue;
  6183. // als je de lus voortijdig wilt beëindigen gebruik break;
  6184. }
  6185. Het volgende script laat een voorbeeld zien van het gebruik van de while()-lus:
  6186. 194 2 JavaScript
  6187. • Opgave 76
  6188. Open een nieuw bestand en sla het op als while-lus.html. Codeer het volgende
  6189. script:
  6190. <!DOCTYPE html>
  6191. <html lang="nl">
  6192. <head>
  6193. <meta http-equiv="Content-Type"
  6194. content="text/html;
  6195. charset=UTF-8">
  6196. <title>while-lus</title>
  6197. <!--dit script: werkt met de while-lus -->
  6198. </head>
  6199. <body>
  6200. <script>
  6201. var vandaag = new Date();
  6202. var uur = vandaag.getHours();
  6203. var minuten = vandaag.getMinutes();
  6204. var seconden = vandaag.getSeconds();
  6205. var milliseconden = vandaag.getMilliseconds();
  6206. var lus = milliseconden;
  6207. var finish = lus + 3;
  6208. document.write('<br>while-lus begint om: ' +
  6209. uur + ':' + minuten + ':' + seconden+':'+ milliseconden);
  6210. while(lus < finish){
  6211. lus = new Date().getMilliseconds();
  6212. document.write('<br />Deze lus om: ' + lus);
  6213. }
  6214. document.write('<br />while-lus eindigt om: ' +
  6215. uur + ':' + minuten + ':' + seconden + ':' + lus);
  6216. </script>
  6217. </body>
  6218. </html>
  6219. Het resultaat is dat de lus loopt gedurende drie milliseconden:
  6220. 2.13 De while()-lus 195
  6221. while-lus begint om: λκ:νς:νπ:ςξρ
  6222. Deze lus om: ςξρ
  6223. Deze lus om: ςξρ
  6224. Deze lus om: ςξρ
  6225. Deze lus om: ςξρ
  6226. Deze lus om: ςξρ
  6227. Deze lus om: ςξρ
  6228. Deze lus om: ςξρ
  6229. Deze lus om: ςξς
  6230. Deze lus om: ςξς
  6231. Deze lus om: ςξς
  6232. Deze lus om: ςξς
  6233. Deze lus om: ςξς
  6234. Deze lus om: ςξς
  6235. Deze lus om: ςξς
  6236. Deze lus om: ςξσ
  6237. Deze lus om: ςξσ
  6238. Deze lus om: ςξσ
  6239. Deze lus om: ςξσ
  6240. Deze lus om: ςξσ
  6241. Deze lus om: ςξσ
  6242. Deze lus om: ςξσ
  6243. while-lus eindigt om: λκ:νς:νπ:ςοκ
  6244. • Opgave 77
  6245. Open while-lus.html. Zorg ervoor dat de while-lus de tweede milliseconde overslaat.
  6246. if(lus == milliseconden +1) {
  6247. continue;
  6248. }
  6249. Het resultaat moet er als volgt uitzien. In dit geval wordt milliseconde 848 overgeslagen.
  6250. 196 2 JavaScript
  6251. while-lus begint om: λκ:νς:νπ:ςξρ
  6252. Deze lus om: ςξρ
  6253. Deze lus om: ςξρ
  6254. Deze lus om: ςξρ
  6255. Deze lus om: ςξρ
  6256. Deze lus om: ςξρ
  6257. Deze lus om: ςξρ
  6258. Deze lus om: ςξρ
  6259. Deze lus om: ςξσ
  6260. Deze lus om: ςξσ
  6261. Deze lus om: ςξσ
  6262. Deze lus om: ςξσ
  6263. Deze lus om: ςξσ
  6264. Deze lus om: ςξσ
  6265. Deze lus om: ςξσ
  6266. while-lus eindigt om: λκ:νς:νπ:ςοκ
  6267. • Opgave 78
  6268. Open while-lus.html. Zorg ervoor dat de while-lus voortijdig wordt beëindigd na
  6269. twee milliseconden.
  6270. if(lus == milliseconden+2) {
  6271. document.write('<br>while-lus voortijdig beëindigd');
  6272. break;
  6273. }
  6274. Het resultaat moet er als volgt uitzien. In dit geval wordt de lus op milliseconde 167
  6275. doorlopen, milliseconde 168 wordt overgeslagen en op milliseconde 169 wordt de
  6276. lus voortijdig beëindigd.
  6277. while-lus begint om: λμ:ξκ:ξ:λπρ
  6278. Deze lus om: λπρ
  6279. Deze lus om: λπρ
  6280. Deze lus om: λπρ
  6281. Deze lus om: λπσ
  6282. while-lus voorti jdig beëindigd
  6283. while-lus eindigt om: λμ:ξκ:ξ:λπσ
  6284. De do-while()-lus
  6285. De do-while()-lus gebruik je net als de while()-lus, maar deze lus moet gegarandeerd minimaal één lus uitvoeren. In dit geval wordt de voorwaarde aan het einde
  6286. van elke lus gecontroleerd. De syntaxis is als volgt:
  6287. 2.14 Het Math-object 197
  6288. do{
  6289. acties;
  6290. } while (voorwaarde);
  6291. • Opgave 79
  6292. Open een nieuw bestand en sla het op als do-while-lus.html. Codeer het volgende
  6293. script:
  6294. <!DOCTYPE html>
  6295. <html lang="nl">
  6296. <head>
  6297. <meta http-equiv="Content-Type"
  6298. content="text/html;
  6299. charset=UTF-8">
  6300. <title>do-while-lus</title>
  6301. <!--dit script: werkt met de do-while-lus -->
  6302. </head>
  6303. <body>
  6304. <script>
  6305. lus = 0;
  6306. do{
  6307. document.write(‘<br>Dit is lus ‘ + ++lus);
  6308. doorgaan =
  6309. confirm(‘Wil je doorgaan?’);
  6310. } while (doorgaan);
  6311. </script>
  6312. </body>
  6313. </html>
  6314. • Lab 13
  6315. index = 0;
  6316. string1 = '1,2,3,4,5,6,8,9,0#';
  6317. string2 = '1,2,3#';
  6318. Codeer een do-while-lus die gebruikmaakt van de charAt()-methode om alle tekens
  6319. van een string weer te geven. De lus moet stoppen als het teken in de string gelijk
  6320. aan  is.
  6321. 2.14 Het Math-object
  6322. In deze paragraaf kijken we naar de volgende methodes van het Math-object. Math
  6323. is een object dus schrijven we dit met een hoofdletter M.
  6324. • abs(x)
  6325. • ceil(x)
  6326. • floor(x)
  6327. • max(x)
  6328. • min(x)
  6329. • random(x)
  6330. • round(x)
  6331. 198 2 JavaScript
  6332. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  6333. Planning Inleveren
  6334. Opgaven 80 t/m 83
  6335. Lab 14
  6336. Het Math-object is een ander soort object dan bijvoorbeeld het Date-object. We
  6337. maken een nieuw Date-object als volgt: date = new Date(). Het Math-object is een
  6338. singleton object, met statische properties en methodes, die we kunnen uitvoeren
  6339. zonder dat we een nieuw object aanmaken. Deze statische methodes en properties
  6340. zijn reeds gedefi nieerd in het Math-object en daarom hoeven we geen nieuw object
  6341. te creëren.
  6342. Math.abs(x)
  6343. De methode abs() van het Math-object geeft als resultaat de absolute waarde van
  6344. een getal. Bijvoorbeeld:
  6345. Math.abs('-1'); // retourneert 1
  6346. Math.abs(-2); // retourneert 2
  6347. Math.abs(null); // retourneert 0
  6348. Math.abs('string'); // retourneert NaN
  6349. Math.abs(); // retourneert NaN
  6350. NaN betekent not a number.
  6351. Math.ceil(x)
  6352. De methode ceil() retourneert de plafondwaarde van een getal (dat is de kleinste
  6353. integer gelijk aan of groter dan het getal), bijvoorbeeld:
  6354. Math.ceil(3); // retourneert 3
  6355. Math.ceil(3.3); // retourneert 4
  6356. Math.ceil(3.8); // retourneert 4
  6357. Math.ceil(4.5); // retourneert 5
  6358. Math.ceil(5.004); // retourneert 6
  6359. Math.fl oor(x)
  6360. De methode floor() retourneert de vloerwaarde van een getal (dat is de grootste
  6361. integer gelijk aan of kleiner dan het getal), bijvoorbeeld:
  6362. Math.floor(3); // retourneert 3
  6363. Math.floor(3.3); // retourneert 3
  6364. Math.floor(3.8); // retourneert 3
  6365. Math.floor(4.5); // retourneert 4
  6366. Math.floor(5.004); // retourneert 5
  6367. 2.14 Het Math-object 199
  6368. Math.max()
  6369. De methode max() retourneert het hoogste getal uit een groep getallen, bijvoorbeeld:
  6370. Math.max(3,6,8,5,3,2); // retourneert 8
  6371. • Opgave 80
  6372. Open een nieuw bestand en sla het op als math-object.html. Voeg de volgende
  6373. code eraan toe:
  6374. <!DOCTYPE html>
  6375. <html lang="nl">
  6376. <head>
  6377. <meta http-equiv="Content-Type"
  6378. content="text/html;
  6379. charset=UTF-8">
  6380. <title>Math-Object</title>
  6381. <!-- dit script: werkt met het Math-Object -->
  6382. </head>
  6383. <body>
  6384. <script>
  6385. var mijnArray = new Array(3.51,3.50,3.49,-3.55,-3.50,-3.49);
  6386. document.write('<br> Hoogste element in mijnArray is: '+
  6387. Math.max.apply(null, mijnArray));
  6388. </script>
  6389. </body>
  6390. </html>
  6391. Het resultaat zie je hieronder:
  6392. Hoogste element in mijnArray is: ν.ολ
  6393. Math.min()
  6394. De methode min() retourneert het laagste getal uit een groep getallen, bijvoorbeeld:
  6395. Math.min(3,6,8,5,3,2); // retourneert 2
  6396. • Opgave 81
  6397. Open math-object.html en voeg de min-methode eraan toe:
  6398. document.write('<br> Laagste element in mijnArray is: '+
  6399. Math.min.apply(null, mijnArray));
  6400. </script>
  6401. </body>
  6402. </html>
  6403. Het resultaat van deze opgave zie je hieronder:
  6404. 200 2 JavaScript
  6405. ...
  6406. Laagste element in mijnArray is: -ν.οο
  6407. Math.round()
  6408. De methode round() retourneert de afgeronde integerwaarde van het getal, bijvoorbeeld:
  6409. Math.round(3.51); // retourneert 4
  6410. Math.round(3.50); // retourneert 4
  6411. Math.round(3.49); // retourneert 3
  6412. Math.round(-3.55); // retourneert -4
  6413. Math.round(-3.50); // retourneert -3
  6414. Math.round(-3.49); // retourneert -3
  6415. • Opgave 82
  6416. Open math-object.html en voeg de round-methode eraan toe:
  6417. for(i=0; i < mijnArray.length; i++) {
  6418. mijnArray[i] = Math.round(mijnArray[i]);
  6419. }
  6420. document.write('<br />Afgeronde elementen: ' + mijnArray);
  6421. </script>
  6422. </body>
  6423. </html>
  6424. Het resultaat zie je hieronder:
  6425. Afgeronde elementen: ξ,ξ,ν,-ξ,-ν,-ν
  6426. Math.random()
  6427. De methode random() retourneert elke keer weer een willekeurige waarde tussen 0
  6428. en 1, inclusief 0, exclusief 1, bijvoorbeeld:
  6429. Math.random();
  6430. // retourneert bijvoorbeeld de willekeurige waarde 0.137040278683634
  6431. Math.random();
  6432. // retourneert een nieuwe willekeurig waarde 0.837040278683634
  6433. • Opgave 83
  6434. Open math-object.html en voeg de random-methode eraan toe:
  6435. document.write('<br>Vul mijnArray met willekeurige getallen');
  6436. for(x=0;x < mijnArray.length;x++) {
  6437. mijnArray[x] = Math.floor((Math.random()*10));
  6438. document.write('<br>' + mijnArray[x]);
  6439. }
  6440. 2.15 String-methodes 201
  6441. </script>
  6442. </body>
  6443. </html>
  6444. Het resultaat moet zoiets zijn als:
  6445. Vul mijnArray met willekeurige getallen
  6446. λ
  6447. κ
  6448. μ
  6449. π
  6450. σ
  6451. ν
  6452. • Lab 14
  6453. In deze lab-opdracht maak je eerst de array:
  6454. alfa = ['a','b','c', etc...];
  6455. Daarna codeer je de functie nieuwewoorden() die nieuwe woorden van vijf willekeurige letters verzint. Je krijgt combinaties zoals die hieronder te zien:
  6456. zelqv jgifa zuaky
  6457. 2.15 String-methodes
  6458. In deze paragraaf kijken we naar de volgende string-methodes:
  6459. • indexOf()
  6460. • length
  6461. • charAt()
  6462. • split()
  6463. • substring()
  6464. • substr()
  6465. • toLowerCase()
  6466. • toUpperCase()
  6467. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  6468. Planning Inleveren
  6469. Opgaven 84 t/m 92
  6470. Lab 15
  6471. 202 2 JavaScript
  6472. Je zou een tekst- of stringvariabele als een array kunnen zien. Het eerste teken van
  6473. de tekst is dan element [0], het tweede teken is dan element [1], enzovoort. JavaScript heeft een aantal ingebouwde methodes voor strings.
  6474. indexOf()
  6475. Een string is een tekenreeks oftewel een tekst. Elk teken heeft een index die de positie in de tekst aangeeft. De eerste positie is de nul-positie. De methode indexOf()
  6476. geeft de positie van een bepaald teken in de tekst. Als de letter niet gevonden
  6477. wordt, is het resultaat -1.
  6478. string = 'mijn tekst';
  6479. string.indexOf('k'); // retourneert 7
  6480. string.indexOf('a'); // retourneert -1
  6481. • Opgave 84
  6482. Open een nieuw bestand en sla het op als string-methodes.html. Codeer het volgende script:
  6483. <!DOCTYPE html>
  6484. <html lang="nl">
  6485. <head>
  6486. <meta http-equiv="Content-Type"
  6487. content="text/html;
  6488. charset=UTF-8">
  6489. <title>string-methods</title>
  6490. <!--dit script: gebruikt string methodes -->
  6491. </head>
  6492. <body>
  6493. <script>
  6494. var titel = 'javascript';
  6495. document.write('<br>Index van letter s is: ' +
  6496. titel.indexOf('s'));
  6497. </script>
  6498. </body>
  6499. </html>
  6500. In dit voorbeeld geeft de methode title.indexOf('s') de positie van de eerst voorkomende letter ‘s’ in de titel ‘javascript’, dus het getal 4.
  6501. Het resultaat zie je hieronder:
  6502. Index van lett er s is: ξ
  6503. We kunnen ook de positie van een woord in een tekst vinden. Dit doen we in de
  6504. volgende opgave.
  6505. 2.15 String-methodes 203
  6506. • Opgave 85
  6507. Open string-methodes.html en voeg de volgende code eraan toe:
  6508. var string =
  6509. "dit is een lange tekst met daarin het woord javascript";
  6510. In dit voorbeeld codeer je de methode die de positie van het woord javascript
  6511. teruggeeft. Zoek ook de positie van het woord HTML. Als het woord niet bestaat
  6512. dan is het resultaat -1.
  6513. Het resultaat van de opgave zie je hieronder:
  6514. Positi e van het woord javascript is: ξν
  6515. Positi e van het woord HTML is: -λ
  6516. In de volgende opgave gaan we testen wat de naam van de actieve browser is. We
  6517. kijken in de property userAgent van het object navigator en zoeken naar de volgende drie woorden:
  6518. MSIE
  6519. Firefox
  6520. Chrome
  6521. • Opgave 86
  6522. Open string-methodes.html en voeg de volgende code eraan toe:
  6523. if(navigator.userAgent.indexOf('MSIE') != -1) {
  6524. document.write('<br>Browser is Internet Explorer');
  6525. }
  6526. else if(navigator.userAgent.indexOf('Firefox') != -1) {
  6527. document.write('<br>Browser is Firefox');
  6528. }
  6529. else if(navigator.userAgent.indexOf('Chrome') != -1) {
  6530. document.write('<br>Browser is Google Chrome');
  6531. }
  6532. Het resultaat van de opgave uitgevoerd met de Firefox-browser zie je hieronder:
  6533. Browser is Firefox
  6534. In dit voorbeeld geeft de methode indexOf('MSIE') de positie van het woord MSIE
  6535. in de property userAgent van het object navigator. Als het resultaat -1 is, betekent
  6536. dit dat er geen positie is en dat MSIE niet werd gevonden en dus dat de browser niet
  6537. Internet Explorer is. Op dezelfde manier hebben we getest op de browsers Firefox
  6538. en Chrome.
  6539. 204 2 JavaScript
  6540. Length
  6541. De property length geeft de lengte van een string. In de volgende opgave gebruiken
  6542. we de property length van een string-object.
  6543. gebruiker = 'supergebruiker';
  6544. gebruiker.length // retourneert 14
  6545. • Opgave 87
  6546. Open string-methodes.html en voeg de volgende code eraan toe:
  6547. var titel = 'JavaScript';
  6548. Codeer een document.write-opdracht die de property length van de titel weergeeft.
  6549. Het resultaat moet het volgende zijn:
  6550. De lengte van ti tel is: λκ
  6551. charAt()
  6552. De methode charAt() geeft het teken op een bepaalde positie in de string. Bijvoorbeeld:
  6553. gebruiker = 'supergebruiker';
  6554. gebruiker.charAt(4) // retourneert r
  6555. • Opgave 88
  6556. Open string-methodes.html en voeg de volgende code eraan toe:
  6557. var title = 'JavaScript';
  6558. var spiegeling = ' '; for(x=0; x < title.length; x++) {
  6559. teken = title.charAt(x);
  6560. spiegeling = teken + spiegeling;
  6561. }
  6562. document.write('<br>JavaScript gespiegeld: ' + spiegeling);
  6563. In dit voorbeeld geeft de methode charAt(x) het teken op positie x. De for-lus leest
  6564. elk teken en maakt een nieuwe string in omgekeerde volgorde.
  6565. JavaScript gespiegeld: tpircSavaJ
  6566. split()
  6567. Met de methode split() kun je een lange string splitsen in kleinere strings. De
  6568. splitsing is gebaseerd op een teken, bijvoorbeeld een spatie of komma’s. De gesplitste strings worden in een array geplaatst.
  6569. 2.15 String-methodes 205
  6570. namen = 'Jozef, Jan, Umut';
  6571. array = namen.split(,);
  6572. // retourneert de volgende array:
  6573. array[0] = 'Jozef'; array[1] = 'Jan'; array[2] = 'Umut'
  6574. • Opgave 89
  6575. Open string-methodes.html en voeg de volgende code eraan toe:
  6576. var tekst =
  6577. 'dit is een lange tekst met daarin het woord javascript';
  6578. splitsing = tekst.split(' ');
  6579. document.write('<br>De resulterende array is: ' + splitsing);
  6580. In dit voorbeeld levert de methode split() de volgende array op:
  6581. splitsing[0] = 'dit';
  6582. splitsing[1] = 'is';
  6583. splitsing[2] = 'een';
  6584. splitsing[3] = 'lange';
  6585. splitsing[4] = 'tekst';
  6586. splitsing[5] = 'met';
  6587. splitsing[6] = 'daarin';
  6588. splitsing[7] = 'het';
  6589. splitsing[8] = 'woord';
  6590. splitsing[9] = 'javascript';
  6591. substring()
  6592. De methode substring() levert een deel van een string op. De substring is gebaseerd op een beginindex en een eindindex, bijvoorbeeld:
  6593. string = 'abcdefg';
  6594. string.substring(3,6) // retourneert 'defg'
  6595. Het resultaat hier is de substring die begint met beginindex [3] en eindigt met
  6596. eind index [6].
  6597. • Opgave 90
  6598. Open string-methodes.html en voeg de volgende code eraan toe:
  6599. var string =
  6600. 'dit is een lange string met daarin het woord javascript';
  6601. Codeer de substringmethode die de volgende substring vanuit de variabele string
  6602. retourneert:
  6603. Substring van string: lange string
  6604. 206 2 JavaScript
  6605. substr()
  6606. De methode substr() levert ook een deel van een string op. De substring is gebaseerd op een beginindex en een lengte, bijvoorbeeld:
  6607. gebruiker = 'supergebruiker';
  6608. gebruiker.substr(5,9) // retourneert 'gebruiker';
  6609. De methode levert de substring op beginnend met index [5] en lengte 9.
  6610. In de volgende opgave gebruiken we de methode substr om het woord javascript
  6611. uit de string te verwijderen.
  6612. • Opgave 91
  6613. Open string-methodes.html en voeg de volgende code eraan toe:
  6614. string = string.substr( 0,string.indexOf('javascript')) +
  6615. string.substr( string.indexOf('javascript')+10, string.length);
  6616. document.write('<br />String is nu: ' + string);
  6617. In dit geval gebruik je de methode indexOf() voor het bepalen van de beginpositie
  6618. van het woord javascript. Het resultaat zie je hieronder:
  6619. String is nu: dit is een lange string met daarin het woord
  6620. trim()
  6621. De methode trim() verwijdert alle spaties aan het begin en het eind van een string,
  6622. bijvoorbeeld:
  6623. tekst = ' JavaScript ';
  6624. tekst.trim() // retourneert 'JavaScript';
  6625. toLowerCase() en toUpperCase()
  6626. De methodes toLowerCase() en toUpperCase() veranderen een string in hoofdletters
  6627. of in kleine letters, bijvoorbeeld:
  6628. naam = 'Marlies' naam.toLowerCase() // retourneert marlies
  6629. naam.toUpperCase() // retourneert MARLIES
  6630. • Opgave 92
  6631. Open string-methodes.html en voeg de volgende code eraan toe:
  6632. var cursus = prompt('Kies een van de volgende '+
  6633. 'cursussen HTML of JavaScript');
  6634. if (cursus.toLowerCase() == 'html' ||
  6635. cursus.toLowerCase() == 'javascript') {
  6636. document.write('<br>Je hebt: '+cursus.toUpperCase()+' gekozen.');
  6637. } else {
  6638. document.write('<br />Kies een geldige cursus');
  6639. }
  6640. 2.16 Algoritmes 207
  6641. In deze opgave gebruiken we de methode toLowerCase() om de invoer van de gebruiker te wijzigen in kleine letters. Het maakt zo niet uit wat de gebruiker typt:
  6642. JavaScript, javascript, JAVAscript, HTML of Html, cursus.toUpperCase() zet de
  6643. invoer altijd om in hoofdletters: JAVASCRIPT of HTML.
  6644. • Lab 15
  6645. Bij lab15.html codeer je de functie:
  6646. vervangen(docum, woord, nieuwewoord)
  6647. Deze functie zoekt een woord in een tekst en vervangt die door het nieuwewoord.
  6648. tekst = 'Dit document is een lang document maar ook een simpel document';
  6649. function vervangen(tekst,woord,nieuwewoord) {
  6650. . . .
  6651. }
  6652. resultaat = vervangen(tekst,'document','script');
  6653. document.write(resultaat);
  6654. Op de puntjes codeer je de functie.
  6655. Figuur 2.31
  6656. In het resultaat hebben we het woord document vervangen door script.
  6657. Dit script is een lang script maar ook een simpel script
  6658. 2.16 Algoritmes
  6659. In deze paragraaf kijken we naar algoritmes.
  6660. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  6661. Planning Inleveren
  6662. Opgaven 93 t/m 95
  6663. Lab 16
  6664. Een algoritme is:
  6665. Een set instructies of een lijst van stappen in een bepaalde volgorde binnen een
  6666. computerprogramma om een specifi ek probleem op te lossen.
  6667. 208 2 JavaScript
  6668. Deze problemen kunnen van simpel tot zeer complex zijn. Dankzij algoritmes nemen computers besluiten voor ons. Goede algoritmes vormen vaak de basis van
  6669. een effi ciënt computerprogramma. Een klassiek voorbeeld van een algoritme in de
  6670. informatica is het algoritme binary-search.
  6671. Het algoritme binary-search
  6672. Het algoritme binary-search is een algoritme dat nauwkeurig de stappen beschrijft
  6673. die uitgevoerd moeten worden om een zoekopdracht op te lossen.
  6674. In de informatica vindt binary-search de positie van een specifi eke inputwaarde
  6675. (de zoeksleutel) binnen een geïndexeerde array [0][1][2]... Het algoritme werkt als
  6676. volgt:
  6677. 1 Het algoritme vergelijkt de zoeksleutel met de middel-index in de array.
  6678. 2 Als de zoeksleutel en de middel-index overeenkomen, dan is het element gevonden
  6679. en de waarde geretourneerd.
  6680. 3 Als de zoeksleutel kleiner is dan de middel-index, wordt de array gelijk gesteld aan
  6681. de eerste helft van de array. Stap 1 wordt herhaald met de eerste helft van de array.
  6682. 4 Als de zoeksleutel groter is dan de middel-index, wordt de array gelijk gesteld aan
  6683. de tweede helft van de array. Stap 1 wordt herhaald met de tweede helft van de
  6684. array.
  6685. 5 Als de array leeg is wordt ‘Sleutel niet gevonden’ geretourneerd.
  6686. Een binary-search halveert het aantal te doorzoeken elementen bij elke herhaling,
  6687. zodat het vinden van een element veel minder tijd kost dan als je van voren af de
  6688. hele array doorzoekt.
  6689. Een voorbeeld
  6690. Stel je voor dat je op zoek bent naar sleutel 16 in een array. Dan moet het algoritme
  6691. de volgende stappen uitvoeren (zie fi guur 2.32):
  6692. 1 Vergelijk de sleutel [16] met de middel-index.
  6693. 2 Als de sleutels overeenkomen is het element gevonden en wordt de waarde geretourneerd.
  6694. 3. Als de sleutel kleiner is dan de middel-index dan geldt: sub-array = eerste helft van
  6695. de array. Herhaal stap 1 met de sub-array (eerste helft).
  6696. 4. Als de sleutel groter is dan de middel-index dan geldt: sub-array = tweede helft van
  6697. de array. Herhaal stap 1 met de sub-array (tweede helft).
  6698. 5. Als de sub-array leeg is, wordt ‘Sleutel niet gevonden’ geretourneerd.
  6699. In de volgende fi guur zie je dat het algoritme 4 keer wordt herhaald voordat de
  6700. sleutel [16] gevonden is.
  6701. 2.16 Algoritmes 209
  6702. Figuur 2.32
  6703. Pseudocode
  6704. Als je een complex algoritme gaat coderen, is het soms handig om eerst met
  6705. pseudo code te beginnen. Pseudocode is nog geen programma, maar geeft in grote
  6706. lijnen aan wat er moet gebeuren. Hier volgt een voorbeeld van een pseudocode
  6707. voor het algoritme binary-search:
  6708. BinarySearch(array, key, beginIndex, eindIndex)
  6709. if beginIndex > eindIndex
  6710. then
  6711. return NIET _ GEVONDEN
  6712. else
  6713. middenIndex = (beginIndex+eindIndex) / 2
  6714. if key = middenIndex
  6715. then
  6716. return array[middenIndex]
  6717. else if key < middenIndex
  6718. then
  6719. return BinarySearch(array, key, beginIndex, middenIndex –1)
  6720. else
  6721. return BinarySearch(array, key, middenIndex+1, eindIndex)
  6722. Pseudocode kunnen we naar alle programmeertalen vertalen. In de volgende opgave vertalen we de pseudocode naar JavaScript.
  6723. • Opgave 93
  6724. Open een nieuw bestand en sla het op als binary-search.html. Voeg de volgende
  6725. code eraan toe:
  6726. <!DOCTYPE html> <html lang="nl">
  6727. <head>
  6728. <meta http-equiv="Content-Type"
  6729. content="text/html;
  6730. charset=UTF-8">
  6731. <title>Binary-search</title>
  6732. </head>
  6733. 210 2 JavaScript
  6734. <body>
  6735. <script>
  6736. var studenten = new Array(16);
  6737. studenten[0] = {'naam':'Navajo', '06':'1234567800'};
  6738. studenten[1] = {'naam':'Zakaria', '06':'1234567801'};
  6739. studenten[2] = {'naam':'Hamsa', '06':'1234567802'};
  6740. studenten[3] = {'naam':'Guus', '06':'1234567803'};
  6741. studenten[4] = {'naam':'Mitchel', '06':'1234567804'};
  6742. studenten[5] = {'naam':'Jan', '06':'1234567805'};
  6743. studenten[6] = {'naam':'Idris', '06':'1234567806'};
  6744. studenten[7] = {'naam':'Kees', '06':'1234567807'};
  6745. studenten[8] = {'naam':'Umut', '06':'1234567808'};
  6746. studenten[9] = {'naam':'Charles', '06':'1234567809'};
  6747. studenten[10] = {'naam':'Pedro', '06':'1234567810'};
  6748. studenten[11] = {'naam':'Joshua', '06':'1234567811'};
  6749. studenten[12] = {'naam':'Angelo', '06':'1234567812'};
  6750. studenten[13] = {'naam':'Peter', '06':'1234567813'};
  6751. studenten[14] = {'naam':'Audi', '06':'1234567814'};
  6752. studenten[15] = {'naam':'Arnold', '06':'1234567815'};
  6753. function zoekalgoritme(studenten, key, imin, imax) {
  6754. // test of array leeg is
  6755. if (imax < imin){
  6756. // array is leeg
  6757. return('Niet gevonden');
  6758. } else {
  6759. imid= Math.ceil(imin + ((imax - imin) / 2));
  6760. // vergelijken
  6761. if (imid > key){
  6762. // zoek in onderste sub-array
  6763. document.write('<br>onderste imin: ' + imin);
  6764. document.write('<br>onderste imid: '+imid);
  6765. return(zoekalgoritme(studenten, key, imin, imid-1));
  6766. }
  6767. else if (imid < key) {
  6768. // zoek in bovenste sub-array
  6769. document.write('<br>bovenste imax: ' + imax);
  6770. ocument.write('<br />bovenste imid: ' + imid);
  6771. return(zoekalgoritme(studenten, key, imid+1, imax));
  6772. } else {
  6773. // key is gevonden
  6774. return(studenten[imid]['naam']+studenten[imid]['06']);
  6775. }
  6776. }
  6777. }
  6778. var id = parseInt(prompt('Zoek student ID'));
  6779. var eindindex = studenten.length;
  6780. document.write('eindindex: '+eindindex + '<br>');
  6781. var beginindex = 0;
  6782. var student=zoekalgoritme(studenten,id,beginindex,eindindex);
  6783. document.write('<br>Student gevonden: ' + student);
  6784. </script>
  6785. </body>
  6786. </html>
  6787. 2.16 Algoritmes 211
  6788. • Opgave 94
  6789. Schrijf een algoritme dat een piramide weergeeft. Als bijvoorbeeld het inputgetal 9
  6790. is, dan genereert het algoritme een piramide zoals hieronder.
  6791. 0
  6792. 01
  6793. 012
  6794. 0123
  6795. 01234
  6796. 012345
  6797. 0123456
  6798. 01234567
  6799. 012345678
  6800. Hieronder schrijven we de pseudocode voor het algoritme:
  6801. Voer array lengte in.
  6802. Lees lengte.
  6803. Maak array(lengte).
  6804. Array invullen als volgt:
  6805. for(i=0; 1<=lengte;i++)
  6806. array[i]=i
  6807. Voor elke rij
  6808. write-elementen [0] t/m [rij – 1]
  6809. Open een nieuw bestand en sla het op als opgave94.html. Schrijf het volgende
  6810. script dat gebaseerd is op bovenstaand algoritme.
  6811. <!DOCTYPE html>
  6812. <html lang="nl">
  6813. <head>
  6814. <meta http-equiv="Content-Type"
  6815. content="text/html; charset=UTF-8">
  6816. <title>Opgave 94</title>
  6817. </head>
  6818. <body>
  6819. <script>
  6820. var lengte = parseInt(prompt('Voer een getal in:'));
  6821. piramide = new Array(lengte);
  6822. for(var i = 0; i <=lengte; i++) {
  6823. piramide[i]= i;
  6824. }
  6825. document.write(piramide);
  6826. for(var rij=1; rij <= lengte; rij++) {
  6827. document.write('<br />');
  6828. for (var i = 0; i < rij; i++) {
  6829. document.write(piramide[i]);
  6830. }
  6831. }
  6832. </script>
  6833. </body>
  6834. </html>
  6835. 212 2 JavaScript
  6836. • Opgave 95
  6837. Schrijf een algoritme dat een piramide weergeeft. Als bijvoorbeeld het inputgetal
  6838. 10 is, dan genereert het algoritme een piramide zoals hieronder.
  6839. 0123456789
  6840. 012345678
  6841. 01234567
  6842. 0123456
  6843. 012345
  6844. 01234
  6845. 0123
  6846. 012
  6847. 01
  6848. 0
  6849. • Lab 16 Kalenderalgoritme
  6850. In deze lab-opdracht codeer je het volgende kalenderalgoritme.
  6851. Vraag de user naar de maand.
  6852. Vraag de user naar het jaar.
  6853. Maak een datumobject van jaar, maand en eerste dag.
  6854. Wat is de weekdag van de eerste dag van de maand? (zo, ma, ...)
  6855. Hoeveel dagen heeft de maand? (28,30,31...)
  6856. Geef lege <div>-elementen weer per weekdag vóór de eerste weekdag.
  6857. Geef elke dag van de maand in een <div>-element weer.
  6858. Het resultaat moet er als volgt uitzien:
  6859. Figuur 2.33
  6860. 2.17 Het Document Object Model 213
  6861. 2.17 Het Document Object Model
  6862. In deze paragraaf kijken we naar het Document Object Model.
  6863. • getelementById
  6864. • setTimeout
  6865. • clearTimeout
  6866. • mouse-events
  6867. • form-events
  6868. • keyboard-events
  6869. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  6870. Planning Inleveren
  6871. Opgaven 96 t/m 114
  6872. Lab 17
  6873. Het Document Object Model (afgekort tot DOM) is een model voor het benaderen
  6874. van gestructureerde documenten zoals een HTML-document. Met JavaScript kun
  6875. je alle objecten die geassocieerd zijn met je webpagina benaderen en manipuleren.
  6876. Om een bepaald object te benaderen, moet je een documenthiërarchie doorlopen
  6877. (zie fi guur 2.34).
  6878. Figuur 2.34 Hiërarchie van objecten in een formulier
  6879. Om bijvoorbeeld de textarea (het tekstveld) in fi guur 2.34 te benaderen, loop je de
  6880. volgende hiërarchie door:
  6881. window.document.div.form.textarea
  6882. 214 2 JavaScript
  6883. getElementById
  6884. Een andere manier om HTML-elementen vanuit JavaScript te benaderen is via het
  6885. id-attribuut van het element. Dat doen we met:
  6886. getElementById()
  6887. Met de opdracht getElementById kun je de attributen van een element wijzigen. Stel
  6888. je hebt bijvoorbeeld een <img>-element als volgt in je webpagina gecodeerd:
  6889. <img id="image" src="afbeelding.jpg" />
  6890. Dan kun je het element met getElementById als volgt manipuleren:
  6891. document.getElementById('image').src = 'image.jpg';
  6892. Eerst benaderen we het <img>-element door gebruik te maken van het id-attribuut
  6893. id="image". Daarna wijzigen we het src-attribuut. Hiermee hebben we aan het
  6894. <img>-element een nieuwe afbeelding toegewezen. Het was src="afbeelding.jpg" en
  6895. het is src = 'image.jpg' geworden.
  6896. DOM-events (gebeurtenis)
  6897. Een voorbeeld van een event is wanneer door een gebruiker op een knop wordt
  6898. geklikt, of als de waarde van een veld verandert. In JavaScript kunnen we acties
  6899. programmeren en deze acties kunnen we koppelen aan events. Zodra een bepaald
  6900. event zich voordoet, worden de gekoppelde acties uitgevoerd. Hieronder zie je een
  6901. lijst met de verschillende DOM-events:
  6902. • window-events
  6903. • form-events
  6904. • keyboard-events
  6905. • mouse-events
  6906. In de volgende paragrafen oefenen we met de verschillende DOM-events. We beginnen met de window-events.
  6907. Window-events
  6908. Window-events zijn events op het niveau van het browservenster of het document.
  6909. Hieronder zien we de event-naam en wanneer het event wordt getriggerd of geactiveerd.
  6910. Event Betekenis
  6911. onload Het javascript wordt geladen
  6912. onunload Het javascript wordt ontladen
  6913. Je vangt window-events op in de <body>-tag. Bijvoorbeeld:
  6914. <body onload="alert('JavaScript wordt geladen')">
  6915. 2.17 Het Document Object Model 215
  6916. Dit is weer een voorbeeld van JavaScript binnen een HTML-tag.
  6917. In de volgende opgave coderen we de functie showklok() en koppelen we de functie
  6918. aan het onload-event:
  6919. <body onload="showklok();">
  6920. • Opgave 96
  6921. Open een nieuw bestand en sla het op als dom-events.html. Voeg de volgende
  6922. code eraan toe:
  6923. <!DOCTYPE html>
  6924. <html lang="nl">
  6925. <head>
  6926. <meta http-equiv="Content-Type"
  6927. content="text/html;
  6928. charset=UTF-8">
  6929. <title>DOM events</title>
  6930. <script src="dom-events.js"></script>
  6931. <script>
  6932. document.write('<form name="klok"> ' + '<input type="text" ' +
  6933. 'name="display" '+ 'size="8" '+
  6934. 'style="backgroundColor: #30CE28; font-size: 44px" >' + '</form>');
  6935. var nu = new Date();
  6936. var uur = nu.getHours();
  6937. var min = nu.getMinutes();
  6938. var alterneren = 0;
  6939. function showklok() {
  6940. min=((min < 10) ? '0': '') + min;
  6941. if(alterneren) {
  6942. document.klok.display.value=uur + ':' + min;
  6943. alterneren = 0;
  6944. } else {
  6945. document.klok.display.value=uur + ' ' + min;
  6946. alterneren = 1;
  6947. }
  6948. nu = new Date(); uur = nu.getHours(); min = nu.getMinutes();
  6949. setTimeout('showklok()',1000);
  6950. }
  6951. </script>
  6952. </head>
  6953. <body onload="showklok();">
  6954. </body>
  6955. </html>
  6956. De functie setTimeout()
  6957. De functie setTimeout() voert steeds, na een aangegeven aantal milliseconden, een
  6958. actie (of je eigen functie) uit. Deze functie heeft twee input-parameters nodig: de
  6959. functienaam en het aantal milliseconden voor het herhaaldelijke uitvoeren van de
  6960. functie:
  6961. setTimeout('functienaam',milliseconden);
  6962. 216 2 JavaScript
  6963. In bovenstaande opgave hebben we de functie showklok() getriggerd met het onload-event van de <body>-tag. Daarna hebben we, binnen deze functie showklok(),
  6964. dezelfde functie iedere seconde getriggerd.
  6965. Het resultaat van deze opgave zie je hieronder.
  6966. Figuur 2.35 Resultaat van de functie showklok()
  6967. De functie clearTimeout()
  6968. Om een timerfunctie te stoppen, gebruiken we de functie clearTimeout():
  6969. clearTimeout(functienaam);
  6970. • Opgave 97
  6971. Open dom-events.html en zorg ervoor dat je klok ook seconden weergeeft. Het
  6972. resultaat moet er als volgt uitzien:
  6973. Figuur 2.36 Resultaat van opgave 97
  6974. • Opgave 98
  6975. Open dom-events.html en voeg binnen het <body>-element het volgende <div>-
  6976. element eraan toe:
  6977. <body onLoad="showKlok();">
  6978. <div>
  6979. <a href="Javascript: showMedia();">
  6980. <img src="ipad.jpg" id="media" /> </a>
  6981. </div>
  6982. </body>
  6983. </html>
  6984. • Opgave 99
  6985. Open een nieuw bestand en sla het op als dom-events.js. Voeg de volgende code
  6986. eraan toe:
  6987. // Globale variabelen
  6988. var afbeeldingen = new Array('galaxy-s4.png','ipad.jpg','laptop.jpg');
  6989. var max = afbeeldingen.length;
  6990. var randomIndex=0;
  6991. function showMedia() {
  6992. randomIndex = Math.floor((Math.random() * max));
  6993. document.getElementById('media').src = afbeeldingen[randomIndex];
  6994. }
  6995. 2.17 Het Document Object Model 217
  6996. Het resultaat moet er als volgt uitzien:
  6997. Figuur 2.37 Resultaat van opgave 99
  6998. • Opgave 100
  6999. Open dom-events.js en zorg ervoor dat de functie showMedia() zichzelf om de
  7000. 500 milliseconden herhaalt. Het resultaat moet zijn dat na een klik op de afbeelding om de 500 milliseconden een nieuwe afbeelding wordt vertoond.
  7001. Mouse-events
  7002. Je vangt een mouse-event op tijdens het bewegen van de muis.
  7003. Bijvoorbeeld:
  7004. <img src="beeld1.jpg" onmouseover="mijnfunctie()" >
  7005. Hieronder volgt een tabel met de meeste voorkomende mouse-events:
  7006. Event Betekenis
  7007. onclick op een element wordt geklikt
  7008. onmouseup de muisknop wordt losgelaten
  7009. onmousedown de muisknop wordt ingedrukt
  7010. onmousemove de muis beweegt
  7011. onmouseout de muis beweegt weg van een element
  7012. onmouseover de muis beweegt over een element
  7013. In de volgende opgave vangen we de events mouseover en mouseout op met acties op
  7014. een afbeelding.
  7015. • Opgave 101
  7016. Open dom-events.html en voeg de volgende mouse-events eraan toe:
  7017. <img src="ipad.jpg" id="media"
  7018. onmouseover="this.width=this.width*1.5"
  7019. onmouseout="this.width=this.width/1.5" />
  7020. Het resultaat moet zijn dat wanneer je met de muis over de afbeelding beweegt de
  7021. afbeelding groter wordt; als je met de muis van de afbeelding af beweegt wordt de
  7022. afbeelding kleiner.
  7023. 218 2 JavaScript
  7024. Form-events
  7025. Form-events zijn events die plaatsvinden binnen formulier-elementen. Hieronder
  7026. volgt een tabel met de meest voorkomende form-events. In een formulier is het
  7027. inputvakje dat je invult in focus, de anderen zijn buiten focus.
  7028. Event Betekenis
  7029. onchange een element is gewijzigd
  7030. onblur een element raakt buiten focus
  7031. onfocus een element heeft de focus
  7032. onselect een element is geselecteerd
  7033. onsubmit het formulier is verstuurd
  7034. onreset het formulier is gereset
  7035. Bij de volgende opgaven gebruiken we onderstaand formulier. We zullen zien hoe
  7036. we iedere ingevulde waarde in het formulier kunnen benaderen en controleren.
  7037. • Opgave 102
  7038. Open dom-events.html en voeg het volgende formulier eraan toe:
  7039. Figuur 2.38 Een formulier met DOM-elementen
  7040. Je vangt form-events op in de <form>-tag. Bijvoorbeeld:
  7041. <form onsubmit="mijnfunctie()" name="custform" method="POST">
  7042. of
  7043. <input type="text" onchange="mijnfunctie()" name="leeftijd">
  7044. 2.17 Het Document Object Model 219
  7045. • Opgave 103
  7046. Open dom-events.html en herschrijf de radio-buttons als volgt.
  7047. Voeg het volgende onchange-event eraan toe.
  7048. <label for="man">Man: </label>
  7049. <input type="radio" name="geslacht" id="man" value="m"
  7050. onchange="
  7051. if(document.custform.man.checked == true) {
  7052. alert('Welkom meneer!');
  7053. }" />
  7054. <label for="vrouw">Vrouw: </label>
  7055. <input type="radio" name="geslacht" id="vrouw" value="v"
  7056. onchange="
  7057. if(document.custform.vrouw.checked == true) {
  7058. alert('Welkom mevrouw!');
  7059. }" />
  7060. In bovenstaande opgave hebben we een welkomstbericht vertoond gebaseerd op
  7061. het geslacht van de user.
  7062. • Opgave 104
  7063. Open dom-events.html en herschrijf het leeftijd-element als volgt:
  7064. Voeg het volgende onchange-event eraan toe.
  7065. Wanneer de leeftijd verandert en als de leeftijd onder de 17 is, dan alert je: ‘Je bent
  7066. leerplichtig!’
  7067. Hier controleren we of het veld <input required type="text" id="leeftijd"/> veranderd is. Als dat zo is, testen we of de nieuwe waarde gelijk aan of kleiner dan 17
  7068. is. Als dat het geval is maken we een alertbox met de tekst:
  7069. 'Je bent leerplichtig!'
  7070. • Opgave 105
  7071. Open dom-events.html en voeg de volgende functionaliteit eraan toe.
  7072. Als de leeftijd boven de 55 is, dan verschijnt een alertbox met de melding:
  7073. Kijk naar onze seniorenprogramma's!
  7074. We zouden allerlei formuliercontroles kunnen uitvoeren binnen een formulier,
  7075. maar dan eindigen we met een rommeltje van HTML en JavaScript. Een betere
  7076. oplossing is om je JavaScript-controles in een extern bestand te coderen.
  7077. In de volgende opgave zorgen we ervoor dat wanneer je op je verzend-knop klikt,
  7078. een JavaScript-formuliercontrole wordt uitgevoerd.
  7079. 220 2 JavaScript
  7080. • Opgave 106
  7081. Open dom-events.html en voeg de volgende form-events eraan toe:
  7082. <input type="submit" id="submit" name="submit"
  7083. value="Verzenden"
  7084. onmouseover="style.color='green'"
  7085. onmouseout="style.color='black'"
  7086. />
  7087. Alle verplichte inputvelden en e-mailadressen worden gecontroleerd door HTML5.
  7088. Maar we moeten zelf de volgende voorwaarden controleren:
  7089. • de postcode mag geen spaties hebben;
  7090. • de user moet 20 jaar of ouder zijn;
  7091. • wanneer de user een product kiest, maken we een alertbox zoals: ‘Tablet besteld’;
  7092. • wanneer de user een bezorgmethode kiest, wordt een beschrijving van de keuze
  7093. vertoond.
  7094. In de volgende opgave zorgen we ervoor dat wanneer je op de verzendknop klikt,
  7095. de functie formcheck() wordt uitgevoerd. Deze functie coderen we ook in de volgende opgaven.
  7096. • Opgave 107
  7097. Open dom-events.html en verander het <form>-element als volgt:
  7098. <form action="mailto: email@adres.nl"
  7099. name="custform"
  7100. method="post"
  7101. onsubmit="return(formcheck(this));">
  7102. Hier zeggen we dat het onsubmit-event de functie formcheck() moet uitvoeren. We
  7103. zeggen ook dat als de return-waarde van deze functie false is, het formulier niet
  7104. wordt verstuurd. In de volgende opgave coderen we de functie formcheck().
  7105. • Opgave 108
  7106. Open dom-events.js. Codeer de functie formcheck().
  7107. function formcheck(thisForm) {
  7108. postcode = thisForm.postcode.value;
  7109. for(var i=0; i < postcode.length; i++) {
  7110. var c = postcode.charAt(i);
  7111. if(c == ' ') {
  7112. alert("Postcode mag geen spaties hebben");
  7113. thisForm.postcode.focus();
  7114. return false;
  7115. }
  7116. }
  7117. }
  7118. Deze functie controleert of de waarde van het inputveld postcode spaties heeft. Als
  7119. dat zo is, wordt een alertbox vertoond en krijgt het inputveld postcode de focus,
  7120. omdat de postcode opnieuw mag worden ingetypt.
  7121. 2.17 Het Document Object Model 221
  7122. • Opgave 109
  7123. Open dom-events.js en voeg de volgende functionaliteit eraan toe.
  7124. Zorg ervoor dat de functie formcheck() controleert of de leeftijd onder de 20 jaar
  7125. is en dat in dat geval de melding ‘Je moet 20 jaar of ouder zijn’ wordt vertoond. De
  7126. returnwaarde moet false zijn en je moet teruggaan naar het formulier met de focus op het leeftijdveld.
  7127. De status van een checkbox kunnen we ook controleren. Zo kunnen we bepalen
  7128. welke opties de user heeft aangevinkt. In de volgende opgave kijken we naar drie
  7129. elementen <input type="checkbox" name="gadget">. Het <form>-element heeft een
  7130. array met de namen van alle formulier-elementen. De drie checkboxes kunnen we
  7131. als volgt benaderen:
  7132. document.custform.gadget[0]
  7133. document.custform.gadget[1]
  7134. document.custform.gadget[2]
  7135. • Opgave 110
  7136. Open dom-events.html en voeg de volgende functionaliteit eraan toe:
  7137. <input type="checkbox"
  7138. name="gadget"
  7139. id="smartphone"
  7140. value="s"
  7141. onchange="
  7142. if(document.custform.gadget[0].checked)
  7143. {
  7144. alert('Smartphone besteld!');
  7145. }"
  7146. />
  7147. Maak deze opgave af door alertboxes te maken voor ‘Laptop besteld!’ en ‘Tablet
  7148. besteld!’.
  7149. Als laatste controleren we het menu met bezorgmethodes. In de volgende opgave
  7150. controleren we of de bezorging ‘expres’ geselecteerd is. Als dat zo is dan vertonen
  7151. we meer informatie over deze keuze.
  7152. • Opgave 111
  7153. Open dom-events.html en voeg de volgende functionaliteit eraan toe:
  7154. <select onchange="
  7155. if(document.custform.bezorging.value == 'express') {
  7156. getElementById('expres-info').style.display='block';
  7157. getElementById('dag-info').style.display='none';
  7158. getElementById('week-info').style.display='none';
  7159. }"
  7160. name="bezorging" >
  7161. Maak het <select>-element af met de drie opties 'express', 'dag' en 'week'.
  7162. 222 2 JavaScript
  7163. • Vervolg
  7164. Open dom-events.html en voeg de volgende <div>-elementen toe:
  7165. <br />
  7166. <div id="expres-info" style="display:none">Express bestelling</div>
  7167. <div id="dag-info" style="display:none">Dag bestelling</div>
  7168. <div id="week-info" style="display:none">Week bestelling</div>
  7169. <br />
  7170. • Opgave 112
  7171. Open dom-events.html en zorg ervoor dat indien gekozen, de elementen dag-info
  7172. en week-info worden weergegeven.
  7173. Keyboard-events
  7174. Keyboard-events zijn events die plaatsvinden wanneer je een toets op het toetsenbord drukt. Hieronder volgt een tabel met de meest voorkomende keyboardevents:
  7175. Event Betekenis
  7176. onkeydown een toets wordt ingedrukt
  7177. onkeypress een toets wordt ingedrukt en losgelaten
  7178. onkeyup een toets wordt losgelaten
  7179. Je vangt een keyboard-event op tijdens het tikken in een input-vak. Bijvoorbeeld:
  7180. <input type="text" name="leeftijd" onkeyup="mijnfunctie()">
  7181. In de volgende opgave vangen we een onkeyup-event op met de functie herhaling().
  7182. De functie zorgt ervoor dat als je je wachtwoord intikt, elke tik in het tweede
  7183. wachtwoordveld wordt herhaald.
  7184. • Opgave 113
  7185. Open dom-events.html en codeer een onkeyup-event als volgt:
  7186. <input required type="password" id="password"
  7187. placeholder="vul uw wachtwoord in"
  7188. onkeyup="herhalen()" />
  7189. • Opgave 114
  7190. Open dom-events.js en codeer de functie herhalen() als volgt:
  7191. function herhalen(){
  7192. document.custform.password2.value =
  7193. document.custform.password.value;
  7194. }
  7195. 2.18 Cookies 223
  7196. • Lab 17 Lingospel
  7197. In deze lab-opdracht codeer je het volgende lingospel algoritme.
  7198. Figuur 2.39
  7199. Maak een steden-array.
  7200. Kies een willekeurige stad.
  7201. Laat de speler het aantal letters zien, bijvoorbeeld ??????
  7202. Laat de speler een eerste gok doen.
  7203. Laat de speler de juist gegokte letters zien, bijvoorbeeld ?a???
  7204. Laat de speler vier keer gokken.
  7205. Verzin een puntensysteem.
  7206. Het resultaat moet er als volgt uitzien:
  7207. Figuur 2.40
  7208. 2.18 Cookies
  7209. In deze paragraaf kijken we naar cookies.
  7210. • cookies maken
  7211. • cookies lezen
  7212. • cookies verwijderen
  7213. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  7214. 224 2 JavaScript
  7215. Planning Inleveren
  7216. Opgaven 115 t/m 118
  7217. Lab 18
  7218. Webpagina’s zijn stateless. Dat betekent dat webpagina’s geen geheugen hebben.
  7219. Een webpagina weet dus niets van de vorige webpagina. Met andere woorden, de
  7220. tweede, derde of honderdste keer dat je een webpagina bezoekt, is voor de website
  7221. net alsof het de eerste keer is. Dit is een probleem als je informatie van de ene webpagina naar de andere wilt sturen. Om dit probleem op te lossen heeft Netscape
  7222. cookies ontwikkeld. Met JavaScript kunnen we cookies maken, lezen en verwijderen.
  7223. Hoe werk je met cookies?
  7224. Een cookie is een ‘naam-waarde-construct’. Als je informatie tijdelijk wilt bewaren
  7225. maak je een cookie. Een cookie moet een naam en een waarde hebben. Cookies
  7226. worden op de harde schijf van de gebruiker opgeslagen als een tekstbestand. Een
  7227. cookie maak je op de volgende manier:
  7228. document.cookie =
  7229. 'naam=waarde; expires=Thu, 2 Aug 2014 20:47:11 UTC; path=/'
  7230. Je kunt de volgende stappen herkennen.
  7231. Eerst geef je een cookie een naam en waarde:
  7232. naam=waarde;
  7233. Vervolgens geef je de verloopdatum. Na deze datum wordt de cookie door de
  7234. browser verwijderd, bijvoorbeeld:
  7235. expires= Thu, 2 Aug 2014 20:33:03 UTC;
  7236. Ten slotte geef je het pad naar je cookies: path=/. Deze property bepaalt de scope
  7237. van de cookies. De scope bestaat uit de domeinnaam en de webpagina die de cookies aanmaakt. Bijvoorbeeld: path=/voorbeeld.com/home.
  7238. Een cookie voor de user maak je bijvoorbeeld als volgt:
  7239. document.cookie =
  7240. 'user=admin; expires=Thu, 2 Aug 2014 20:47:11 UTC; path=/'
  7241. Een tweede cookie voor het wachtwoord maak je zo:
  7242. document.cookie =
  7243. 'password=123; expires=Thu, 2 Aug 2014 20:47:11 UTC; path=/'
  7244. Je mag de waarde van een cookie wijzigen door dezelfde cookie opnieuw te maken,
  7245. bijvoorbeeld:
  7246. 2.18 Cookies 225
  7247. document.cookie =
  7248. 'password=9u23Qf;expires=Thu,2 Aug 2014 20:47:11 UTC;path=/'
  7249. Om een cookie te verwijderen, zet je de verloopdatum naar een datum eerder dan
  7250. vandaag. De browser ziet dan dat de cookie is verlopen en vervolgens wordt de
  7251. cookie verwijderd. Bijvoorbeeld:
  7252. document.cookie =
  7253. 'password=9u23Qf;expires=Wed,1 Aug 2014 20:47:11 UTC;path=/'
  7254. JavaScript met cookies
  7255. Met JavaScript kunnen we cookies maken, lezen, wijzigen en verwijderen. Deze
  7256. cookies zijn dan beschikbaar voor de duur van je browsersessie. In de volgende
  7257. opgave maken we een functie die nieuwe cookies aanmaakt.
  7258. • Opgave 115
  7259. Codeer het volgende script en sla het op als cookiefuncties.js.
  7260. // function: maakCookie
  7261. // parameters: naam, waarde, dagen
  7262. // return:
  7263. // doel: een cookie maken
  7264. function maakCookie(naam, waarde, dagen) {
  7265. if (dagen) {
  7266. var datum = new Date();
  7267. datum.setTime(datum.getTime()+(dagen*24*60*60*1000));
  7268. var verloopdatum = '; expires= ' + datum.toGMTString();
  7269. } else {
  7270. var verloopdatum = '';
  7271. }
  7272. document.cookie = naam+'='+waarde+verloopdatum+';path=/';
  7273. }
  7274. LET OP
  7275. Om cookies te maken in je browser moet je soms de instellingen wijzigen om lokale bestanden te kunnen maken.
  7276. Om deze functie te gebruiken, moet je drie stukken informatie via de parameters
  7277. doorgeven: de naam, de waarde en het aantal dagen dat de cookie actief moet blijven. Bijvoorbeeld:
  7278. maakCookie('user','administrator',7);
  7279. Deze opdracht maakt de cookie user met de waarde administrator met een houdbaarheid van zeven dagen. In de volgende opgave maken we een inlogscript.
  7280. 226 2 JavaScript
  7281. • Opgave 116
  7282. Typ het volgende over en sla het op als inloggen.html.
  7283. <!DOCTYPE html>
  7284. <html lang="nl">
  7285. <head>
  7286. <meta http-equiv="Content-Type"
  7287. content="text/html;
  7288. charset=UTF-8" />
  7289. <title>Inlogscript</title>
  7290. <script src="cookiefuncties.js"> </script>
  7291. <style>
  7292. div{
  7293. height: 120px;
  7294. width: 200px;
  7295. padding: 20px;
  7296. border-width: 1px;
  7297. border-style: solid;
  7298. border-color: gray;
  7299. border-radius: 5%;
  7300. backgroundColor: rgb(217,217,0);
  7301. }
  7302. </style>
  7303. </head>
  7304. <body>
  7305. <div>
  7306. <form
  7307. name="inlog"
  7308. action="welkom.html"
  7309. method="POST"
  7310. onsubmit=
  7311. "maakCookie('user',document.inlog.user.value,1);
  7312. maakCookie('password',document.inlog.password.value,1);">
  7313. Email-adres:
  7314. <input type="email" size="20" id="user" />
  7315. Wachtwoord:
  7316. <input type="password" size="20" id="password" />
  7317. <hr />
  7318. <input type="submit" value="Verzenden"/>
  7319. </form>
  7320. </div>
  7321. </body>
  7322. </html>
  7323. De <hr/>-tag gebruiken we voor een horizontale lijn. Het resultaat zie je hieronder.
  7324. Figuur 2.41 Inlogformulier
  7325. 2.18 Cookies 227
  7326. In de vorige opgave hebben we een inlogscript gecodeerd. Op het moment van het
  7327. onsubmit-event maken we de user-cookie en de password-cookie aan.
  7328. Dit inlogscript wordt daarna gelinkt met de volgende pagina welkom.html.
  7329. • Opgave 117
  7330. Open een nieuw bestand en sla het op als welkom.html. Codeer de volgende welkomstpagina:
  7331. <!DOCTYPE html>
  7332. <html lang="nl">
  7333. <head>
  7334. <meta http-equiv="Content-Type"
  7335. content="text/html;
  7336. charset=UTF-8" />
  7337. <title>Welkom</title>
  7338. <script src="cookiefuncties.js"></script>
  7339. </head>
  7340. <body>
  7341. <script>
  7342. var newuser = leesCookie('user');
  7343. document.write('Welkom ' + newuser + ' u bent ingelogd!!!');
  7344. </script>
  7345. </body>
  7346. </html>
  7347. In deze pagina willen we in cookiefuncties.js de functie leesCookie() uitvoeren.
  7348. Deze functie moet de naam van de gebruiker vanuit de user-cookie lezen om de
  7349. gebruiker te verwelkomen. De functie leesCookie() coderen we in de volgende opgave:
  7350. • Opgave 118
  7351. Open cookiefuncties.js en voeg de volgende functie eraan toe:
  7352. // function: leesCookie
  7353. // parameters: naam
  7354. // return: waarde van de cookie
  7355. // doel: de waarde van een cookie retourneren
  7356. function leesCookie(naam){
  7357. var naamCookie = naam + '=';
  7358. var cookieArray = document.cookie.split(';');
  7359. for(var i=0; i < cookieArray.length; i++){
  7360. var dezeCookie = cookieArray[i];
  7361. dezeCookie = dezeCookie.trim();
  7362. if (dezeCookie.indexOf(naamCookie) == 0) {
  7363. return dezeCookie.substring(naamCookie.length,dezeCookie.length);
  7364. }
  7365. }
  7366. return null;
  7367. }
  7368. Om deze functie te gebruiken, moet je de naam van een cookie via de input-parameter doorgeven. Bijvoorbeeld:
  7369. 228 2 JavaScript
  7370. gebruikersnaam = leesCookie('user');
  7371. zal de waarde van de cookie user retourneren. Dit gebeurt als volgt:
  7372. Met de functie split() maak je een array met daarin alle cookies.
  7373. Met de for-lus zoek je alle cookies in je array.
  7374. Met de if-opdracht en de functie indexOf() controleer je of de naam van de cookie
  7375. gelijk is aan 'user'.
  7376. Met return levert dit je de waarde van de cookie.
  7377. Browser en cookies
  7378. Als je nu op Control-Shift-C drukt verschijnt het volgende beeldscherm in je
  7379. Chrome-browser. Klik je op Resources en vervolgens op Cookies, dan zie je de net
  7380. aangemaakte cookies zoals in het volgende venster.
  7381. Figuur 2.42 Cookies tonen
  7382. Controleer in je eigen browser of de cookie ‘user’ inderdaad is aangemaakt. Klik op
  7383. Privacy en op de link Individuele cookies verwijderen en als het goed is zie je hier
  7384. de twee cookies ‘user’ en ‘password’ die je net gemaakt hebt. In de volgende opgave
  7385. maken we een functie om cookies te verwijderen.
  7386. • Lab 18
  7387. Open cookiefuncties.js en voeg de volgende functie eraan toe.
  7388. Maak de functie verwijderCookie() – hierin zet je de verloopdatum naar een dag
  7389. eerder. Als de browser ziet dat de datum verlopen is, wordt de cookie verwijderd.
  7390. Maak een <a>-link vanuit de pagina welkom.html naar een pagina uitloggen.html.
  7391. Maak de pagina uitloggen.html. In deze pagina voer je de functie verwijderCookie() uit om de cookies ‘user’ en ‘password’ te verwijderen. Toon de volgende
  7392. tekst: ‘U bent uitgelogd en cookies zijn verwijderd.’
  7393. 2.19 Een winkelwagentje in JavaScript 229
  7394. 2.19 Een winkelwagentje in JavaScript
  7395. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  7396. Planning Inleveren
  7397. Opgaven 119 t/m 123
  7398. Lab 19
  7399. In dit project maken we een winkelwagentje oftewel shopping cart, een client-side
  7400. winkelwagenapplicatie met JavaScript voor een webwinkel. Begin met het coderen
  7401. van de volgende scripts. Gebruik je eigen afbeeldingen en knoppen.
  7402. • Opgave 119
  7403. Dit eerste script sla je op als xxlcomputers.html:
  7404. <!DOCTYPE html>
  7405. <html lang="nl">
  7406. <head>
  7407. <meta http-equiv="Content-Type"
  7408. content="text/html;
  7409. charset=UTF-8" />
  7410. <script src="cookiefuncties.js"> </script>
  7411. <script src ="shoppingcart.js"> </script>
  7412. </head>
  7413. <body>
  7414. <img src="toshiba.jpg" alt=" " />
  7415. <p>Toshiba Satellite A100 Prijs 999.99</p>
  7416. <form name="orderform"
  7417. action="managecart.html"
  7418. method="get"
  7419. onsubmit="bestellen(this);">
  7420. Aantal:
  7421. <input type="text" size=2 id="aantal" value="1" />
  7422. <input type="image" src="images/cart.jpg" />
  7423. <input type="hidden" id="id" value=1 />
  7424. <input type="hidden" id="merk" value="Toshiba" />
  7425. <input type="hidden" id="model" value="Satellite" />
  7426. <input type="hidden" id="prijs" value="999.99" />
  7427. </form>
  7428. <hr />
  7429. <img src="acer.jpg" alt=" " />
  7430. <p>Acer Aspire 3072 MB - 160 GB Prijs 529.00</p>
  7431. <form name="orderform"
  7432. action="managecart.html"
  7433. method="get"
  7434. onsubmit="bestellen(this);">
  7435. Aantal:
  7436. <input type="text" size=2 id="aantal" value="1" />
  7437. <input type="image" src="images/cart.jpg" />
  7438. <input type="hidden" id="id" value=2 />
  7439. 230 2 JavaScript
  7440. <input type="hidden" id="merk" value="Acer" />
  7441. <input type="hidden" id="model" value="Aspire" />
  7442. <input type="hidden" id="prijs" value="529.99" />
  7443. </form>
  7444. <hr />
  7445. </body>
  7446. </html>
  7447. In dit script maken we twee bestelformulieren. Van de formulieren zijn maar een
  7448. paar elementen zichtbaar. De andere elementen zijn van het type="hidden". Na het
  7449. klikken op de bestelknop worden de gegevens aan het winkelwagentje toegevoegd
  7450. met onsubmit="bestellen(this)". Daarna wordt het winkelwagentje weergegeven
  7451. met action="manageCart.html". Het resultaat van de pagina xxlcomputers.html
  7452. moet er zo uitzien:
  7453. Figuur 2.43 Het winkelwagentje van xxlcomputers.html
  7454. • Opgave 120
  7455. Nu gaan we wat functies toevoegen aan het winkelwagentje. Typ het volgende over
  7456. en sla het op als shoppingcart.js:
  7457. // FUNCTION: bestellen
  7458. // PARAMETERS: Form Object
  7459. // RETURNS: Cookie met bestelling info...
  7460. // PURPOSE: cookie maken met info bestelde item
  7461. function bestellen(thisForm){
  7462. productInfo =
  7463. thisForm.id.value + '|' +
  7464. thisForm.merk.value + '|'+
  7465. thisForm.model.value + '|'+
  7466. thisForm.prijs.value + '|' +
  7467. thisForm.aantal.value;
  7468. 2.19 Een winkelwagentje in JavaScript 231
  7469. maakCookie (thisForm.id.value, productInfo,1);
  7470. notice = thisForm.aantal.value + ' ' +
  7471. thisForm.merk.value +
  7472. ' in winkelwagen.';
  7473. alert(notice);
  7474. }
  7475. In dit script maakt de functie bestellen() een cookie met de naam afkomstig uit
  7476. het html-element id en met gegevens van het bestelde item:
  7477. maakCookie(thisForm.id.value, productInfo,1);
  7478. Klik je bijvoorbeeld op de winkelwagentjesknop, dan wordt een cookie gemaakt
  7479. met de naam van de id en met de gegevens van de laptop.
  7480. • Opgave 121
  7481. Open shoppingcart.js en voeg de volgende functie eraan toe:
  7482. // FUNCTION: cartWeergeven
  7483. // PARAMETERS: Null
  7484. // RETURNS: Productentabel
  7485. // PURPOSE: Geeft productentabel weer in html
  7486. // formaat
  7487. function cartWeergeven() {
  7488. tabelrij = '';
  7489. for(i = 0; i <= 6; i++){
  7490. dezeCookie = leesCookie(i);
  7491. if(dezeCookie == null || dezeCookie == 'niet-gevonden')
  7492. {continue;}
  7493. velden = new Array();
  7494. velden = dezeCookie.split('|');
  7495. tabelrij += '<tr>'+
  7496. '<td>' + velden[0] + '</td>' +
  7497. '<td>' + velden[1] + '</td>' +
  7498. '<td>' + velden[2] + '</td>' +
  7499. '<td>' + velden[3] + '</td>' +
  7500. '<td>' + velden[4] + '</td>' +
  7501. '</tr>';
  7502. }
  7503. document.write(tabelrij);
  7504. }
  7505. In bovenstaand script gebruikt de functie cartWeergeven() een for-lus om alle cookies te lezen en in tabelvorm weer te geven. In deze for()-lus kun je maximaal zes
  7506. verschillende laptops bestellen.
  7507. 232 2 JavaScript
  7508. • Opgave 122
  7509. Typ het volgende over en sla het op als managecart.html:
  7510. <!DOCTYPE html>
  7511. <html lang="nl">
  7512. <head>
  7513. <meta http-equiv="Content-Type"
  7514. content="text/html;
  7515. charset=UTF-8" />
  7516. <title>Manage Cart</title>
  7517. <script src="cookiefuncties.js"> </script>
  7518. <script src ="shoppingcart.js"> </script>
  7519. <style>
  7520. table{
  7521. width: 70%;
  7522. border-style: solid;
  7523. }
  7524. th{
  7525. backgroundColor: #cccccc;
  7526. }
  7527. td{
  7528. width: 25%;
  7529. font-weight: bold;
  7530. text-align: center;
  7531. }
  7532. input{
  7533. backgroundColor: bisque;
  7534. }
  7535. </style>
  7536. </head>
  7537. <body>
  7538. <p>Overzicht van Uw shoppingcart:</p>
  7539. <form action="mailto: webshop@xxlcomputers.nl"
  7540. enctype="text/plain"
  7541. onSubmit="return checkForm(this);"
  7542. method="post">
  7543. <table><tr>
  7544. <th> ID </th>
  7545. <th> Merk </th>
  7546. <th> Model </th>
  7547. <th> Prijs </th>
  7548. <th> Aantal </th>
  7549. </tr>
  7550. <script>
  7551. cartWeergeven();
  7552. </script>
  7553. </table>
  7554. <br /><br />
  7555. </form>
  7556. </body>
  7557. </html>
  7558. 2.19 Een winkelwagentje in JavaScript 233
  7559. Figuur 2.44 Het resultaat van managecart.html
  7560. Maak managecart.html af en voeg het bestelformulier toe zoals hier boven. Voeg
  7561. ook een link toe om terug te gaan naar de productenpagina.
  7562. Klanten willen hun bestelling ook wel eens aanpassen of verwijderen. We voegen
  7563. nog een functie toe om de winkelwagen leeg te maken.
  7564. • Opgave 123
  7565. Open shoppingcart.js en voeg de volgende functie eraan toe:
  7566. // FUNCTION: verwijderAlleCookies
  7567. // PARAMETERS: Null
  7568. // RETURNS: Null
  7569. // PURPOSE: Alle cookies verwijderen
  7570. function verwijderAlleCookies() {
  7571. for(i = 1; i <= 6; i++){
  7572. verwijderCookie(i);
  7573. }
  7574. }
  7575. Bovenstaande functie verwijderAlleCookies() gebruikt een for-lus om alle cookies
  7576. te verwijderen. Kopel deze functie aan de link Leeg maken.
  7577. • Lab 19
  7578. Om deze applicatie af te ronden maak je het volgende:
  7579. • Voeg drie nieuwe laptops toe.
  7580. • Voeg een nieuw gegeven Geheugen toe voor alle producten, bijvoorbeeld: 4 GB of
  7581. 8 GB.
  7582. 234 2 JavaScript
  7583. • Voeg een nieuwe kolom Bedrag (prijs * aantal) toe aan de functie cartWeergeven().
  7584. • Voeg een nieuwe kolom Del toe aan de functie cartWeergeven().
  7585. Plaats hier een afbeelding. Koppel hieraan de functie verwijderCookie(), zodat als
  7586. op de afbeelding wordt geklikt, de desbetreff ende laptop verwijderd wordt uit het
  7587. winkelwagentje. Het resultaat moet er als volgt uitzien:
  7588. Figuur 2.45 Het resultaat van Lab 19
  7589. 235
  7590. 3 OOP in JavaScript
  7591. De opkomst van objectgeoriënteerd programmeren (afgekort tot OOP) was een
  7592. ‘paradigmaverschuiving’, dat wil zeggen: een totaal andere stijl van programmeren.
  7593. OOP is in de jaren zestig ontwikkeld en tegenwoordig zie je OOP in veel talen,
  7594. zoals JAVA, C, C++, Phyton, PHP en JavaScript.
  7595. 3.1 Het UML class-diagram
  7596. In deze paragraaf behandelen we de volgende objectgeoriënteerde programmeerconcepten:
  7597. • classes
  7598. • properties
  7599. • methodes
  7600. • sub-classes
  7601. • inheritance
  7602. Aan het einde van deze paragraaf laat je de volgende opgave door je docent controleren:
  7603. Planning Inleveren
  7604. Lab 01
  7605. Het basis-block van OOP is de class. Om classes te begrijpen kijken we eerst naar
  7606. een UML class-diagram. UML is een afkorting voor Unifi ed Modeling Language.
  7607. Het is een modelleertaal die gebruikmaakt van grafi sche notatie om modellen te
  7608. ontwerpen. Die modellen ontwerpen we in diagrammen zoals:
  7609. • use-case-diagram
  7610. • sequence-diagram
  7611. • activity-diagram
  7612. • class-diagram
  7613. Voor OOP is het class-diagram het belangrijkst. Een UML class-diagram is een
  7614. statisch model voor het beschrijven van de objecten in een systeem. Een class beschrijft de structuur en de eigenschapen (properties) en tevens de functies (methodes) van een object. Deze beschrijft ook de relaties tussen de objecten. We tekenen
  7615. een class-diagram als een rechthoek met drie vakken: een vak voor de naam van
  7616. de class, een vak voor de properties en een vak voor de methodes van de class. In
  7617. fi guur 3.1 zie je een voorbeeld van een class-diagram.
  7618. 236 3 OOP in JavaScript
  7619. Figuur 3.1 Class-diagram
  7620. Class met properties
  7621. Een class kan properties en methodes hebben. In fi guur 3.2 zie je een class-diagram
  7622. voor een class met de naam Persoon en de properties naam, leeftijd en geslacht. De
  7623. naam van de class begint altijd met een hoofdletter.
  7624. Figuur 3.2 Class met properties
  7625. Class met methodes
  7626. Een class kan methodes hebben. We gebruiken methodes meestal om de properties
  7627. (data) van de class te verwerken. In fi guur 3.3 zie je een class-diagram voor de class
  7628. Persoon met de methode getNaam():
  7629. Figuur 3.3 Class met Method
  7630. Properties en methodes met twee of meer woorden, zoals de methode getNaam(),
  7631. schrijven we in camelCase. Dat wil zeggen: zonder spaties en de eerste letter van
  7632. het tweede woord krijgt een hoofdletter, dus getNaam(). Hier kunnen we in een
  7633. class de data en de logica die de data verwerk bundelen.
  7634. Subclass
  7635. Een class is een algemene beschrijving van een groep objecten. Een subclass is een
  7636. meer specifi eke beschrijving van een class. Een subclass noemen we ook een childclass.
  7637. 3.2 Het factory pattern 237
  7638. Figuur 3.4 Parent en child-classes
  7639. • Lab 01
  7640. Maak een class-diagram voor de class rekenmachine. Bedenk de properties en de
  7641. methodes die bij een rekenmachine een rol spelen.
  7642. 3.2 Het factory pattern
  7643. Een object is een voorbeeld van een class. Als we eenmaal een class gedefi nieerd
  7644. hebben, kunnen we een of meer objecten uit de class maken. Een class is dan de
  7645. blauwdruk voor het bouwen van objecten. Bijvoorbeeld de class Voertuig is een
  7646. algemene beschrijving van verschillende voertuigobjecten. De subclass Trein is een
  7647. specifi eke beschrijving van een voertuigobject. Het object trein NS09374364 is een
  7648. voorbeeld van de class Voertuig en de subclass Trein.
  7649. In deze paragraaf behandelen we de volgende objectgeoriënteerde programmeerconcepten:
  7650. • factory pattern
  7651. • destructors
  7652. • properties wijzigen
  7653. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  7654. Planning Inleveren
  7655. Opgaven 1 t/m 2
  7656. Lab 02
  7657. 238 3 OOP in JavaScript
  7658. JavaScript is een prototype-gebaseerde scripting-taal. JavaScript heeft geen classopdracht zoals Java of C.
  7659. • In JavaScript zijn functies fi rst-class citizens.
  7660. • Een class defi niëren we met constructor-functies.
  7661. • Een functie is een object.
  7662. Er zijn drie manieren om objecten te maken in JavaScript:
  7663. • factory-pattern
  7664. • constructor-pattern
  7665. • prototype-pattern
  7666. Met het factory-pattern creëren we een model om vervolgens objecten te kunnen maken. In de volgende opgave maken we de factory-pattern PlayerFactory. De
  7667. constructor is een function die een factory-pattern construeert. Daarna gaan we
  7668. vanuit deze constructor twee objecten construeren: een audioPlayer en een videoPlayer.
  7669. • Opgave 1
  7670. Maak een nieuw script en voeg de volgende code eraan toe. Sla het op als
  7671. oop-patterns.html.
  7672. <script>
  7673. // opgave 1
  7674. var PlayerFactory = function(media){
  7675. var obj = {};
  7676. obj.backgroundColor = "blue";
  7677. obj.getColor = function(){
  7678. return obj.backgroundColor;
  7679. };
  7680. obj.setColor = function(color){
  7681. obj.backgroundColor = color;
  7682. };
  7683. obj.media = media;
  7684. obj.play = function(media){};
  7685. obj.pause = function(media){};
  7686. return obj;
  7687. };
  7688. var audioPlayer = PlayerFactory('2121.mp3');
  7689. var videoPlayer = PlayerFactory('juanes.mp4');
  7690. </script>
  7691. Een nieuw object moet gebaseerd zijn op een bestaand model. Hier hebben we het
  7692. object audioPlayer gemaakt. Het is een object dat afstamt van de PlayerFactory. Een
  7693. constructor begint altijd met een hoofdletter, en het geconstrueerde object met een
  7694. kleine letter.
  7695. 3.2 Het factory pattern 239
  7696. De input-parameter in audioPlayer is de media. We hebben hier ook het object
  7697. video Player gemaakt. Alle twee objecten krijgen alle properties en alle methodes
  7698. uit de PlayerFactory. Bijvoorbeeld, de property:
  7699. obj.backgroundColor = "blue";
  7700. En de methode:
  7701. obj.getColor = function(){
  7702. return obj.backgroundColor;
  7703. };
  7704. We gaan nu testen of de twee objecten audioPlayer en videoPlayer de properties en
  7705. de objecten vanuit de PlayerFactory hebben gekregen.
  7706. • Opgave 2
  7707. Open oop-patterns.html en voeg de volgende code eraan toe.
  7708. // opgave 2
  7709. console.log('Opgave 2');
  7710. audioPlayer.setColor('red');
  7711. console.log(audioPlayer.getColor());
  7712. console.log(videoPlayer.getColor());
  7713. Klik Control-Shift-C om de console van je browser te openen. Het resultaat in de
  7714. console zie je hieronder:
  7715. Opgave μ
  7716. red
  7717. blue
  7718. Destructor
  7719. Ongebruikte objecten veroorzaken verlies van geheugencapaciteit (memory leaks).
  7720. JavaScript heeft geen destructormethode zoals PHP, Java of C. JavaScript-objecten
  7721. worden automatisch verwijderd wanneer we de webpagina verlaten.
  7722. Object-properties wijzigen
  7723. Een manier om de properties van een object te benaderen is door chaining (bijvoorbeeld een methode of een property aan een object verbinden). Bijvoorbeeld:
  7724. audioPlayer.backgroundColor = 'green';
  7725. Een tweede manier om de properties van een object te benaderen en te wijzigen, is
  7726. met get/set-methodes. Get/set-methodes zijn lokale methodes die specifi eke toegang bieden tot de lokale properties van een object. In de vorige opgave hebben we
  7727. de volgende get/set-methodes gecodeerd:
  7728. 240 3 OOP in JavaScript
  7729. obj.getColor = function(){
  7730. return obj.backgroundColor;
  7731. };
  7732. obj.setColor = function(color){
  7733. obj.backgroundColor = color;
  7734. };
  7735. Deze methodes kunnen we als volgt gebruiken:
  7736. audioPlayer.setColor('green');
  7737. • Lab 02
  7738. Codeer een factory-pattern gebaseerd op het class-diagram van de rekenmachine
  7739. uit Lab 01.
  7740. 3.3 Constructor-pattern
  7741. Het tweede pattern is het constructor-pattern. JavaScript-objecten zijn dynamisch,
  7742. dat wil zeggen: je kunt nieuwe properties en methodes toevoegen aan een bestaand
  7743. object (andere programeer talen kunnen dat niet). Dit kan gevaarlijk zijn, want je
  7744. kunt ongewild de structuur van een object wijzigen. Dit betekent dat je je scripts in
  7745. Java Script moet blijven testen om foute syntaxis en logische fouten te voorkomen.
  7746. Als je dit zorgvuldig doet, krijg je nieuwe mogelijkheden om dynamische objecten
  7747. en applicaties te ontwikkelen.
  7748. In deze paragraaf behandelen we het constructor-pattern, een volgend objectgeoriën teerd programmeerconcept.
  7749. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  7750. Planning Inleveren
  7751. Opgaven 3 t/m 4
  7752. Lab 03
  7753. Net zoals arrays en strings zijn functies in JavaScript ook objecten. We kunnen een
  7754. functie-object als volgt coderen:
  7755. hallo = function() {alert("Hallo wereld");}
  7756. Dit is hetzelfde als:
  7757. function hallo() {alert("Hallo wereld");}
  7758. In beide gevallen wordt het nieuwe object hallo aangemaakt. In de volgende opgave coderen we een constructor-functie voor het constructor-pattern en daarna
  7759. de objecten die afstammen uit de constructor-functie.
  7760. 3.3 Constructor-pattern 241
  7761. • Opgave 3
  7762. Open oop-patterns.html en voeg de volgende code eraan toe.
  7763. // opgave 3
  7764. var PlayerConstructor = function(media){
  7765. this.media = media;
  7766. this.backgroundColor = "blue";
  7767. this.getColor = function(){
  7768. return this.backgroundColor
  7769. };
  7770. this.setColor = function(color){
  7771. this.backgroundColor = color;
  7772. };
  7773. this.play = function(media){};
  7774. this.pause = function(media){};
  7775. };
  7776. var audioPlayer = new PlayerConstructor('2121.pm3');
  7777. var videoPlayer = new PlayerConstructor('juanes.mp4');
  7778. Om objecten te maken uit de PlayerConstructor gebruiken we het keyword new.
  7779. We kunnen overigens testen of onze twee objecten de properties en de methodes
  7780. vanuit de PlayerConstructor gekregen hebben.
  7781. • Opgave 4
  7782. Open oop-patterns.html en voeg de volgende code eraan toe.
  7783. // opgave 4
  7784. console.log('Opgave 4');
  7785. audioPlayer.setColor("red");
  7786. console.log(audioPlayer.getColor());
  7787. console.log(videoPlayer.getColor());
  7788. Het resultaat in de console zie je hieronder:
  7789. Opgave ξ
  7790. red
  7791. blue
  7792. • Lab 03
  7793. Codeer een constructor-functie gebaseerd op het rekenmachine class-diagram uit
  7794. Lab 01.
  7795. 242 3 OOP in JavaScript
  7796. 3.4 Prototype-pattern
  7797. Het prototype-pattern in JavaScript reserveert een spacename of ruimte waar objecten properties en methodes kunnen delen. Het voordeel hiervan is dat de methodes eenmalig worden gemaakt. Dit in tegenstelling tot de factory- of constructor-patterns waar de methodes bij elk object zijn geko pieerd.
  7798. In deze paragraaf behandelen we de volgende objectgeoriënteerde programmeerconcepten:
  7799. • prototype-pattern
  7800. • objectcommunicatie
  7801. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  7802. Planning Inleveren
  7803. Opgaven 5 t/m 7
  7804. Lab 04
  7805. In de volgende opgave coderen we een prototype-pattern en daarna twee objecten
  7806. die afstammen van de prototype-pattern.
  7807. • Opgave 5
  7808. Open oop-patterns.html en voeg de volgende code eraan toe.
  7809. // opgave 5
  7810. var ProtoPlayer = function(){};
  7811. ProtoPlayer.prototype.versie = "1.0";
  7812. ProtoPlayer.prototype.backgroundColor = "blue";
  7813. ProtoPlayer.prototype.setColor = function(color){
  7814. this.backgroundColor = color;
  7815. };
  7816. ProtoPlayer.prototype.getColor = function(){
  7817. return this.backgroundColor;
  7818. };
  7819. ProtoPlayer.prototype.play = function(media){
  7820. return this.media;
  7821. };
  7822. In deze opgave hebben we een lege ProtoPlayer-constructor als volgt gemaakt:
  7823. var ProtoPlayer = function(){};
  7824. Daarna hebben we een prototype-ruimte gemaakt voor deze constructor. Vervolgens hebben we de property backgroundColor in de prototype-ruimte als volgt
  7825. gemaakt:
  7826. ProtoPlayer.prototype.backgroundColor = "blue";
  7827. 3.4 Prototype-pattern 243
  7828. Uiteindelijk hebben we de methodes setColor, getColor en play aan het prototype
  7829. toegevoegd. Dat betekent dat alle objecten die van de lege ProtoPlayer-constructor
  7830. afstammen de methodes uit het gedeelde prototype mogen gebruiken.
  7831. • Opgave 6
  7832. Open oop-patterns.html en voeg de volgende code eraan toe.
  7833. // opgave 6
  7834. var audioPlayer = new ProtoPlayer();
  7835. audioPlayer.media = '2121.mp3';
  7836. console.log('Opgave 6');
  7837. console.log('versie' in audioPlayer);
  7838. console.log('prijs' in audioPlayer);
  7839. console.log('backgroundColor' in audioPlayer);
  7840. console.log(audioPlayer.hasOwnProperty('backgroundColor'));
  7841. Het resultaat in de console zie je hieronder:
  7842. Opgave π
  7843. true
  7844. false
  7845. true
  7846. false
  7847. Hier zien we dat versie een property is van het audioPlayer-object, maar prijs niet.
  7848. De backgroundColor is wel een property in het audioPlayer-object, maar geen eigen
  7849. property. Deze komt vanuit de prototype-ruimte.
  7850. Objecten kunnen berichten naar elkaar sturen
  7851. We kunnen methodes coderen die het mogelijk maken om berichten naar elkaar te
  7852. sturen. In de volgende opgave coderen we de methode getObjectColor.
  7853. • Opgave 7
  7854. Open oop-patterns.html en voeg de volgende code eraan toe.
  7855. // opgave 7
  7856. console.log('Opgave 7');
  7857. ProtoPlayer.prototype.getObjectColor = function(obj){
  7858. return obj.backgroundColor;
  7859. };
  7860. var videoPlayer = new ProtoPlayer();
  7861. videoPlayer.media = 'juanes.mp4';
  7862. videoPlayer.backgroundColor = 'green';
  7863. console.log(audioPlayer.getObjectColor(videoPlayer));
  7864. console.log(videoPlayer.getObjectColor(audioPlayer));
  7865. 244 3 OOP in JavaScript
  7866. Het resultaat in de console zie je hieronder:
  7867. Opgave ρ
  7868. green
  7869. blue
  7870. Hier zien we dat object videoPlayer zijn kleur heeft doorgegeven aan het object
  7871. audioPlayer en andersom.
  7872. • Lab 04
  7873. In deze lab-opdracht codeer je een constructor-functie voor het protoype-pattern
  7874. gebaseerd op het rekenmachine-class-diagram uit Lab 01.
  7875. 3.5 Inheritance (overerven)
  7876. In OOP hebben we superclasses. Die noemen we de parent-class. We kunnen ook
  7877. subclasses of child-classes defi niëren.
  7878. In deze paragraaf behandelen we de volgende objectgeoriënteerde programmeerconcepten:
  7879. • overerven (inheritance)
  7880. • overschrijven methodes
  7881. • encapsulation
  7882. • delete
  7883. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  7884. Planning Inleveren
  7885. Opgaven 8 t/m 11
  7886. Lab 05
  7887. De child-classes erven van de parent-classes door middel van inheritance of erfenis.
  7888. In het volgende class-diagram zie je dat de class MiniPlayer een child-class is van de
  7889. class ProtoPlayer. We zeggen: de class MiniPlayer extends de class ProtoPlayer. De
  7890. child-class MiniPlayer erft alle properties en methodes van de parent-class ProtoPlayer. We noemen deze relatie een: is-een-relatie. Bijvoorbeeld, een MiniPlayer
  7891. is-een ProtoPlayer.
  7892. 3.5 Inheritance (overerven) 245
  7893. Figuur 3.5 Parent en child-classes
  7894. In de vorige fi guur zien we dat we meerdere objecten kunnen maken uit de MiniPlayer child-constructor.
  7895. In JavaScript mogen we parent-constructors en child-constructors creëren. Maar
  7896. we kunnen geen grand-child-constructors maken omdat JavaScript ‘single inheritance’ is.
  7897. In de volgende opgave maken we de child-constructor MiniPlayer uit de ProtoPlayer parent-constructor.
  7898. • Opgave 8
  7899. Open oo-patterns.html en voeg de volgende code eraan toe.
  7900. // opgave 8
  7901. // child constructor
  7902. function MiniPlayer(){
  7903. // call parent constructor
  7904. ProtoPlayer.call(this);
  7905. // eigen property
  7906. this.versie = '2.0';
  7907. };
  7908. // laat de child-constructor de prototyperuimte van
  7909. // de parent delen
  7910. MiniPlayer.prototype = Object.create(ProtoPlayer.prototype);
  7911. Door het delen van de prototyperuimte heeft de MiniPlayer-constructor de properties en methodes uit de ProtoPlayer-constructor geërfd, behalve de property-versie.
  7912. Deze property was namelijk gedefi nieerd als privé met het var-keyword. De MiniPlayer-constructor heeft een eigen versie-property.
  7913. 246 3 OOP in JavaScript
  7914. Overschrijven van parent-methodes
  7915. Soms is het noodzakelijk om overgeërfde parent-methodes te herdefi niëren. Dan
  7916. overschrijven we deze methodes met meer specifi eke functionaliteit in de childclass. In de volgende opgave krijgen de get/set-methodes in de child-class nieuwe
  7917. functionaliteit. Deze methodes overschrijven de parent-methodes.
  7918. • Opgave 9
  7919. Open oo-patterns.html en voeg de volgende code eraan toe.
  7920. // opgave 9
  7921. //methode overschrijven
  7922. MiniPlayer.prototype.play = function(){
  7923. return 'Now playing ... ' + this.media;
  7924. };
  7925. // voeg een nieuwe methode
  7926. MiniPlayer.prototype.pause = function(){
  7927. return 'Pause ... ' + this.media;
  7928. };
  7929. // maak een child object
  7930. var miniPlayer = new MiniPlayer();
  7931. miniPlayer.media = '2121.mp3';
  7932. console.log('Opgave 9');
  7933. console.log(miniPlayer.play('2121.mp3'));
  7934. console.log(miniPlayer.pause());
  7935. Het resultaat in de console zie je hieronder:
  7936. Opgave σ
  7937. Now playing ... μλμλ.mpν
  7938. Pause ... μλμλ.mpν
  7939. Encapsulation
  7940. Encapsulation kunnen we vertalen we als inkapseling en dit betekent dat iedere
  7941. constructor zijn eigen properties en methodes verpakt. De child-constructor kan
  7942. de ingepakte methodes van de parent gebruiken zonder te weten hoe die werken.
  7943. Hier zeggen we dat de methodes en de properties van de parent publiek zijn en ook
  7944. beschikbaar voor de child-constructor – behalve de lokale properties. We zeggen
  7945. dat de lokale properties van de parent privé zijn en het child hoef niet alles van de
  7946. parent te weten. Een privé-property of methode defi niëren we met het keyword
  7947. var. Bijvoorbeeld in de parent-constructor ProtoPlayer:
  7948. var versie = '1.0';
  7949. Dit is privé en niet geërfd bij de child-constructor MiniPlayer. De MiniPlayer-constructor heeft een eigen versie als volgt gemaakt:
  7950. 3.5 Inheritance (overerven) 247
  7951. this.versie = '2.0';
  7952. We kunnen dit testen – zie de volgende opgave.
  7953. • Opgave 10
  7954. Open oo-patterns.html en voeg de volgende code eraan toe.
  7955. // opgave 10
  7956. console.log('Opgave 10');
  7957. console.log(videoPlayer.versie);
  7958. console.log(miniPlayer.versie);
  7959. console.log(miniPlayer.backgroundColor);
  7960. Het resultaat in de console zie je hieronder:
  7961. Opgave λκ
  7962. λ.κ
  7963. μ.κ
  7964. blue
  7965. Hier zien we dat de versie in videoPlayer privé is en niet geërfd, miniPlayer heeft
  7966. een eigen versie, backgroundColor was wel geërfd.
  7967. Delete-function
  7968. Bij dynamische objecten in JavaScript kunnen we ook een bepaalde property van
  7969. het object verwijderen. Stel, je hebt een child-constructor die alle properties van de
  7970. parent heeft geërfd. Als je één van de geërfde properties niet meer nodig hebt, kun
  7971. je die property verwijderen met de delete-functie.
  7972. • Opgave 11
  7973. Open oo-patterns.html en voeg de volgende code eraan toe.
  7974. //opgave 11
  7975. console.log('Opgave 11');
  7976. delete(MiniPlayer.prototype.backgroundColor);
  7977. console.log(MiniPlayer.backgroundColor);
  7978. Het resultaat in de console zie je hieronder:
  7979. Opgave λλ
  7980. undefi ned
  7981. 248 3 OOP in JavaScript
  7982. • Lab 05
  7983. In deze lab-opdracht maak je een child-constructor uit de rekenmachine-constructor. In de child-constructor voeg je de methode toe om percentages uit te rekenen.
  7984. 3.6 Een OOP videoPlayer
  7985. In deze paragraaf coderen we een video player met onze eigen videocontroles. Aan
  7986. het einde van de paragraaf moet je onderstaand resultaat zien:
  7987. Figuur 3.6
  7988. Planning Inleveren
  7989. Opgave 12
  7990. Lab 06 t/m 07
  7991. • Opgave 12
  7992. Open een nieuw script en sla het op als player.html. Voeg de volgende code eraan
  7993. toe.
  7994. <!DOCTYPE html>
  7995. <html lang="nl">
  7996. <head>
  7997. <meta http-equiv="Content-Type"
  7998. content="text/html;
  7999. charset=UTF-8">
  8000. <style>
  8001. #container{
  8002. margin-left: auto;
  8003. margin-right: auto;
  8004. width: 80%;
  8005. }
  8006. #controls{
  8007. display: block;
  8008. background: black;
  8009. padding-top: 5px;
  8010. text-align: center;
  8011. width: 80%;
  8012. }
  8013. 3.6 Een OOP videoPlayer 249
  8014. input[type = image]{
  8015. width: 10%;
  8016. }
  8017. </style>
  8018. </head>
  8019. <body>
  8020. <div id="container">
  8021. <video id="video" controls width="80%" preload
  8022. poster="video/juanes.bmp">
  8023. <source src="video/juanes.mp4" type="video/mp4"/>
  8024. </video>
  8025. <div id="controls">
  8026. <input type="image" src="img/play.png"
  8027. onclick="player.play(video);" />
  8028. <input type="image" src="img/pause.png"
  8029. onclick="player.pause(video);" />
  8030. </div>
  8031. </div>
  8032. </body>
  8033. </html>
  8034. • Lab 06
  8035. Codeer de volgende Player-constructor onderaan de HTML-code uit opgave 12.
  8036. var Player = function() {};
  8037. Player.prototype.play = function(media) {
  8038. media.play();
  8039. };
  8040. Player.prototype.pause = function(media) {
  8041. media.pause();
  8042. };
  8043. var player = new Player();
  8044. Hier hebben we methodes voor de play- en de pause-knoppen gemaakt. Maak
  8045. Lab 06 af door de methodes voor de volgende knoppen toe te voegen:
  8046. • reset
  8047. • forward
  8048. • rewind
  8049. • volume +
  8050. • volume –
  8051. • volume aan/uit
  8052. De operaties van het video-object kun je als volgt coderen:
  8053. Pause met media.pause();
  8054. Reset met media.currentTime = 0;
  8055. Forward met media.currentTime += 30;
  8056. Rewind met media.currentTime -= 30;
  8057. Volume+ met media.volume += 0.1;
  8058. Volume- met media.volume -= 0.1;
  8059. Volume aan/uit met media.muted = true/false
  8060. 250 3 OOP in JavaScript
  8061. • Lab 07
  8062. Codeer de Calculator constructor en object die gebaseerd is op het class-diagram
  8063. uit Lab 01.
  8064. Codeer de volgende code en sla het op als calculator.html.
  8065. <!DOCTYPE html>
  8066. <html lang="nl">
  8067. <head>
  8068. <meta http-equiv="Content-Type"
  8069. content="text/html;
  8070. charset=UTF-8" />
  8071. <style>
  8072. #calculator {
  8073. border: solid black 1px;
  8074. padding: 4px;
  8075. border-radius: 4px;
  8076. width: 40%;
  8077. margin-left: auto;
  8078. margin-right: auto;
  8079. }
  8080. form{
  8081. width: 100%;
  8082. }
  8083. #calculator input[type="text"] {
  8084. text-align: right;
  8085. }
  8086. #output {
  8087. backgroundColor: darkseagreen;
  8088. width: 92%;
  8089. margin-left: 5px;
  8090. font-size: 1.3rem;
  8091. border-radius: 8px;
  8092. padding-right: 8px;
  8093. }
  8094. #buttontable {
  8095. width: 100%;
  8096. font-size: 1.0rem;
  8097. }
  8098. #buttontable input {
  8099. width: 100%;
  8100. height: 32px;
  8101. padding: 0px;
  8102. }
  8103. </style>
  8104. </head>
  8105. <body>
  8106. <div id="calculator">
  8107. <form action="index.html" method="post" name="calc">
  8108. <input type="text" name="output" id="output" value="0" />
  8109. <table id="buttontable">
  8110. <tr>
  8111. <td>
  8112. <input type="button" value="C"onclick="calculator.reset();"/>
  8113. </td>
  8114. 3.6 Een OOP videoPlayer 251
  8115. <td>
  8116. <input type="button" value="BS" disabled />
  8117. </td>
  8118. <td>
  8119. <input type="button" value="MR" disabled />
  8120. </td>
  8121. <td>
  8122. <input type="button" value="MC" disabled />
  8123. </td>
  8124. </tr>
  8125. <tr>
  8126. <td>
  8127. <input type="button" value="7"
  8128. onclick="calculator.setOperand('7');" />
  8129. </td>
  8130. <td>
  8131. <input type="button" value="8"
  8132. onclick="calculator.setOperand ('8');" />
  8133. </td>
  8134. <td>
  8135. <input type="button" value="9"
  8136. onclick="calculator.setOperand ('9');" />
  8137. </td>
  8138. <td>
  8139. <input type="button" value="*"
  8140. onclick="calculator.setOperator('*');" />
  8141. </td>
  8142. </tr>
  8143. . . .
  8144. <td>
  8145. <input type="button" value="=" onclick="calculator.calculate();" />
  8146. </td>
  8147. Maak dit script af met de resterende knoppen. Het resultaat moet er als volgt uitzien:
  8148. Figuur 3.7
  8149. Codeer de Calculator-constructor en het calculator-object volgens het volgende
  8150. class-diagram:
  8151. 252 3 OOP in JavaScript
  8152. Figuur 3.8
  8153. Rekenmachine algoritme
  8154. Hanteer het volgende algoritme of je eigen variatie hierop.
  8155. Stap 1: de setOperand-methode
  8156. Wanneer er wordt geklikt op een getal-knop (ook de decimale punt), dan wordt het
  8157. getal of de decimale punt opgeslagen in de operand.
  8158. De setOperand()-methode voegt inputs als volgt samen:
  8159. this.operand += operand;
  8160. Stel dat je 1.3 intikt, dan krijgt je de volgende situatie:
  8161. Stap savedOperand operator operand resultaat
  8162. 1 1.3
  8163. Daarna wordt de operand in de rekenmachine vertoond.
  8164. Stap 2: de setOperator-methode
  8165. Wanneer er wordt geklikt op een operator-knop (+ - * / =), dan wordt er getest of
  8166. de status in resultaat gelijk is aan "".
  8167. Als het resultaat gelijk is aan "" wordt de operand opgeslagen in savedOperand en de
  8168. operand gelijk aan "".
  8169. Als het resultaat niet gelijk is aan "" wordt het resultaat opgeslagen in savedOperand
  8170. en de operand wordt "".
  8171. Stel dat je op + drukt, dan krijg je de volgende situatie:
  8172. Stap savedOperand operator operand resultaat
  8173. 2 1.3 +
  8174. Daarna wordt stap 1 herhaald.
  8175. 3.7 Speciale functions 253
  8176. Stel dat je op 6 drukt, dan krijg je de volgende situatie:
  8177. Stap savedOperand operator operand resultaat
  8178. 2 1.3 + 6
  8179. Stap 3: de calculate-methode
  8180. Wanneer er wordt geklikt op de =-knop, voert de calculate-methode een switchopdracht uit gebaseerd op de operator. Het resultaat wordt als volgt uitgerekend:
  8181. resultaat = savedOperand operator operand
  8182. Stel dat je op = drukt, dan krijgt je de volgende situatie:
  8183. Stap savedOperand operator operand resultaat
  8184. 3 1.3 + 6 7.3
  8185. Daarna wordt het resultaat getoond.
  8186. Stap 4: de reset-methode
  8187. Wanneer er wordt geklikt op de C-knop, reset deze methode alle properties naar
  8188. "".
  8189. Stel dat je op C drukt, dan krijgt je de volgende situatie:
  8190. Stap savedOperand operator operand resultaat
  8191. 4
  8192. 3.7 Speciale functions
  8193. In deze paragraaf kijken we naar functies met speciale coderingstechnieken in JavaScript. We kijken naar de volgende concepten:
  8194. • externe methodes
  8195. • call-methode
  8196. • apply-methode
  8197. • bind-methode
  8198. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  8199. Planning Inleveren
  8200. Opgaven 13 t/m 16
  8201. Lab 08
  8202. 254 3 OOP in JavaScript
  8203. Externe methodes aan objecten koppelen
  8204. In JavaScript kunnen we externe methodes koppelen aan objecten. Er zijn drie manieren om dit te doen:
  8205. • call
  8206. • apply
  8207. • bind
  8208. Call
  8209. In de volgende fi guur zien we aan de linkerkant een class-diagram met eigen methodes en aan de rechterkant externe methodes.
  8210. Figuur 3.9
  8211. Zoals te zien is in fi guur 3.9 zijn de methodes horizontaal en verticaal niet verbonden met de class Cirkel. Met de methode call maken we een verbinding tussen de
  8212. class Cirkel en de externe methodes.
  8213. Syntaxis:
  8214. externe-methode.call(obj, input-parameter);
  8215. In de volgende opgave koppelen we het object obj met de methodes horizontaal en
  8216. verticaal.
  8217. • Opgave 13
  8218. Open een nieuw script en sla het op als cirkel.html. Voeg de volgende code eraan
  8219. toe.
  8220. <!DOCTYPE html>
  8221. <html lang="nl">
  8222. <head>
  8223. <meta http-equiv="Content-Type"
  8224. content="text/html;
  8225. charset=UTF-8" />
  8226. <style>
  8227. #box{
  8228. width: 400px;
  8229. height: 200px;
  8230. border: solid black;
  8231. }
  8232. 3.7 Speciale functions 255
  8233. .cirkel{
  8234. border-radius: 50%;
  8235. width: 50px;
  8236. height: 50px;
  8237. backgroundColor: red;
  8238. position: relative;
  8239. top: 50px;
  8240. left: 100px;
  8241. }
  8242. </style>
  8243. </head>
  8244. <body>
  8245. <div id="box">
  8246. <div id="1" class="cirkel">
  8247. </div>
  8248. </div>
  8249. </body>
  8250. </html>
  8251. • Opgave 14
  8252. Open cirkel.html en sla het op als call.html. Voeg onderaan het volgende script
  8253. toe.
  8254. <script>
  8255. obj = {
  8256. kleur:'red',
  8257. cirkel: document.getElementById('1')
  8258. }
  8259. var horizontaal = function(posX){
  8260. this.cirkel.style.left = posX+'px';
  8261. };
  8262. var verticaal = function(posY){
  8263. this.cirkel.style.top = posY+'px';
  8264. };
  8265. // CALL
  8266. horizontaal.call(obj,300);
  8267. verticaal.call(obj,100);
  8268. </script>
  8269. Hierboven koppelen we met call de methode horizontaal aan het object obj met
  8270. de parameter 300. Het resultaat is een verplaatsing van de cirkel naar positie 300
  8271. horizontaal en positie 100 verticaal. Zie fi guur 3.10.
  8272. Figuur 3.10
  8273. 256 3 OOP in JavaScript
  8274. Apply
  8275. De apply-methode is bijna hetzelfde als de call-methode. Het enige verschil is dat
  8276. in plaats van input-parameters we een array met input-parameters doorgeven. In
  8277. de volgende opgave gebruiken we de methode apply om de instellingen van het
  8278. object cirkel toe te passen.
  8279. Syntaxis:
  8280. externe-methode.apply(obj, array);
  8281. • Opgave 15
  8282. Open cirkel.html en sla het op als apply.html. Voeg onderaan het volgende script.
  8283. <script>
  8284. obj = {
  8285. kleur:'red',
  8286. cirkel: document.getElementById('1')
  8287. }
  8288. // Apply
  8289. var settings = [50,100,'green'];
  8290. var verplaats = function(posX,posY,kleur){
  8291. this.cirkel.style.left = posX+'px';
  8292. this.cirkel.style.top = posY+'px';
  8293. this.cirkel.style.backgroundColor = kleur;
  8294. };
  8295. verplaats.apply(obj,settings);
  8296. </script>
  8297. Hier zien we weer dat de methode verplaats niet verbonden is met het object
  8298. cirkel. Met apply passen we de instellingen voor het object toe. Het resultaat zie je
  8299. hieronder.
  8300. Figuur 3.11
  8301. Bind
  8302. De bind-methode verbindt een externe methode met een object om daarna een
  8303. nieuw object te creëren.
  8304. Syntaxis:
  8305. nieuw object = externe-methode.bind(object);
  8306. 3.7 Speciale functions 257
  8307. In de volgende opgave verbinden we het object obj met de methode verplaatsen en
  8308. creëren we het nieuwe object mijnCirkel.
  8309. • Opgave 16
  8310. Open cirkel.html en sla het op als bind.html. Voeg onderaan de volgende code
  8311. toe.
  8312. <script>
  8313. obj = {
  8314. color: 'red',
  8315. cirkel: document.getElementById('1')
  8316. }
  8317. var verplaats = function(posX,posY,color){
  8318. this.cirkel.style.left = posX+'px';
  8319. this.cirkel.style.top = posY+'px';
  8320. this.cirkel.style.backgroundColor = color;
  8321. };
  8322. // BIND obj en methode in nieuw object
  8323. var mijnCirkel = verplaats.bind(obj);
  8324. mijnCirkel(160,20, 'blue');
  8325. </script>
  8326. Hier hebben we het nieuwe object mijnCirkel gemaakt en vervolgens verplaatst.
  8327. Het resultaat zie je in fi guur 3.12.
  8328. Figuur 3.12
  8329. • Lab 08
  8330. In de volgende lab-opgave coderen we een pingpongbal.
  8331. Stap 1:
  8332. Open cirkel.html en sla het op als pingPong.html. Voeg het volgende script eraan
  8333. toe.
  8334. <script>
  8335. var Bal = function(id,color,width,height){
  8336. var right = true;
  8337. var down = true;
  8338. this.element = document.getElementById(id);
  8339. this.element.style.width = width;
  8340. 258 3 OOP in JavaScript
  8341. this.element.style.height = height;
  8342. this.element.style.backgroundColor = color;
  8343. this.getX= function(){
  8344. this.x = this.element.style.left;
  8345. return (this.x.substring(0, this.x.length - 2));
  8346. };
  8347. this.getY = function(){
  8348. this.y = this.element.style.top;
  8349. return (this.y.substring(0, this.y.length - 2));
  8350. };
  8351. this.setX = function(pos){
  8352. this.element.style.left = pos + 'px';
  8353. };
  8354. this.setY = function(pos){
  8355. this.element.style.top = pos + 'px';
  8356. };
  8357. };
  8358. </script>
  8359. Stap 2:
  8360. In de volgende stap voegen we een methode toe die de pingpongbal laat bewegen:
  8361. var playIt = function(obj){
  8362. var xx = obj.getX();
  8363. console.log(xx);
  8364. if(obj.right){
  8365. xx++;
  8366. if(xx >=350) obj.right = false;
  8367. }
  8368. if(!obj.right){
  8369. xx--;
  8370. if(xx <= 0) obj.right = true;
  8371. }
  8372. obj.setX(xx);
  8373. var yy = obj.getY();
  8374. console.log(yy);
  8375. if(obj.down){
  8376. yy++;
  8377. if(yy >=150) obj.down = false;
  8378. }
  8379. if(!obj.down){
  8380. yy--;
  8381. if(yy <= 0) obj.down = true;
  8382. }
  8383. obj.setY(yy);
  8384. };
  8385. bal1 = new Bal('1','red','50px','50px');
  8386. setInterval( 'playIt(bal1)',10);
  8387. Het resultaat is een pingpongbal die vanzelf beweegt binnen de kaders van de box.
  8388. 3.8 Anonieme functions 259
  8389. 3.8 Anonieme functions
  8390. In deze paragraaf kijken we naar functies met speciale coderingstechnieken in
  8391. Java Script. We bekijken de volgende concepten:
  8392. • anonieme functies
  8393. • callback-functies
  8394. • zelfuitvoerende functies
  8395. • return-functies
  8396. • functie-closures
  8397. • heredity
  8398. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  8399. Planning Inleveren
  8400. Opgaven 17 t/m 19
  8401. Lab 09
  8402. In JavaScript kunnen we het volgende coderen zonder enige foutmeldingen:
  8403. ['Joshua', 'Arnlod', 'Shireen'];
  8404. 1234;
  8405. 'Joshua';
  8406. function(parameter){return parameter;}
  8407. Je ziet dat de array, het getal, de tekst en de functie geen naam hebben, anoniem
  8408. zijn. Omdat deze waarden anoniem zijn, kunnen we er verder niks mee doen. Pas
  8409. als je de array een naam geeft, kun je hem verder gebruiken. Bijvoorbeeld:
  8410. studenten=['Joshua', 'Arnlod', 'Shireen'];
  8411. Anonieme functies kunnen heel handig zijn.
  8412. • We kunnen anonieme functies als input voor een andere functie gebruiken.
  8413. • We kunnen anonieme functies meteen uitvoeren.
  8414. Wanneer je een anonieme functie gebruikt als inputparameter voor een andere
  8415. functie, dan noem je de anonieme functie een callback-functie.
  8416. Callback-functions
  8417. Een willekeurige functie, noem het maar de ‘eerste functie’, kan inputparameters
  8418. krijgen. Inputparameters mogen ook functies zijn. Een functie die gebruikt wordt
  8419. als inputparameter noemen we de callback-functie van de eerste functie. Een deel
  8420. van de functionaliteit van de eerste functie wordt dan bepaald door de code van de
  8421. callback-functie. Bijvoorbeeld, de callback-functie wacht tot de eerste functie beeindigd is en dan pas wordt de callback-functie uitgevoerd. In de volgende opgave
  8422. coderen we een eerste functie met een callback-functie.
  8423. 260 3 OOP in JavaScript
  8424. • Opgave 17
  8425. Open pingPong.html en sla het op als callback.html. Verwijder de volgende regel:
  8426. //setInterval( 'playIt(bal1)',10);
  8427. En voeg de volgende methode eraan toe:
  8428. function switchColor(obj,callback){
  8429. yy = obj.element.style.left;
  8430. yy = yy.substring(0, yy.length - 2);
  8431. if(yy >= 150){
  8432. obj.element.style.backgroundColor = 'blue';
  8433. }else{
  8434. obj.element.style.backgroundColor = 'green';
  8435. }
  8436. callback();
  8437. }
  8438. Hierboven hoeven we het object en de callback-functie nog niet te benoemen. We
  8439. hebben alleen maar de ruimte voor het object en de callback-functie gecreëerd.
  8440. De functie switchColor verwacht een object en een callback-functie als inputparameters.
  8441. function switchColor(obj,callback)
  8442. In de volgende code noemen we wel het object en de callback-functie. Codeer de
  8443. volgende setInterval met de callback-function playIt().
  8444. setInterval('switchColor(bal1,playIt(bal1))',10);
  8445. </script>
  8446. De switchColor-functie verandert de kleur van het object: aan de rechterkant naar
  8447. blauw en aan de linkerkant naar groen. Pas daarna wordt de callback-functie uitgevoerd. Om dit uit te voeren geven we de naam van het object (bal1) en de callbackfunctie (playIt) als volgt:
  8448. setInterval('switchColor(bal1,playIt(bal1))',10);
  8449. Het resultaat is een pingpongbal die beweegt en van kleur verandert binnen de
  8450. kaders van de box.
  8451. Zelfuitvoerende functions
  8452. Wanneer we de declaratie van een functie eindigen met haakjes openen en sluiten (
  8453. ) betekent dit ‘nu uitvoeren’. Dan wordt de functie meteen uitgevoerd.
  8454. Return-functions
  8455. Een functie mag objecten als output geven. Het object van de output mag ook een
  8456. functie zijn. In de volgende opgave coderen we een functie die een functie als output geeft.
  8457. 3.8 Anonieme functions 261
  8458. Function-closures
  8459. Een closure gebeurt wanneer een functie een anonieme functie als output geeft
  8460. met de eigen scope van de closure-functie. De output-functie krijgt de scope van
  8461. de eerste functie. Met scope bedoelen we de context of variabelen van de functie.
  8462. Wanneer we een functie declareren, kan de functie verwijzingen hebben naar alle
  8463. lokale variabelen binnen zijn scope. Maar bij closures blijven de variabelen zichtbaar in de output-functie, zelfs wanneer de output-functie iets later wordt uitgevoerd. Een closure gebeurt wanneer een functie een anonieme functie als output
  8464. geeft en dan uitvoert.
  8465. In de volgende fi guur zien we dat wanneer F2 wordt geretourneerd door F1 dat F2
  8466. zich de context van F1 herinnert, namelijk x=1 plus de eigen context, namelijk y=2.
  8467. Figuur 3.13
  8468. In de volgende opgave coderen we een functie met closure.
  8469. • Opgave 18
  8470. Open een nieuw script en sla het op als closure.html.
  8471. Voeg de volgende code eraan toe.
  8472. <script>
  8473. var topFunction = function(){
  8474. tekst = "Deel een";
  8475. console.log(tekst);
  8476. return function(inputTekst){
  8477. console.log(tekst + " plus " + inputTekst);
  8478. };
  8479. }();
  8480. topFunction("Deel twee");
  8481. </script>
  8482. In deze opgave output de functie topFunction een anonieme functie. De anonieme
  8483. functie ‘herinnert’ de variabele tekst in de topFunction. De anonieme functie kan
  8484. dus variabelen uit de topFunction plus eigen va ria belen weergeven en gebruiken
  8485. voor verdere bewerking. Je gebruikt de topFunction als volgt:
  8486. topFunction("tekst");
  8487. 262 3 OOP in JavaScript
  8488. Open de browserconsole door op Control-Shift-C te klikken. Het resultaat zie je
  8489. hieronder:
  8490. Deel een
  8491. Deel een plus Deel twee
  8492. Als je de topFunction aanroept, dan roep je de return-functie ook aan.
  8493. Function-heredity
  8494. Wat we in de vorige opgave hebben gedaan heet in JavaScript ‘closure’. In de volgende opgave coderen we een functie binnen een functie, en daarbinnen weer een
  8495. functie.
  8496. • Opgave 19
  8497. Open een nieuw script en sla het op als heredity.html Voeg de volgende code eraan toe.
  8498. <script>
  8499. function grootvader(){
  8500. familieNaam = 'Mandela';
  8501. var naam = 'grootvader';
  8502. var leeftijd = 66;
  8503. console.log(naam+' '+familieNaam+' is '+leeftijd);
  8504. function vader(){
  8505. ogen = 'bruine';
  8506. var naam = 'vader';
  8507. var leeftijd = 36;
  8508. console.log(naam+' '+familieNaam+' is '+leeftijd);
  8509. function kind(){
  8510. var naam = 'kind';
  8511. var leeftijd = 16;
  8512. console.log(naam+' '+familieNaam+' is '+leeftijd +
  8513. ' en heeft '+ogen+' ogen');
  8514. }
  8515. kind();
  8516. window.kind = kind;
  8517. }
  8518. vader();
  8519. }
  8520. grootvader();
  8521. kind();
  8522. </script>
  8523. Het resultaat zie je hieronder:
  8524. 3.8 Anonieme functions 263
  8525. grootvader Mandela is ππ
  8526. vader Mandela is νπ
  8527. kind Mandela is λπ en heeft bruine ogen
  8528. kind Mandela is λπ en heeft bruine ogen
  8529. In het resultaat zien we dat alle publieke variabelen van de grootvader zoals de
  8530. familie Naam overerven aan de vader- en kind-functies. De privévariabelen (beginnend met het key-word var) zoals naam en leeftijd worden niet geërfd. We zien
  8531. bijvoorbeeld dat de vader de familieNaam heeft geërfd, maar een eigen leeftijd heeft.
  8532. Het kind heeft de familieNaam plus de bruine ogen van zijn vader geërfd. Als laatste
  8533. hebben we de kind-functie buiten de scope van de vader uitgevoerd om te laten
  8534. zien dat het kind zich nog steeds de geërfde properties herinnert.
  8535. • Lab 09
  8536. Open pingPong.html en vervang het body-element door het volgende body-element:
  8537. <body>
  8538. <div id="box">
  8539. <div id="1" class="cirkel">
  8540. </div>
  8541. <div id="2" class="cirkel">
  8542. </div>
  8543. <div id="3" class="cirkel">
  8544. </div>
  8545. </div>
  8546. </body>
  8547. Vervang de volgende regel:
  8548. //setInterval( 'playIt(bal1)',10);
  8549. door de volgende regels:
  8550. bal1 = new Bal('1','red','50px','50px');
  8551. bal2 = new Bal('2','blue','35px','35px');
  8552. bal3 = new Bal('3','green','35px','35px');
  8553. setInterval( 'playIt(bal1)',10);
  8554. setInterval( 'playIt(bal2)',3);
  8555. setInterval( 'playIt(bal3)',8);
  8556. Het resultaat is drie pinpongballen die bewegen binnen de marges van de box.
  8557. 264 3 OOP in JavaScript
  8558. Figuur 3.14
  8559. 3.9 JSON-object-literals
  8560. In deze paragraaf kijken we naar functies met speciale coderingstechnieken in JavaScript. We kijken naar de volgende concepten:
  8561. • JSON objecten
  8562. • geneste JSON objecten
  8563. • chaining
  8564. • objecten bundelen
  8565. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  8566. Planning Inleveren
  8567. Opgaven 20 t/m 23
  8568. Lab 10
  8569. Literals zijn vaste waarden die je letterlijk codeert binnen je JavaScript. Bijvoorbeeld, een tekst-literal geef je als volgt aan:
  8570. "tekst literal"
  8571. Een object-literal is een lijst met property-namen en waarden binnen accolades {}.
  8572. Bijvoorbeeld:
  8573. {
  8574. "attribuut": "waarde"
  8575. }
  8576. Object-literals maken we met JavaScript Object Notation, afgekort JSON. JSON is
  8577. een syntaxis voor het structureren en transporteren van tekstinformatie.
  8578. JSON is programeertaalonafhankelijk en de datastructuren zijn eenvoudig te lezen.
  8579. De syntaxis voor het maken van een JSON-object-literal is als volgt:
  8580. var jsonobject = {
  8581. "attribuut1": "waarde1",
  8582. "attribuut2": "waarde2"
  8583. };
  8584. 3.9 JSON-object-literals 265
  8585. LET OP
  8586. Bij een JSON-object-literal gebruiken we dubbele aanhalligstekens.
  8587. De properties en de waarden coderen we binnen dubbele aanhalingstekens. De
  8588. mogelijke waarden voor de properties van een JSON-object-litral zijn:
  8589. • getallen: integer of fl oat
  8590. • tekst: string tussen dubbele aanhalingstekens " "
  8591. • boolean: true of false
  8592. • array: tussen vierkante hakjes [ ]
  8593. • object: tussen accolades { }
  8594. • null
  8595. Een JSON-object-literal mag geen methodes hebben. In de volgende opgave maken
  8596. we een persoon-object met drie properties.
  8597. • Opgave 20
  8598. Open json.html en voeg de volgende code eraan toe.
  8599. <script>
  8600. var student = {
  8601. "naam": "Jurson",
  8602. "leeftijd": 17,
  8603. "geslacht": "M"
  8604. };
  8605. </script>
  8606. In bovenstaande JSON-literal is 17 een getal, geen tekst, dus komt daarom niet tussen aanhalingstekens. Datatypes in JavaScript zijn in hoofdstuk 2 behandeld.
  8607. In deze opgave bevat het object student een datastructuur met drie properties:
  8608. naam, leeftijd en geslacht.
  8609. Objecten als properties van het object window
  8610. Het window-object krijgt het hoogste niveau in een webpage. Alle andere objecten
  8611. zijn properties van het window-object. De datastructuur ziet er als volgt uit:
  8612. Figuur 3.15
  8613. 266 3 OOP in JavaScript
  8614. Geneste JSON-object-literals
  8615. De properties van een JSON-object mogen van alle geldige datatypen zijn. Een
  8616. object mag ook sub-objecten bevatten.
  8617. • Opgave 21
  8618. Open json.html en voeg het volgende adres-object eraan toe.
  8619. var student = {
  8620. "naam": "Jurson",
  8621. "leeftijd": 17,
  8622. "geslacht": "M",
  8623. "adres": {
  8624. "straat": "Kruislaan 33",
  8625. "postcode": "1099TT",
  8626. "woonplaats": "Utrecht"
  8627. }
  8628. };
  8629. Je ziet dat het student-object een adres-object heeft gekregen. De structuur van het
  8630. student-object ziet er nu als volgt uit:
  8631. Figuur 3.16
  8632. Chaining properties
  8633. We kunnen de properties van een object lezen en wijzigen met behulp van chaining (ketenen, vastleggen). Via chaining kunnen we de hele datastructuur doorlopen en gegevens lezen of wijzigen. De syntaxis is als volgt:
  8634. object.subobject.property = "waarde";
  8635. Dat betekent dat:
  8636. window.student.naam = "Jurson";
  8637. hetzelfde is als:
  8638. student.naam = "Jurson";
  8639. 3.9 JSON-object-literals 267
  8640. • Opgave 22
  8641. Open json.html en voeg de volgende code eraan toe.
  8642. student.naam = "Jurson Davis";
  8643. console.log(student.naam);
  8644. console.log(student.adres.woonplaats);
  8645. Het resultaat zie je hieronder:
  8646. Jurson Davis
  8647. Utrecht
  8648. Literal-objecten bundelen
  8649. We kunnen een verzameling objecten bundelen binnen een array. In de volgende
  8650. opgave defi niëren we een verzameling studenten binnen een array.
  8651. • Opgave 23
  8652. Open json.html en voeg de volgende code eraan toe.
  8653. var studenten = [];
  8654. studenten[0] = {
  8655. "naam": "Jurson",
  8656. "leeftijd": 17,
  8657. "geslacht": "M",
  8658. "adres": {
  8659. "straat": "Kruislaan 33",
  8660. "postcode": "1099TT",
  8661. "woonplaats": "Utrecht"
  8662. }
  8663. };
  8664. studenten[1] = {
  8665. "naam": "Shireen ",
  8666. "leeftijd": 20,
  8667. "geslacht": "V",
  8668. "adres": {
  8669. "straat": "Eindstraat 55",
  8670. "postcode": "2867NN",
  8671. "woonplaats": "Amsterdam "
  8672. }
  8673. };
  8674. studenten[2] = {
  8675. "naam": "Sahra",
  8676. "leeftijd": 17,
  8677. "geslacht": "V",
  8678. "adres": {
  8679. "straat": "Hogestraat 23",
  8680. "postcode": "1190UU ",
  8681. "woonplaats": "Rotterdam"
  8682. }
  8683. };
  8684. 268 3 OOP in JavaScript
  8685. console.log(studenten[2].naam + '/' +
  8686. studenten[2].adres.woonplaats);
  8687. Het resultaat zie je hieronder:
  8688. Sahra/Rott erdam
  8689. In de volgende lab-opdracht codeer je een JSON-object-literal voor het object product.
  8690. • Lab 10
  8691. Open json.html en codeer de JSON-object-literals uit fi guur 3.17.
  8692. Figuur 3.17
  8693. Daarna codeer je console.log-opdrachten voor alle properties. Als alles goed verloopt, krijg je het volgende resultaat:
  8694. Product id: Aκκλ
  8695. Product merk: AUDI
  8696. Product prijs: ξπ.κκκ
  8697. Beschikbare kleuren: rood, blauw, zwart
  8698. 3.10 Lokale opslagcapaciteit (local storage)
  8699. In deze paragraaf kijken we naar functies met speciale coderingstechnieken in JavaScript. We kijken naar de volgende concepten:
  8700. • local storage schrijven
  8701. • local storage lezen
  8702. Aan het einde van deze paragraaf laat je de volgende opgaven door je docent controleren:
  8703. 3.10 Lokale opslagcapaciteit (local storage) 269
  8704. Planning Inleveren
  8705. Opgave 24
  8706. Lab 11
  8707. JavaScript heeft toegang tot de local storage op de harde schijf van de gebruiker.
  8708. Hier kunnen we tijdelijk JSON-object-literals opslaan en lezen. Om een JSONobject-literal te kunnen opslaan in local storage, moeten we eerst het object in een
  8709. string omzetten. Dit doen we als volgt:
  8710. tekst = JSON.stringify(JSONobject);
  8711. Daarna kunnen we de tekst van het object opslaan. Dit doen we als volgt:
  8712. localStorage.setItem(key, tekst);
  8713. In de volgende opgave slaan we de complete studentenarray met JSONobjectliterals op in local storage.
  8714. • Opgave 24
  8715. Open json.html en voeg de volgende code eraan toe.
  8716. for(x=0; x < studenten.lenght; x++)
  8717. {
  8718. localStorage.setItem
  8719. (x,JSON.stringify(studenten[x]));
  8720. }
  8721. console.log('Objecten opgeschreven in local storage.');
  8722. Als alles goed verloopt, zul je het volgende resultaat zien:
  8723. Objecten opgeschreven in local storage.
  8724. Local storage lezen
  8725. Om local storage te kunnen lezen, moeten we eerst alle items in local storage weer
  8726. omzetten naar JSON-object-literals. Dit doen we als volgt:
  8727. obj = JSON.parse(localStorage.getItem(key);
  8728. In de volgende opgave zetten we de items in local storage weer om naar JSONobject-literals. Vervolgens kunnen we de gegevens lezen.
  8729. • Lab 11
  8730. Open json.html en voeg de volgende code eraan toe.
  8731. for(x=0; x < studenten.lenght; x++)
  8732. {
  8733. obj = JSON.parse(localStorage.getItem(x));
  8734. console.log(obj.naam);
  8735. }
  8736. 270 3 OOP in JavaScript
  8737. Als alles goed verloopt, krijg je het volgende resultaat:
  8738. Jurson
  8739. Shireen
  8740. Sahra
  8741. In de meeste browsers kunnen we de items in local storage zien. Als we in de
  8742. JavaScript-console kijken en vervolgen op Local Storage klikken, zien we de opgeslagen objecten in local storage, zoals in fi guur 3.18:
  8743. Figuur 3.18 Local storage
  8744. 3.11 OOP webshop
  8745. In deze paragraaf maken we een webshop in objectgeoriënteerd JavaScript
  8746. (OOP JS). De naam van de webshop is ‘Computer Depot’. De webshop verkoopt
  8747. computeronderdelen zoals muizen, toetsenborden, beeldschermen enzovoort. De
  8748. webshop moet een Single Page Applicatie (SPA, een pagina met alleen HTML met
  8749. links naar JavaScript en CSS) worden. De eerste stap is het maken van een classdiagram voor een winkelmandje waarmee de users onderdelen kunnen kopen.
  8750. 1 Maak een class-diagram webBasket met de bijbehorende properties en methodes.
  8751. 2 Maak de productenpagina aan met minimaal drie producten en de properties zoals
  8752. prijs, merk enzovoort.
  8753. 3 Codeer de class webBasket met de bijbehorende methodes.
  8754. 4 De bestelde items kun je in een array of in een JSON-object in localStorage opslaan.
  8755. 5 Test alle methodes en lever de applicatie in.
  8756. Uitwerking
  8757. Het class-diagram voor Computer Depot ziet er als volgt uit:
  8758. 3.11 OOP webshop 271
  8759. Figuur 3.19
  8760. Planning Inleveren
  8761. Opgave 25 t/m 27
  8762. Lab 12
  8763. • Opgave 25
  8764. Codeer de productenpagina als volgt:
  8765. <body>
  8766. <img src="images/laptopcases.jpg" width="150px" alt=" " />
  8767. <br>Flip Laptop Cases Prijs 9.99
  8768. <form name="orderform"
  8769. action="computerpartdepot.html"
  8770. method="get" onsubmit="basket.addItem(this);">
  8771. <input type="hidden" name="id" value="1" />
  8772. <input type="hidden" name="product" value="Laptop Case" />
  8773. <input type="hidden" name="model" value="Flip" />
  8774. <input type="hidden" name="prijs" value="9.99" />
  8775. Aantal:
  8776. <input type="text" size=2 maxlength=3 name="aantal" value="1" />
  8777. <input type="image" src="images/basket.png" width="100px" />
  8778. </form>
  8779. </body>
  8780. We plaatsen ons product binnen een form-tag zodat we straks meer productenin
  8781. de webbasket kunnen toevoegen met:
  8782. onsubmit="basket.addItem(this);"
  8783. Hier maken we gebruik van de (this)-pointer zodat we de gegevens van dit item
  8784. kunnen toevoegen met de addItem-methode van het basket-object.
  8785. 272 3 OOP in JavaScript
  8786. • Opgave 26
  8787. Maak twee nieuwe producten aan. Ieder product krijgt zijn eigen form-tag.
  8788. • Opgave 27
  8789. We coderen nu het webBasket-object met functie-constructors als volgt:
  8790. function webBasket(){
  8791. this.getNamen = function(form) { ... };
  8792. this.getValues = function(form) { ... };
  8793. this.addItem = function(form) { ... };
  8794. this.deleteItem = function(key) { ... };
  8795. this.viewBasket = function() { ... };
  8796. this.emptyBasket = function() { ... };
  8797. };
  8798. We willen een addItem-methode maken die hergebruikt kan worden. In dit geval
  8799. betekent dit dat de methode altijd moet werken, zelfs wanneer het aantal form-elementen verandert. We moeten een manier vinden om de waarde en de naam van
  8800. een form-element op te halen. Vanuit de item-properties creëren we een JSONobject als volgt:
  8801. item = {
  8802. "id": id,
  8803. "product": product,
  8804. "model": model,
  8805. "prijs": prijs,
  8806. "aantal": aantal
  8807. };
  8808. Maar we willen de namen niet hard coderen, want als er een nieuwe property in
  8809. het formulier wordt toegevoegd, is onze code onbruikbaar en niet meer herbruikbaar in de nieuwe situatie. Bijvoorbeeld:
  8810. <input type="hidden" name="color" value="blue" />
  8811. De code moet dan als volgt herschreven worden:
  8812. item = {
  8813. "id": id,
  8814. "product": product,
  8815. "model": model,
  8816. "prijs": prijs,
  8817. "color": blue,
  8818. "aantal": aantal
  8819. };
  8820. Herbruikbare code
  8821. In de volgende code halen we het aantal form-elementen uit het formulier.
  8822. i = form.elements.length;
  8823. 3.11 OOP webshop 273
  8824. Vervolgens halen we de namen van de formulier-elementen eruit. Dit doen we als
  8825. volgt:
  8826. this.getNamen = function(form) {
  8827. i = form.elements.length;
  8828. namen = [];
  8829. for(x=0;x<i;x++){
  8830. namen.push(form.elements[x].name);
  8831. }
  8832. return namen;
  8833. };
  8834. Het resultaat is de array ['ID', 'product', 'model', 'prijs', 'aantal']
  8835. We doen hetzelfde met de waarden (values) van de elementen:
  8836. this.getValues = function(form) {
  8837. i = form.elements.length;
  8838. values = [];
  8839. for(x=0;x<i;x++){
  8840. values.push(form.elements[x].value);
  8841. }
  8842. return values;
  8843. };
  8844. Het resultaat is de array:
  8845. ['1', 'Laptop Case', 'Flip', '9.99', '1']
  8846. Het bestelde item willen we in de vorm van een JSON-object coderen en in local
  8847. storage opslaan. Dit doen we als volgt:
  8848. this.addItem = function(form) {
  8849. namen = this.getNamen(form);
  8850. values = this.getValues(form);
  8851. item = "{";
  8852. for(x=0;x<values.length;x++){
  8853. if(x==values.length-1){
  8854. item += '"'+namen[x]+'":'+'"'+values[x]+'"'+"}"
  8855. }else{
  8856. item += '"'+namen[x]+'":'+'"'+values[x]+'"'+",";
  8857. }
  8858. }
  8859. localStorage.setItem(values[0],item);
  8860. };
  8861. In deze oplossing hebben we de namen van de properties niet hard gecodeerd zodat de code herbruikbaar blijft.
  8862. In de laatste stap hebben we dit item in localStorage als volgt gecodeerd:
  8863. localStorage.setItem(values[0],item);
  8864. We gebruiken de ID van het item als de key in localStorage. Dit is handig voor als
  8865. we het item willen verwijderen, zoals in de volgende methode:
  8866. 274 3 OOP in JavaScript
  8867. this.deleteItem = function(key) {
  8868. localStorage.removeItem(key);
  8869. };
  8870. Om het winkelmandje (basket) leeg te maken coderen we de volgende methode:
  8871. this.emptyBasket = function(){
  8872. localStorage.clear();
  8873. };
  8874. De volgende listing is een samenvatting van het object webBasket:
  8875. function webBasket(){
  8876. this.getNamen = function(form) {
  8877. i = form.elements.length;
  8878. namen = [];
  8879. for(x=0;x<i;x++){
  8880. namen.push(form.elements[x].name);
  8881. }
  8882. return namen;
  8883. };
  8884. this.getValues = function(form) {
  8885. i = form.elements.length;
  8886. values = [];
  8887. for(x=0;x<i;x++){
  8888. values.push(form.elements[x].value);
  8889. }
  8890. return values;
  8891. };
  8892. this.addItem = function(form) {
  8893. namen = this.getNamen(form);
  8894. values = this.getValues(form);
  8895. item = "{";
  8896. for(x=0;x<values.length;x++){
  8897. if(x==values.length-1){
  8898. item += '"'+namen[x]+'":'+'"'+values[x]+'"'+"}";
  8899. }else{
  8900. item += '"'+namen[x]+'":'+'"'+values[x]+'"'+",";
  8901. }
  8902. }
  8903. localStorage.setItem(values[0],item);
  8904. };
  8905. this.deleteItem = function(key) {
  8906. localStorage.removeItem(key);
  8907. this.viewBasket();
  8908. };
  8909. this.emptyBasket = function(){
  8910. localStorage.clear();
  8911. };
  8912. }
  8913. • Lab 12
  8914. Maak de methode viewBasket in het object webBasket. Deze methode moet ervoor
  8915. zorgen dat de items in localstorage worden weergegeven. De methode moet ook
  8916. 3.11 OOP webshop 275
  8917. items verwijderen met de methode deleteItem() en emptyBasket(). Het resultaat
  8918. moet er als volgt uitzien:
  8919. Figuur 3.20
  8920.  
  8921. 277
  8922. 4 jQuery
  8923. 4.1 Basis van mobiele applicaties
  8924. De statistieken over de explosieve groei van mobiele websites laten zien hoe belangrijk de trend naar mobiel internet is. Er worden nu meer smartphones verkocht dan pc’s. Voor webdevelopers opent dit allerlei nieuwe mogelijkheden.
  8925. Planning Inleveren
  8926. Opgaven 1, 2
  8927. Er zijn grote verschillen tussen het ontwerpen van een standaardwebsite en een
  8928. mobiele website. Een bestaande website kan niet zomaar omgezet worden naar een
  8929. mobiele website. De designer moet ervoor zorgen dat een smartphone alleen de
  8930. belangrijkste informatie van de site op een logische manier weergeeft.
  8931. Gebruikers ervaren mobiel internet ook anders. Ten eerste is de snelheid van mobiele verbindingen lager dan die van vaste breedbandverbindingen.
  8932. Ten tweede is er een groot verschil in beeldschermresolutie tussen smartphones en
  8933. desktops. In fi guur 4.1 zie je een website en een app op het scherm van een smartphone.
  8934. Figuur 4.1 Een website en een app op het scherm van een smartphone
  8935. 278 4 jQuery
  8936. Wat is een app?
  8937. App is de afkorting voor applicatie of mobiele applicatie. Een app is software ontwikkeld voor de smartphone of de tablet. Deze apps voeren bepaalde functies uit,
  8938. bijvoorbeeld games, opzoeken van reistijden of het bestellen van tickets.
  8939. Apps kunnen gebruikmaken van functies van de smartphone, zoals het global positioning system (afgekort tot gps en gebruikt door Google Maps) , de temperatuur
  8940. meten, de noordzuidrichting bepalen enzovoort.
  8941. Er wordt onderscheid gemaakt tussen native apps, webapps of cross-platform
  8942. webapps, en hybride apps.
  8943. Native apps
  8944. Een native app is een applicatie die geprogrammeerd is voor een specifi ek platform, zoals Windows, iPhone of Android. Native apps werken binnen een gesloten
  8945. systeem en zijn daarvan afhankelijk voor de distributie en het winstmodel.
  8946. Kenmerken van native apps:
  8947. • ze worden gedownload en draaien op het besturingssysteem van de smartphone of
  8948. tablet;
  8949. • ze werken met of zonder internetverbinding;
  8950. • ze zijn specifi ek ontworpen voor een smartphone of tablet;
  8951. • ze mogen gebruikmaken van toestelfuncties zoals het adresboek of gps;
  8952. • ze worden gedistribueerd binnen het systeem van de specifi eke smartphone of tablet, zoals de Apple Store (iPhone);
  8953. • ze kunnen gebruikmaken van local storage of web storage.
  8954. Elk platform heeft zijn eigen programmeertaal voor native apps:
  8955. • voor de iPhone programmeer je in Swift;
  8956. • voor Android programmeer je in Java;
  8957. • voor Windows Phone programmeer je in C.
  8958. Webapps
  8959. Webapps zijn mobiele applicaties die platformonafhankelijk zijn en draaien op de
  8960. browsers van alle smartphones of tablets. De kenmerken zijn:
  8961. • webapps draaien op alle smartphones en tablets;
  8962. • basiscode in HTML, CSS en JavaScript wordt ondersteund door iPhone, Android,
  8963. Windows 7 en alle andere smartphones;
  8964. • webapps en updates hoef je niet te downloaden;
  8965. • webapps kunnen omgezet worden in native apps en dan gedistribueerd binnen de
  8966. verschillende systemen;
  8967. • webapps mogen gebruikmaken van toestelfuncties zoals gps, het adresboek, local
  8968. storage en web storage.
  8969. Op het moment dat een webapp volledig ontwikkeld en getest is, kun je je webapp
  8970. in een appstore publiceren. Kijk voor verdere instructies op de site van Phonegap:
  8971. www.phonegap.com.
  8972. 4.1 Basis van mobiele applicaties 279
  8973. Hybride apps
  8974. Hybride apps maken gebruik van een combinatie van native en webtechnieken. Zo
  8975. gebruikt Whattsapp een server voor de opslag van gegevens, maar kun je ook native technieken als een camera toepassen.
  8976. Native apps, webapps of hybride apps?
  8977. Het doel van je project bepaalt of je voor een native app, een webapp of een hybride app kiest. Als je een interactieve game wilt programmeren, kun je beter een
  8978. native app kiezen. Als je een breder publiek wilt bereiken, bijvoorbeeld als je een
  8979. applicatie voor een krant of tijdschrift maakt, kun je beter een webapp programmeren. In het onderstaande schema staat een globaal overzicht wat je kan helpen
  8980. bij de keus.
  8981. Kenmerk Native Web Hybrid
  8982. Geen commissie aan store   
  8983. Geen vertraging bij acceptatie store  
  8984. Icoon op startscherm   
  8985. Makkelijk vinden van de app   
  8986. Notifi caties mogelijk  
  8987. Platformonafhankelijk  
  8988. Prestaties bij o.a. animatie   
  8989. Te vinden door zoekmachines  
  8990. Tegen lage kosten te realiseren  
  8991. Toegang tot functies van toestel   
  8992. Zonder internet te gebruiken  
  8993. Design van webapps
  8994. Er is een scala aan touchscreens en mobiele apparatuur, van smartphones en tablets tot e-readers. In de ideale situatie kan een design op de juiste schaal bij ieder
  8995. apparaat moeiteloos toegepast worden. Tot nu toe maakte het grote aantal verschillende apparaten en besturingssystemen voor mobiel internet het ontwerpen
  8996. van cross-platform-applicaties ingewikkeld.
  8997. Er zijn gelukkig nieuwe ontwikkelingen in mobiel webdesign die deze complexiteit
  8998. wegnemen. Het ontwikkelen van cross-platform-apps voor tablet en smartphone
  8999. is een stuk eenvoudiger geworden door nieuwe technologieën als HTML5, CSS3,
  9000. jQuery en Materials.
  9001. Frameworks voor mobiele applicaties
  9002. Een framework is een softwarebibliotheek met herbruikbare code voor het ontwikkelen van dynamische websites of apps. Er zijn veel gratis frameworks beschikbaar.
  9003. We geven een overzicht van de bekendste frameworks voor het ontwikkelen van
  9004. apps.
  9005. 280 4 jQuery
  9006. Appcelerator
  9007. Je kunt een account maken bij Appcelerator en in de cloud je eigen apps ontwikkelen: www.appcelerator.com.
  9008. AppInventor
  9009. Je kunt specifi ek voor het Android-platform-apps ontwikkelen met de Software
  9010. Development Kit (SDK) voor Android. Deze kun je downloaden van uit https://
  9011. developer.android.com/sdk/index.html.
  9012. Windows Phone
  9013. Microsoft Visual Studio Express is een platform voor het ontwikkelen van apps
  9014. voor de Windows Phone:
  9015. www.microsoft.com/visualstudio
  9016. jQuery Mobile
  9017. jQuery Mobile is een framework gebaseerd op jQuery en jQuery-UI. Alle documentatie over jQuery Mobile vind je op jquerymobile.com.
  9018. jQuery Mobile biedt bijvoorbeeld een user interface (afgekort tot UI) voor bijna
  9019. alle mobiele platforms. Vroeger was het noodzakelijk om apps per mobiel apparaat
  9020. te ontwerpen. jQuery is heel geschikt voor het ontwerpen van cross-platformwebapps.
  9021. In dit boek gebruiken we jQuery Mobile voor het ontwikkelen en testen van een
  9022. mobiele cross-platform-webapp. Om jQuery Mobile te downloaden moet je de
  9023. volgende links in je script coderen:
  9024. <link rel="stylesheet"
  9025. href="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" />
  9026. <script
  9027. src="http://code.jquery.com/jquery-1.11.1.min.js">
  9028. </script>
  9029. <script src="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js">
  9030. </script>
  9031. Een lokale testomgeving opzetten
  9032. Om te kunnen beginnen met het coderen van je cross-platform-apps moet je eerst
  9033. een testomgeving op je pc of laptop confi gureren. Hiervoor installeren we de volgende software:
  9034. • een lokale webserver;
  9035. • een emulator;
  9036. • een editor of ontwikkelomgeving.
  9037. De webserver Apache
  9038. Apache is een webserver die je lokaal kunt gebruiken om op je pc of laptop je apps
  9039. te testen. Ga naar de site Apache Friends: www.apachefriends.org.
  9040. 4.1 Basis van mobiele applicaties 281
  9041. Download en installeer XAMPP. Dit pakket bevat onder meer de webserver Apache. Na het downloaden en installeren start je de server door XAMPP Control
  9042. Panel te starten. Klik op de knop Start om de server te starten (fi guur 4.2).
  9043. Figuur 4.2 XAMPP Control Panel
  9044. Opera Mobile Emulator
  9045. Een mobiele emulator is software die een of meer mobiele apparaten op je pc of
  9046. laptop nadoet, zodat je je applicaties kunt testen. Het is dus niet meer nodig om
  9047. allerlei mobiele apparatuur aan te schaff en om je cross-platform-apps te kunnen
  9048. testen. Eenvoudig in gebruik is Opera Mobile Emulator 12 of hoger. Je kunt deze
  9049. emulator downloaden van
  9050. http://www.opera.com/nl/developer/mobile-emulator
  9051. Na het downloaden en installeren van Opera Mobile Emulator start je de emulator
  9052. op. Vervolgens zie je het hoofdvenster (fi guur 4.3).
  9053. Figuur 4.3 Opera Mobile Emulator
  9054. Opera Mobile Emulator kan verschillende smartphones en tablets ‘nadoen’. Je
  9055. selecteert een profi el en het geselecteerde apparaat wordt gesimuleerd. Als je bijvoorbeeld wilt zien hoe je webapp eruit zal zien op een tablet, kies je het profi el
  9056. van de Samsung Galaxy Tab. Klik vervolgens op de knop Launch en er verschijnt
  9057. een venster met de weergavekenmerken van de tablet.
  9058. 282 4 jQuery
  9059. Je kunt tegelijkertijd een tweede simulatie starten door in het hoofdvenster een
  9060. nieuw profi el te selecteren, bijvoorbeeld de smartphone Samsung Galaxy S II. Klik
  9061. op Launch en de emulator wordt gestart.
  9062. Figuur 4.4 Simulatie van de Samsung Galaxy S II
  9063. De ontwikkelomgeving
  9064. Een ontwikkelomgeving kan bestaan uit een eenvoudige HTML-editor, zoals Sublime of Brackets, of zelfs Kladblok in Windows.
  9065. Na het installeren van je HTML-editor kun je beginnen met het coderen van je
  9066. applicatie.
  9067. In plaats van een eenvoudige editor kun je kiezen voor een volledige ontwikkelomgeving: een Integrated Development Environment (IDE). Voorbeelden zijn Microsoft WebMatrix en NetBeans van Sun. Deze IDE’s bieden onder meer controle
  9068. op syntaxis en automatisch aanvullen.
  9069. De webapp Hello World
  9070. In deze paragraaf coderen we een eenvoudige webapp om te controleren of de
  9071. testomgeving goed werkt.
  9072. 4.1 Basis van mobiele applicaties 283
  9073. • Opgave 1
  9074. Open je HTML-editor, typ het volgende script over en sla het op als hello.html in
  9075. de map htdocs van je lokaal geïnstalleerde Apache-webserver. De onderstreepte
  9076. regels typ je in een regel achter elkaar zonder een Enter te geven.
  9077. <!DOCTYPE html>
  9078. <html>
  9079. <head>
  9080. <title>FlashTix</title>
  9081. <meta name="viewport"
  9082. content="width=device-width, initial-scale=1">
  9083. <link
  9084. rel="stylesheet"
  9085. href="http://code.jquery.com/mobile/1.4.5/
  9086. jquery.mobile-1.4.5.min.css" />
  9087. <script src="http://code.jquery.com/jquery-1.11.1.min.js">
  9088. </script>
  9089. <script
  9090. src="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js">
  9091. </script>
  9092. </head>
  9093. <body>
  9094. <div data-role = "page" class = "page" id = "homepage">
  9095. <div class = "header" data-role = "header">
  9096. <h1>Header</h1>
  9097. </div><!-- /header -->
  9098. <div class="content" id="homecontent" data-role="content">
  9099. <h1>Hello world</h1>
  9100. </div><!-- /homecontent -->
  9101. <div class="footer" data-role="footer" >
  9102. <h1>Footer</h1>
  9103. </div><!-- /footer -->
  9104. </div><!-- /homepage -->
  9105. </body>
  9106. </html>
  9107. Om het resultaat van het script Hello world te kunnen testen typ je de volgende
  9108. URL in het adresvak van de mobiele simulator:
  9109. localhost/hello.html
  9110. Het resultaat zie je hieronder:
  9111. 284 4 jQuery
  9112. Figuur 4.5
  9113. Het element <meta viewport>
  9114. Met het element <meta viewport> zeggen we dat onze pagina vertoond wordt in een
  9115. mobiele browser in plaats van een browser op een desktop. Dit doen we als volgt:
  9116. <meta name= "viewport"
  9117. content = "width=device-width, initialscale=1">
  9118. Content Delivery Network (CDN)
  9119. Met de volgende code:
  9120. <script src="http://code.jquery.com/jquery-1.11.1.min.js">
  9121. </script>
  9122. specifi ceren we het Content Delivery Network van jQuery Mobile. Een CDN is
  9123. een netwerkserver voor het distribueren van statische content zoals afbeeldingen,
  9124. audio, video’s, CSS en de jQuery-bibliotheek.
  9125. Data-role
  9126. In het element <body> plaatsen we meerdere <div>-elementen met verschillende
  9127. rollen. In de volgende tabel zie je de verschillende rollen en hun betekenis.
  9128. 4.1 Basis van mobiele applicaties 285
  9129. Tabel 5.1 Data-roles
  9130. Data-role Betekenis
  9131. page Wrapper voor de mobiele pagina
  9132. header Wrapper voor de header van de pagina
  9133. content Wrapper voor de content van de pagina
  9134. footer Wrapper voor de footer van de pagina
  9135. De data-role="page" is de ‘container’ of wrapper van de mobiele pagina:
  9136. <div data-role="page" class="page" id="homepage">
  9137. De data-role="header" is de wrapper of 'container' van de header-balk:
  9138. <div class = "header" data-role = "header">
  9139. <h1>Header</h1>
  9140. </div><!-- /header -->
  9141. De data-role="content" is de content van de pagina:
  9142. <div class="content" id="homecontent" data-role="content">
  9143. <h1>Hello world</h1>
  9144. </div><!-- /homecontent -->
  9145. De data-role="footer" is de wrapper voor de footer van de pagina:
  9146. <div class="footer" data-role="footer" >
  9147. <h1>Footer</h1>
  9148. </div><!-- /footer -->
  9149. • Opgave 2
  9150. Open hello.html en vervang in de content "Hello world" door de volgende code:
  9151. <p>Webapps zijn cross-platform. Dit betekent dat ze werken
  9152. op alle smartphones en tablets.</p>
  9153. <p>Webapps kunnen omgezet worden in native apps en gedistribueerd door alle
  9154. appstores.</p>
  9155. Typ in de adresbalk van de emulator de URL
  9156. localhost/hello.html
  9157. In fi guur 4.6 zie je de weergave van de homepage in Opera Mobile Emulator.
  9158. 286 4 jQuery
  9159. Figuur 4.6 Het resultaat van opgave 2
  9160. 4.2 Een testomgeving in de cloud opzetten
  9161. De tweede optie is om een testomgeving in de cloud op te zetten.
  9162. Planning Inleveren
  9163. Opgave 3
  9164. Een van de leukste Integrated Developmemt Environments (IDE) in de cloud is
  9165. Cloud 9. Maak een gratis Cloud 9-account om webapps in de cloud te programmeren. De site van Cloud 9 (https://c9io/) ziet er als volgt uit:
  9166. 4.3 De webapp FlashTix 287
  9167. Figuur 4.7
  9168. • Opgave 3
  9169. Herhaal opgave 1 en 2. Codeer hello.html in de Cloud 9 IDE. Na het coderen tik je
  9170. op de Run-knop. Daarna kun je op de browser van je mobiele telefoon de URL van
  9171. je script intypen. Als alles goed verloopt zie je nu de Hello world!-pagina op je mobiele telefoon.
  9172. 4.3 De webapp FlashTix
  9173. In deze paragraaf ontwerp en realiseer je een webapp met de naam FlashTix. Tijdens het proces maak je kennis met verschillende internettechnologieën, zoals
  9174. HTML5, CSS3, JavaScript en jQuery Mobile. Het doel van de applicatie is klanten
  9175. de mogelijkheid te bieden om gratis lastminute-tickets te bestellen voor popconcerten.
  9176. Planning Inleveren
  9177. Opgave 4 t/m 8
  9178. homepage
  9179. Mappenstructuur voor het project
  9180. Na de installatie van Apache open je de rootmap htdocs en maak je een map met
  9181. de naam fl ashtix. In de map fl ashtix sla je de projectbestanden op: HTML, JavaScript, afbeeldingen en CSS.
  9182. Figuur 4.8 Mappenstructuur voor de webapp FlashTix
  9183. 288 4 jQuery
  9184. De homepage
  9185. De homepage krijgt een element <header> met daarin de navigatie. Onder de navigatie komt het element <content> en onderaan komt het element <footer>. In
  9186. het functioneel ontwerp van de homepage maken we een beschrijving van hoe de
  9187. homepage eruit moet zien.
  9188. Functioneel ontwerp van de homepage
  9189. Het functioneel ontwerp van de homepage bevat een draadmodel (wireframe,
  9190. eenvoudige, kale tekening) van de homepage, de navigatie-elementen en de content-elementen. Om je draadmodel te tekenen kun je de gratis software Balsamiq
  9191. Mockups downloaden en installeren. Het volgende draadmodel is met Balsamiq
  9192. gemaakt.
  9193. Figuur 4.9 Draadmodel van de homepage
  9194. De beschrijving van de homepage ziet er als volgt uit:
  9195. Functioneel ontwerp van de homepage
  9196. Beschrijving De homepage stelt de navigatie van de applicatie op en
  9197. toont een concertposter met logo
  9198. Header Navigatie-elementen
  9199. Link naar homepage
  9200. Link naar lastminute-pagina
  9201. Content Content-elementen
  9202. Concertposter
  9203. Footer Navigatie-elementen
  9204. Link naar agendapagina
  9205. Link naar locatiepagina
  9206. Opmerkingen De homepage moet een welkomstbericht weergeven
  9207. 4.3 De webapp FlashTix 289
  9208. Codering van de homepage
  9209. Na het functioneel ontwerp van de homepage kunnen we beginnen met het coderen van de pagina. In de volgende opgave coderen we de homepage volgens het
  9210. functioneel ontwerp.
  9211. • Opgave 4
  9212. Typ het volgende over en sla het op als index.html in de map fl ashtix in de map
  9213. htdocs. De onderstreepte regels typ je in één regel achter elkaar zonder een Enter
  9214. te geven.
  9215. <!DOCTYPE html>
  9216. <html>
  9217. <head>
  9218. <title>FlashTix</title>
  9219. <meta name="viewport"
  9220. content="width=device-width, initial-scale=1">
  9221. <link
  9222. rel="stylesheet"
  9223. href="https://code.jquery.com/mobile/1.4.5/jquery.
  9224. mobile-1.4.5.min.css" />
  9225. <script src="https://code.jquery.com/jquery-1.11.1.min.js">
  9226. </script>
  9227. <script src="https://code.jquery.com/mobile/1.4.5/
  9228. jquery.mobile-1.4.5.min.js">
  9229. </script>
  9230. <link rel="stylesheet" href="flashtix.css" />
  9231. <script src="flashtix.js"></script>
  9232. </head>
  9233. <body>
  9234. <div data-role="page" class="page" id="homepage">
  9235. . . .
  9236. </div><!-- /homepage -->
  9237. </body>
  9238. </html>
  9239. Op de puntjes gaan we de homepage opbouwen.
  9240. Data-role= "page"
  9241. In het element <body> heeft het eerste element <div> het attribuut data-role="page"
  9242. gekregen:
  9243. <div data-role="page" class="page" id="homepage">
  9244. Het attribuut data-role="page" defi nieert de pagina die zichtbaar wordt op je
  9245. smartphone of tablet.
  9246. Header van de homepage
  9247. In de volgende opgave coderen we het header-element van de homepage. Dit doen
  9248. we volgens het functioneel ontwerp.
  9249. 290 4 jQuery
  9250. • Opgave 5
  9251. Open index.html en voeg de volgende header toe op de puntjes van de homepage:
  9252. <div class="header" data-role="header" data-theme="b">
  9253. <div class="nav" data-role="controlgroup" >
  9254. <div class="ui-grid-b" >
  9255. <div class="ui-block-a" >
  9256. <a class="knop" href="#homepage"
  9257. data-role="button"
  9258. data-icon="home"
  9259. data-iconpos="left">Home</a>
  9260. </div>
  9261. <div class="ui-block-b">
  9262. <a class="knop" href="#homepage"
  9263. data-role="button" > Welkom </a>
  9264. </div>
  9265. <div class="ui-block-c">
  9266. <a class="knop" href="#lastminutepage"
  9267. data-role="button"
  9268. data-icon="arrow-r"
  9269. data-iconpos="left"
  9270. data-transition="slidedown">Lastminute</a>
  9271. </div>
  9272. </div> <!-- /grid-b -->
  9273. </div> <!-- nav -->
  9274. </div><!-- /header -->
  9275. Het resultaat is de header van de homepage in fi guur 4.10.
  9276. Figuur 4.10
  9277. Data-role = "header"
  9278. Het header-element gebruiken we voor de navigatie door de applicatie. Door middel van knoppen met links naar de andere pages kunnen we de navigatie vastleggen
  9279. volgens het functioneel ontwerp.
  9280. Data-role = "controlgroup"
  9281. Met het attribuut data-role="controlgroup" kunnen we elementen groeperen. Zo
  9282. kunnen we in één keer attributen voor de hele groep defi niëren.
  9283. <div class="nav" data-role="controlgroup">
  9284. class = "ui-grid-b"
  9285. jQuery Mobile heeft grid-classes. Met de class "ui-grid-b" bijvoorbeeld maken we
  9286. een div met drie kolommen, met de class "ui-grid-a" met twee kolommen.
  9287. 4.3 De webapp FlashTix 291
  9288. class = "ui-block-a"
  9289. Wanneer je het grid gebruikt moet je ook de kolommen defi niëren als block-a en
  9290. block-b.
  9291. Data-theme = "b"
  9292. jQuery Mobile kent twee thema's: "a" en "b" of licht en donker.
  9293. Data-role= "button"
  9294. Het attribuut data-role="button" defi nieert een klikbare knop. Button-elementen
  9295. gebruiken we voor de navigatie, zodat de gebruiker intuïtief naar de andere pagina’s
  9296. van de applicatie kan navigeren. Het attribuut href= geeft de naam aan van de pagina waar je naartoe wilt navigeren.
  9297. Data-transition
  9298. Data-transitions zijn transitie-eff ecten bij het linken naar een nieuwe pagina. In
  9299. dit geval willen we een slidedown-eff ect zien bij het verschijnen van de lastminutepagina.
  9300. <a class="knop" href="#lastminutepage"
  9301. data-role="button"
  9302. data-transition="slidedown">Lastminute</a>
  9303. De mogelijke opties voor data-transitions (overgang van ene pagina naar andere)
  9304. zijn:
  9305. • slide
  9306. • slidedown
  9307. • slideup
  9308. • pop
  9309. • fade
  9310. • fl ip
  9311. Content van de homepage
  9312. Volgens het functioneel ontwerp moet de content van de homepage een concertposter met een logo zijn.
  9313. • Opgave 6
  9314. Selecteer en bewerk een foto voor de concertposter op je homepage. Open index.
  9315. html en voeg het volgende content-element onderaan het header-element toe.
  9316. <div class="content" id="homecontent" data-role="content">
  9317. <br><br>
  9318. <h1>FlashTix</h1>
  9319. <img id="poster" class="poster" src="poster.jpg">
  9320. </div><!-- einde homecontent -->
  9321. 292 4 jQuery
  9322. Data-role= "content"
  9323. In data-role="content" plaatsen we het hoofdthema van de page. In ons geval is dat
  9324. de naam van de webapp FlashTix met een poster.
  9325. Footer van de homepage
  9326. In het footer-element kunnen we extra navigatie of extra informatie over het bedrijf, de auteur en het copyright plaatsen. Het footer-element van de homepage
  9327. gaan we gebruiken voor speciale links naar een agendapagina en naar een locatiepagina. De agendapagina en de locatiepagina coderen we in paragraaf 4.15 en 4.16.
  9328. • Opgave 7
  9329. Open index.html en voeg het volgende footer-element onderaan het contentelement toe.
  9330. <div class="footer" data-role="footer" data-theme="b">
  9331. <div class="nav" data-role="controlgroup">
  9332. <div class="ui-grid-a">
  9333. <div class="ui-block-a">
  9334. <a class="knop" href="#agendapage"
  9335. data-role="button"
  9336. data-icon="grid"
  9337. data-iconpos="left">Agenda</a>
  9338. </div>
  9339. <div class="ui-block-b">
  9340. <a class="knop" href="#locationpage"
  9341. data-role="button"
  9342. data-icon="search"
  9343. data-iconpos="left">Location</a>
  9344. </div>
  9345. </div><!-- /grid-a -->
  9346. </div> <!-- /nav -->
  9347. </div><!-- /footer -->
  9348. Het resultaat met footer zie je hieronder:
  9349. 4.3 De webapp FlashTix 293
  9350. Figuur 4.11
  9351. Data-role = "footer"
  9352. In data-role="footer" hebben we ook een controlgroup voor de navigatie naar twee
  9353. speciale pagina’s gecodeerd: de agendapagina en de locatiepagina.
  9354. Design van de homepage
  9355. Je ziet dat de knoppen in de header en footer niet even breed en niet gecentreerd
  9356. zijn. Dit stellen we in met CSS3-stijlen.
  9357. In de code van de homepage hebben we de volgende link naar het bestand fl ashtix.
  9358. css gecodeerd:
  9359. <link rel="stylesheet" href="flashtix.css" />
  9360. In de volgende opgave beginnen we met het coderen van het CSS-stijlenbestand
  9361. voor de app FlashTix.
  9362. • Opgave 8
  9363. Typ het volgende over en sla het op als fl ashtix.css.
  9364. .page{
  9365. margin: none;
  9366. width: 100%;
  9367. height: 90%;
  9368. }
  9369. .header{
  9370. width: 100%;
  9371. text-align: center;
  9372. }
  9373. 294 4 jQuery
  9374. .footer {
  9375. width: 100%;
  9376. text-align: center;
  9377. position: fixed;
  9378. bottom: 0px;
  9379. }
  9380. .nav{
  9381. width: 100%;
  9382. }
  9383. a{
  9384. width: 100%;
  9385. }
  9386. .content{
  9387. text-align: center;
  9388. margin: none;
  9389. padding: 0px;
  9390. width: 100%;
  9391. height: 100%;
  9392. }
  9393. .melding{
  9394. font-size: 1.5rem;
  9395. color: red;
  9396. }.
  9397. albums{
  9398. border-radius: 50%;
  9399. }
  9400. Het resultaat van deze opgave zie je in fi guur 4.12.
  9401. Figuur 4.12 Homepage met CSS-stijlen
  9402. Volgens het functioneel ontwerp zijn alle pagina’s in drie onderdelen ingedeeld:
  9403. • header
  9404. • content
  9405. • footer
  9406. 4.3 De webapp FlashTix 295
  9407. De data-role="button" defi nieert een klikbare knop. Button-elementen kunnen
  9408. gebruikmaken van pictogrammen, zodat de gebruiker intuïtief weet wat de functie
  9409. van de knop is.
  9410. Het attribuut data-icon
  9411. Een data-icon in een button-element gebruiken we om de navigatie voor de gebruikers van de applicatie zo intuïtief mogelijk te maken. In tabel 5.2 zie je een overzicht van pictogrammen die beschikbaar zijn voor het button-element.
  9412. Tabel 5.2 Mogelijke waarden voor data-icon
  9413. Data-icon Betekenis
  9414. arrow-l pijl naar links
  9415. arrow-r pijl naar rechts
  9416. arrow-u pijl naar boven
  9417. arrow-d pijl naar beneden
  9418. delete verwijderen
  9419. plus toevoegen
  9420. minus verwijderen
  9421. check aanvinken
  9422. refresh vernieuwen
  9423. star ster
  9424. info info
  9425. home home
  9426. search zoek
  9427. In fi guur 4.13 zien we een weergave van de pictogrammen voor de button-elementen.
  9428. Figuur 4.13 Pictogrammen voor knoppen
  9429. Het attribuut data-iconpos
  9430. Het attribuut data-iconpos bepaalt op welke positie van de knop het pictogram
  9431. geplaatst moet worden. In tabel 2.2 zie je een overzicht van de mogelijke posities
  9432. voor een pictogram op een knop.
  9433. 296 4 jQuery
  9434. Tabel 5.3 Mogelijke waarden voor dataiconpos
  9435. Data-iconpos Betekenis
  9436. left links geplaatst
  9437. top bovenaan geplaatst
  9438. bottom onderaan geplaatst
  9439. notext knop zonder tekst
  9440. 4.4 De lastminute-pagina
  9441. In deze paragraaf maken we een functioneel ontwerp voor de lastminute-pagina
  9442. om vervolgens de codering van de pagina te voltooien.
  9443. Planning Inleveren
  9444. Opgaven 9 t/m 15
  9445. lastminute-pagina
  9446. Functioneel ontwerp
  9447. Het functioneel ontwerp van de lastminute-pagina geeft de navigatie en de content
  9448. van de pagina aan.
  9449. Figuur 4.14 Draadmodel van de lastminute-pagina
  9450. De beschrijving van de pagina is als volgt:
  9451. 4.4 De lastminute-pagina 297
  9452. Functioneel ontwerp van de lastminute-pagina
  9453. Beschrijving De lastminute-pagina toont een lijst met lastminute-tickets voor concerten
  9454. Header Navigatie-elementen
  9455. Link naar vorige pagina
  9456. Link naar homepageina
  9457. Link naar bestelpagina
  9458. Content Content-elementen concertenlijst
  9459. Footer-element Navigatie-elementen
  9460. Link naar agendapagina
  9461. Link naar locatiepagina
  9462. Opmerkingen Vanuit de concertlijst maak je links naar biografi epagina’s van de artiesten
  9463. Codering van de lastminute-pagina
  9464. In deze paragraaf coderen we de lastminute-pagina als een lijst met concerten.
  9465. In de navigatie van de homepage hebben we de tag <a> met data-role="button" en
  9466. href="#lastminutepage" als volgt gecodeerd:
  9467. <a class="knop" href="#lastminutepage" data-role="button"
  9468. data-icon="arrow-r" data-iconpos="left">Lastminute</a>
  9469. Met deze knop maken we een link naar de lastminute-pagina. Het bestand index.
  9470. html mag meerdere data-role="page" hebben. Een nieuwe pagina voegen we toe
  9471. door een nieuw element <div data-role="page"> aan toe te voegen. In de volgende
  9472. opgave coderen we de lastminute-pagina onderaan de homepage.
  9473. • Opgave 9
  9474. Open index.html en codeer het volgende element <div data-role="page"> onderaan de homepage.
  9475. <div data-role="page" id="lastminutepage">
  9476. ...
  9477. </div><!-- einde lastminutepage -->
  9478. Op de puntjes coderen we in de komende opgaven de header-, content- en footerelementen.
  9479. In deze opgave coderen we het header-element van de lastminute-pagina volgens
  9480. het functioneel ontwerp.
  9481. • Opgave 10
  9482. Open index.html en voeg het header-element van de lastminute-pagina eraan toe.
  9483. Codeer het header-element met de navigatie naar voorbeeld van fi guur 4.15. De
  9484. navigatie van zowel de knop Home als de knop Vorige moet naar de homepage verwijzen. De knop Bestel verwijst naar de bestelpagina. De bestelpagina maken we in
  9485. de volgende paragraaf.
  9486. 298 4 jQuery
  9487. Figuur 4.15
  9488. Content van de lastminute-pagina
  9489. De content van de lastminute-pagina komt tussen het header- en het footer-element te staan. De content is een lijst met lastminute-tickets voor concerten. Hiervoor gebruiken we data-role="listview".
  9490. Data-role = "listview"
  9491. jQuery Mobile kent data-role="listview" toe aan het element <ul>. Een listview
  9492. coderen we bijvoorbeeld als volgt:
  9493. <ul data-role="listview" data-theme="a">
  9494. <li><a href="acura.html">Acura</a></li>
  9495. <li><a href="audi.html">Audi</a></li>
  9496. <li><a href="bmw.html">BMW</a></li>
  9497. </ul>
  9498. • Opgave 11
  9499. Open index.html en voeg het volgende content-element onderaan het headerelement toe:
  9500. <div data-role="content" class="content" id="lastminutecontent"><br>
  9501. <ul data-role="listview" >
  9502. <li id="pop" data-role="list-divider"
  9503. data-theme="b">POP</li>
  9504. <li id="shakira-concert">
  9505. <a href="#shakira-biopage">
  9506. <img class="poster" src="shakiraposter.jpg"/>
  9507. <h3>Shakira</h3>
  9508. <p>AmsterdamArena</p>
  9509. <p>Vandaag 22:00 uur</p>
  9510. </a>
  9511. <a href="#shakira-biopage"
  9512. data-transition="flip">
  9513. </a>
  9514. </li>
  9515. </ul><!--/listview -->
  9516. </div><!--/content -->
  9517. Het resultaat van deze opgave zie je in fi guur 4.16.
  9518. 4.4 De lastminute-pagina 299
  9519. Figuur 4.16 De lastminute-pagina
  9520. In het element <li> voor het concert van Shakira hebben we een foto en informatie
  9521. over het concert geplaatst, plus een link naar de biopagina van Shakira:
  9522. <a href="#shakira-biopage" data-transition="slideup">
  9523. Data-role = "list-divider"
  9524. Met data-role="list-divider" kunnen we een lijst in subgroepen opsplitsen. We
  9525. kunnen bijvoorbeeld de categorie POP-concerten als een subgroep defi niëren:
  9526. <li id="pop" data-role="list-divider" data-theme="b">POP</li>
  9527. Vervolgens kunnen we een tweede subgroep voor de categorie JAZZ defi niëren:
  9528. <li id="jazz" data-role="list-divider"
  9529. data-theme="b">JAZZ</li>
  9530. • Opgave 12
  9531. Open index.html en voeg een nieuw POP-concert onder het Shakira-concert toe.
  9532. • Opgave 13
  9533. Maak een nieuwe data-role="list-divider" voor JAZZ-concerten en voeg een jazzconcert toe.
  9534. • Opgave 14
  9535. Maak een nieuwe data-role="list-divider" voor ROCK-concerten en voeg een
  9536. rockconcert toe.
  9537. In de volgende opgave coderen we het footer-element van de lastminute-pagina
  9538. volgens het functioneel ontwerp.
  9539. • Opgave 15
  9540. Open index.html en voeg het footer-element van de lastminute-pagina eraan toe.
  9541. Codeer het footer-element exact zoals het footer-element van de homepage.
  9542. Het resultaat van bovenstande opgaven zie je hieronder:
  9543. 300 4 jQuery
  9544. Figuur 4.17 De lastminute-pagina
  9545. 4.5 De biopagina
  9546. De biopagina is de pagina waar de gebruiker biografi sche informatie en video’s over
  9547. de artiest kan vinden. In deze paragraaf ontwerpen we de biopagina volgens het
  9548. functioneel ontwerp dat we nu eerst gaan maken.
  9549. Planning Inleveren
  9550. Opgaven 16 t/m 21
  9551. biopagina
  9552. Functioneel ontwerp
  9553. Het functioneel ontwerp van de biopagina geeft de navigatie en de content van de
  9554. page aan.
  9555. De beschrijving van de biopagina ziet er als volgt uit:
  9556. 4.5 De biopagina 301
  9557. Functioneel ontwerp van de biopagina
  9558. Beschrijving De biopagina toont video’s en de biografi e van de artiest
  9559. Header-element Navigatie-elementen
  9560. Link naar (vorige) lastminute-pagina
  9561. Link naar homepage
  9562. Link naar bestelpagina
  9563. Content-element Content-elementen
  9564. Video’s en biografi sche teksten
  9565. Footer-element Navigatie-elementen
  9566. Link naar agendapagina
  9567. Link naar locatiepagina
  9568. Opmerkingen Iedere artiest krijgt zijn/haar eigen biopagina
  9569. Figuur 4.18 Draadmodel van de biopagina
  9570. Codering van de biopagina
  9571. In deze paragraaf maken we de code waarmee we de biopagina voorzien van een
  9572. video en een biografi e van de artiest.
  9573. • Opgave 16
  9574. Open index.html en codeer de volgende data-role="page" onderaan de lastminutepagina.
  9575. <div data-role="page" class="page" id="shakira-biopage">
  9576. ...
  9577. </div><!-- einde shakira-biopage -->
  9578. 302 4 jQuery
  9579. Op de puntjes coderen we in de komende opgaven de header-, content- en footerelementen.
  9580. In de volgende opgave beginnen we met het coderen van het header-element. Hieronder coderen we de navigatie volgens het functioneel ontwerp.
  9581. Figuur 4.19
  9582. • Opgave 17
  9583. Open index.html en voeg het header-element van de biopagina eraan toe. Codeer
  9584. het header-element met de navigatie die je ziet in fi guur 4.19. In de navigatie moet
  9585. de vorige pagina naar de lastminute-pagina verwijzen.
  9586. De content van de biopagina krijgt volgens het functioneel ontwerp een video en
  9587. een biografi sche tekst over de artiest.
  9588. • Opgave 18
  9589. Open index.html en voeg het volgende content-element van de biopagina eraan
  9590. toe:
  9591. <div data-role="content">
  9592. <video controls="controls" width="90%"
  9593. preload id="video" poster="shakiraposter.jpg">
  9594. <source src="wildlife.mp4" type="video/mp4"/>
  9595. <source src="shakira.webm" type="video/webm"/>
  9596. <source src="shakira.3gpp" type="video/3gpp"/>
  9597. </video><!-- einde video -->
  9598. <p>Aliquameratvolutpat. Mauris vel nequesitamet nunc
  9599. gravida conguesedsitametpurus. Quisquelacusquam,
  9600. egestasactincidunt a, lacinia vel velit. Morbiac
  9601. commodo nulla. </p>
  9602. </div><!-- einde content -->
  9603. Het element <video>
  9604. Het element <video> heeft de volgende attributen:
  9605. • controls
  9606. • width
  9607. • poster
  9608. Met deze attributen controleren we het plaatsen van het video-element:
  9609. <video controls="controls" width="90%"
  9610. preload id="video" poster="shakiraposter.jpg">
  9611. 4.5 De biopagina 303
  9612. Smartphones en tablets gebruiken snellere videocoderingen dan gewone websites.
  9613. De meest gebruikte bestandsformaten zijn MP4, WEBM en 3GPP.
  9614. Het element <source>
  9615. Met het element <source> kunnen we ervoor zorgen dat we bestanden met verschillende coderingen voor mobiele video beschikbaar hebben voor verschillende
  9616. mobiele browsers:
  9617. <source src="shakira.mp4" type="video/mp4"/>
  9618. <source src="shakira.webm" type="video/webm"/>
  9619. <source src="shakira.3gpp" type="video/3gpp"/>
  9620. Mediabestandsformaten
  9621. Ieder platform ondersteunt zijn eigen bestandsformaten voor media. Als softwareontwikkelaar moet je ervoor zorgen dat je applicaties cross-platform te gebruiken
  9622. zijn. In tabel 5.4 staan de bestandsformaten voor de platforms Android, Windows
  9623. en iPhone.
  9624. Tabel 5.4 Bestandsformaten voor media
  9625. Smartphone Audio Afbeelding Video
  9626. Android 3GP
  9627. MP4
  9628. OOG
  9629. JPG
  9630. GIF
  9631. PNG
  9632. BMP
  9633. 3GP
  9634. MP4
  9635. WEBM
  9636. Windows 7 3GP
  9637. 3G2
  9638. MP4
  9639. M4A
  9640. AAC
  9641. JPG
  9642. GIF
  9643. PNG
  9644. BMP
  9645. 3GP
  9646. 3G2
  9647. MP4
  9648. M4V
  9649. MOV
  9650. iPhone MP3
  9651. MP4
  9652. WAV
  9653. AIFF
  9654. TIFF
  9655. JPG
  9656. GIF
  9657. PNG
  9658. DIV
  9659. MOV
  9660. MP4
  9661. MPG4
  9662. Conversie van mobiele video
  9663. Op internet vindt je speciale software om conversies te maken van mobiele video.
  9664. Zo kun je bijvoorbeeld conversies maken van MOV naar 3GP.
  9665. • Opgave 19
  9666. Download een korte testvideo en maak conversies naar MP4, WEBN en 3GP.
  9667. In de volgende opgave coderen we het footer-element van de biopagina. Het
  9668. footer-element van de biopagina is exact hetzelfde als het footer-element van de
  9669. lastminute-pagina.
  9670. 304 4 jQuery
  9671. • Opgave 20
  9672. Open index.html en voeg het footer-element van de biopagina eraan toe.
  9673. • Opgave 21
  9674. Open index.html en maak de volgende drie complete biopagina’s met header-,
  9675. content- en footer-elementen voor de andere drie concertartiesten van de applicatie FlashTix.
  9676. <div data-role="page" id="jeniffer-biopage"
  9677. data-content-theme="b">
  9678. ...
  9679. </div><!-- einde jeniffer-biopage -->
  9680. <div data-role="page" id="nora-biopage"
  9681. data-content-theme="b">
  9682. ...
  9683. </div><!-- einde nora-biopage -->
  9684. <div data-role="page" id="bruce-biopage"
  9685. data-content-theme="b">
  9686. ...
  9687. </div><!-- einde bruce-biopage -->
  9688. Maak deze opgave af door op de puntjes de header-, content- en footer-elementen
  9689. toe te voegen.
  9690. 4.6 De bestelpagina
  9691. De bestelpagina is de pagina waar de gebruiker zijn tickets kan bestellen. Dit doet
  9692. hij door een bestelformulier in te vullen. In deze paragraaf ontwerpen we de bestelpagina van de applicatie FlashTix.
  9693. Planning Inleveren
  9694. Opgaven 22 t/m 30
  9695. bestelpagina
  9696. 4.6 De bestelpagina 305
  9697. Figuur 4.20 Draadmodel van de bestelpagina
  9698. Functioneel ontwerp van de bestelpagina
  9699. Het functioneel ontwerp van de bestelpagina geeft de navigatie en de content van
  9700. de pagina aan.
  9701. De beschrijving van de bestelpagina ziet er als volgt uit:
  9702. Functioneel ontwerp van de bestelpagina
  9703. Beschrijving De bestelpagina is een bestelformulier voor
  9704. lastminute-tickets die alleen vandaag geldig zijn
  9705. Header-element Navigatie-elementen
  9706. Link naar vorige pagina
  9707. Link naar homepage
  9708. Link naar nieuwspagina
  9709. Content-element Content-elementen bestelformulier
  9710. Footer-element Navigatie-elementen
  9711. Link naar agendapagina
  9712. Link naar locatiepagina
  9713. Opmerkingen De vorige pagina is de lastminute-pagina
  9714. Codering van de bestelpagina
  9715. In deze sectie coderen we de bestelpagina met een bestelformulier.
  9716. 306 4 jQuery
  9717. • Opgave 22
  9718. Open index.html en codeer het volgende element <div data-role="page"> onderaan de biopagina’s:
  9719. <div data-role="page" id="bestelpage" class="page">
  9720. . . .
  9721. </div><!-- eind bestelpage -->
  9722. Op de puntjes coderen we in de komende opgaven de header-, content- en footerelementen.
  9723. In de volgende opgave coderen we het header-element van de bestelpagina. In de
  9724. navigatie moet de vorige pagina naar de lastminute-pagina verwijzen.
  9725. • Opgave 23
  9726. Open index.html en voeg het header-element van de bestelpagina eraan toe.
  9727. Codeer het header-element met de navigatie zoals in fi guur 4.21.
  9728. Figuur 4.21 Header van de bestelpagina
  9729. De content van de bestelpagina moet een bestelformulier zijn waarop de gebruiker
  9730. bestelinformatie invult.
  9731. • Opgave 24
  9732. Open index.html en voeg het volgende content-element van de bestelpagina eraan
  9733. toe.
  9734. <div data-role="content" class="content">
  9735. <form name="form" id="form">
  9736. . . .
  9737. </form><!-- einde formulier -->
  9738. </div><!--/content -->
  9739. We beginnen het opbouwen van het formulier met een controlgroup-element voor
  9740. het kiezen van een concert. Omdat de gebruiker maar één concert mag kiezen,
  9741. gebruiken we keuzerondjes (radiobuttons).
  9742. • Opgave 25
  9743. Open index.html en codeer de volgende controlgroup binnen het element <form>.
  9744. <p>Kies een concert</p>
  9745. <input type="radio" name="concert" value="shakira"/>
  9746. <label for="shakira">Shakira</label>
  9747. <input type="radio" name="concert" value="jeniffer"/>
  9748. <label for="jeniffer">Jeniffer Lopez</label>
  9749. 4.6 De bestelpagina 307
  9750. <input type="radio" name="concert" value="nora"/>
  9751. <label for="nora">Nora</label>
  9752. <input type="radio" name="concert" value="bruce"/>
  9753. <label for="bruce">Bruce Springstien</label>
  9754. <label for="aantal">Aantal sterren</label>
  9755. <input type="range" name="aantal" id="aantal" min="1" max="3" />
  9756. Het resultaat zie je in fi guur 4.22.
  9757. Figuur 4.22
  9758. Het attribuut input type= "range"
  9759. Een gebruiker mag maximaal drie sterren geven. Om dit te controleren hebben we
  9760. het attribuut input type="range" gebruikt.
  9761. Data-role= "fi eldcontain"
  9762. Met data-role="fieldcontain" declareren we een container voor een groep elementen <input type="text">.
  9763. • Opgave 26
  9764. Open index.html en codeer het volgende fi eldcontain-element binnen het formelement.
  9765. <div data-role="fieldcontain">
  9766. <input class="required" type="text" id="naam"
  9767. name="naam" placeholder="Typ hier je naam in" />
  9768. <labelfor="minderjarig">Minderjarig:</label>
  9769. <select name="slider" id="minderjarig" data-role="slider"
  9770. data-mini="true">
  9771. <option value="nee">Nee</option>
  9772. <option value="ja">Ja</option>
  9773. </select>
  9774. ...
  9775. </div> <!-- einde fieldcontain -->
  9776. Op de puntjes coderen we in de komende opgaven meer formulier-elementen.
  9777. 308 4 jQuery
  9778. Het attribuut label for
  9779. Het attribuut label for= is de tekst naast het tekstvakje van de elementen input
  9780. type="text".
  9781. Het attribuut placeholder
  9782. Het attribuut placeholder= is de grijze tekst die zichtbaar is in het tekstvakje van de
  9783. elementen input type="text".
  9784. Class= "required"
  9785. Wanneer een formulier-element class="required" krijgt, betekent dit dat dit element verplicht ingevoerd of afgevinkt moet worden.
  9786. Het select-element
  9787. Binnen een select-element kunnen we een keuze maken uit meerdere optionelementen:
  9788. <select name="slider" id="minderjarig"
  9789. data-role="slider" data-mini="true">
  9790. <option value="nee">Nee</option>
  9791. <option value="ja">Ja</option>
  9792. </select>
  9793. • Opgave 27
  9794. Open index.html en voeg elementen input type="text" toe voor: Mobiele telefoon
  9795. en E-mailadres. Alle elementen moeten verplicht ingevuld worden. Het resultaat
  9796. van de opgave moet eruitzien zoals in fi guur 4.24.
  9797. Het datalist-element
  9798. Een datalist-element is een lijst met mogelijke waarden voor een element input
  9799. type="text". We kunnen bijvoorbeeld een lange lijst coderen met de namen van alle
  9800. steden:
  9801. <datalistid="steden">
  9802. <option value="Almere">
  9803. <option value="Amstelveen">
  9804. <option value="Amsterdam">
  9805. <option value="Den Haag">
  9806. </datalist>
  9807. • Opgave 28
  9808. Open index.html en voeg het volgende element <datalist> met de volgende elementen <option> eraan toe:
  9809. <input type="text" name="plaats" id="plaats" list="steden"
  9810. placeholder="woonplaats" />
  9811. <datalist id="steden">
  9812. <option value="Almere">
  9813. <option value="Amstelveen">
  9814. 4.6 De bestelpagina 309
  9815. <option value="Amsterdam">
  9816. <option value="Den Haag">
  9817. <option value="Hilversum">
  9818. <option value="Leeuwarden">
  9819. <option value="Maastricht">
  9820. <option value="Naarden">
  9821. <option value="Utrecht">
  9822. </datalist>
  9823. Met een datalist is het eenvoudig om de juiste invoerwaarden te selecteren. De
  9824. invoer wordt door de gebruiker geselecteerd in plaats van ingetikt. Dit voorkomt
  9825. typefouten. Het resultaat moet eruitzien zoals in fi guur 4.23.
  9826. Figuur 4.23 Een datalist
  9827. Het textarea-element
  9828. Omdat een tekstveld soms te weinig ruimte biedt voor de benodigde tekst kun je
  9829. ook gebruikmaken van het textarea-element.
  9830. • Opgave 29
  9831. Open index.html en codeer het volgende textarea-element en controlgroup-element binnen het form-element.
  9832. <textarea cols="35" rows="4" name="reactie" id="reactie"
  9833. placeholder="mail ons je reactie">
  9834. </textarea>
  9835. <div data-role="controlgroup">
  9836. <p>Kies een gratis abonnement</p>
  9837. <input type="checkbox" name="news" id="news" />
  9838. <label for="news">FlashTixNewsletter</label>
  9839. <input type="checkbox" name="gids" id="gids" />
  9840. <label for="gids">Uitgids</label>
  9841. <input type="checkbox" name="fest" id="fest" />
  9842. <label for="fest">Festival Gids</label>
  9843. </div><!-- einde controlgroup -->
  9844. </div><!-- einde fieldcontain -->
  9845. <input type="submit" id="submit" value="Verzend">
  9846. </form><!-- einde form -->
  9847. </div><!-- einde content -->
  9848. 310 4 jQuery
  9849. Het checkbox-element
  9850. In tegenstelling tot keuzerondjes (radio-elementen), waarmee de gebruiker maar
  9851. één optie kan kiezen, kunnen bij selectievakjes (checkbox-elementen) meerdere
  9852. opties geselecteerd worden.
  9853. In de volgende opgave coderen we het footer-element van de bestelpagina.
  9854. • Opgave 30
  9855. Open index.html en voeg het footer-element van de bestelpagina eraan toe. Codeer het footer-element met de navigatie zoals in fi guur 4.24 te zien is.
  9856. Figuur 4.24 Bestelformulier
  9857. 4.7 Je eigen lastminute-webapp
  9858. In deze opdracht ontwerp en realiseer je je eigen lastminute-webapp. In overleg
  9859. met je docent kies je een van de volgende onderwerpen:
  9860. • fi lm
  9861. • toneel
  9862. • musea
  9863. • sport
  9864. • vliegtuigtickets
  9865. • treinen
  9866. • cruises
  9867. • hotels
  9868. • vakantiehuizen
  9869. Planning Inleveren
  9870. eigen lastminute-app
  9871. 4.7 Je eigen lastminute-webapp 311
  9872. Functioneel optwerp
  9873. Maak eerst een functionel ontwerp van je eigen lastminute-app. Begin met de sitemap en maak dan draadmodellen van elke pagina. Zie fi guur 4.25 voor een voorbeeld van een sitemap:
  9874. Figuur 4.25 Sitemap van je eigen lastminute-webapp
  9875. In het tweede deel van het functioneel ontwerp maak je een draadmodel van je
  9876. homepage waarin je de banner, navigatie en content van de pagina aangeeft.
  9877. Functioneel ontwerp van de homepage
  9878. Hier zie je een voorbeeld van een beschrijving van alle content-elementen van de
  9879. pagina, bijvoorbeeld knoppen, afbeeldingen en tekst.
  9880. Functioneel ontwerp van de homepage
  9881. Beschrijving
  9882. Header Navigatie-elementen
  9883. Content Content-elementen
  9884. Footer Navigatie-elementen
  9885. Opmerkingen
  9886. Maak het functioneel ontwerp af met draadmodellen en beschrijvingen van alle
  9887. pagina’s van je lastminute-webapp.
  9888. Nadat je het functioneel ontwerp hebt ingeleverd en dit is goedgekeurd, begin je
  9889. met de codering (HTML) en het design (CSS) van je eigen lastminute-webapp.
  9890. 312 4 jQuery
  9891. 4.8 jQuery programmeren
  9892. jQuery is een JavaScript-bibliotheek of framework met veel verschillende JavaScript-technieken. Het doel ervan is om het ontwikkelen van webpagina’s met veel
  9893. functionaliteit eenvoudiger te maken. Webontwikkelaars kunnen hun kennis van
  9894. JavaScript in combinatie met jQuery, HTML5 en CSS3 gebruiken om DOM-elementen in een webpagina te coderen en zo dynamische applicaties te ontwikkelen.
  9895. Voor het programmeren in jQuery is kennis van objectgeoriënteerd programmeren in JavaScript noodzakelijk. Wanneer je deze kennis nog niet hebt, is het aan
  9896. te raden eerst hoofdstuk 3 OOP JavaScript door te nemen. Het is belangrijk dat je
  9897. de basisbegrippen van JavaScript-functies beheerst voordat je verdergaat met deze
  9898. paragraaf.
  9899. Planning Inleveren
  9900. Opgaven 31 t/m 34
  9901. Wat is DOM?
  9902. Het Document Object Model (afgekort tot DOM) is een model voor het benaderen
  9903. van gestructureerde documenten zoals een HTML-document. Met JavaScript kun
  9904. je alle DOM-elementen die geassocieerd zijn met je webpagina benaderen. Om een
  9905. bepaald element te benaderen, moet je de hiërarchie van het DOM doorlopen zoals in fi guur 4.26 te zien is:
  9906. Figuur 4.26 Document Object Model
  9907. Als je webpagina de structuur heeft die je in de fi guur ziet en je wilt het element
  9908. <textarea> van het element <form> van het element <div> in het document benaderen, dan moet je de DOM-hiërarchie als volgt doorlopen:
  9909. window.document.div.form.textarea
  9910. 4.8 jQuery programmeren 313
  9911. De jQuery-wrapper
  9912. jQuery selecteert en geeft als resultaat een verzameling van DOM-elementen binnen een webpagina. De geselecteerde elementen worden gegroepeerd binnen de
  9913. jQuery-wrapper. Vanuit de jQuery-wrapper kun je de geselecteerde elementen
  9914. manipuleren. Om met jQuery een selectieopdracht uit te voeren, gebruik je de
  9915. volgende syntaxis:
  9916. $(selector) of jQuery(selector)
  9917. Bij selector geef je de elementen aan die je wilt selecteren. Om bijvoorbeeld alle
  9918. <p>-elementen in een webpagina te selecteren, doe je het volgende:
  9919. $('p') of jQuery('p')
  9920. Om alle <a>-elementen binnen alle <p>-elementen in een webpagina te selecteren,
  9921. doe je het volgende:
  9922. $('p a') of jQuery('p a')
  9923. De functie $() retourneert een JavaScript-wrapper-object. Het object bevat een
  9924. array met de geselecteerde DOM-elementen uit de webpagina.
  9925. jQuery-chains
  9926. We kunnen de geselecteerde elementen in de jQuery-wrapper manipuleren. Als
  9927. je bijvoorbeeld alle elementen <div class='inloggen'> onzichtbaar wilt maken,
  9928. selecteer je eerst de elementen. Daarna kun je de elementen manipuleren. Dit
  9929. doe je door operaties te koppelen (chaining) aan de geselecteerde elementen in de
  9930. jQuery-wrapper. In het volgende voorbeeld worden de elementen in de jQuerywrapper onzichtbaar gemaakt:
  9931. $('div.inloggen').hide();
  9932. Chaining kunnen we tot meerdere niveaus coderen. Bijvoorbeeld:
  9933. $('div.inloggen').hide().addClass('onzichtbaar');
  9934. Hier worden de elementen eerst geselecteerd, dan onzichtbaar gemaakt en daarna
  9935. krijgen ze een nieuwe class:
  9936. class= 'onzichtbaar';
  9937. Use cases van de homepage
  9938. Een use case is een beschrijving van een interactie tussen de user en de applicatie.
  9939. We beginnen met de homepage. In deze paragraaf coderen we met jQuery de functionaliteit van de homepage van de applicatie FlashTix.
  9940. 314 4 jQuery
  9941. Use cases van de homepage
  9942. Use case 01 Wanneer de gebruiker op de homepage komt, wordt een
  9943. welkomstbericht geactiveerd.
  9944. Use case 02 Wanneer de gebruiker op het canvas klikt, wordt een animatie
  9945. met de bedrijfsnaam en een afbeelding geactiveerd.
  9946. Opmerkingen
  9947. DOM-elementen laden
  9948. Je begint altijd met jQuery de instructie te geven om te wachten tot alle DOM-elementen van de webpagina zijn geladen in de browser. Dan pas kan jQuery beginnen met het zoeken van de elementen. Dit doen we door onze jQuery-opdrachten
  9949. in een functie te plaatsen:
  9950. jQuery(function() {
  9951. $(jQuery-opdrachten);
  9952. });
  9953. Of:
  9954. $(function() {
  9955. $(jQuery-opdrachten);
  9956. });
  9957. Alles wat je tussen de accolades codeert, zijn jQuery-opdrachten.
  9958. Als je eenmaal een verzameling (selectie) van de DOM-elementen in de wrapper
  9959. hebt, kun je functies uitvoeren op de elementen. Je kunt bijvoorbeeld dynamische
  9960. content aan de pagina toevoegen met de jQuery-functies append() en prepend(). In
  9961. de volgende opgave voegen we een welkomstmelding dynamisch toe aan de homepage.
  9962. Content toevoegen: prepend() en append()
  9963. De functie prepend() voegt HTML-content toe aan het begin van het geselecteerde
  9964. element. Bijvoorbeeld:
  9965. $('#homecontent').prepend('<p> Begin alinea.</p>');
  9966. Hier hebben we een alinea-element aan het begin van het element
  9967. <div id='homecontent'> toegevoegd.
  9968. • Opgave 31
  9969. Open index.html van de app FlashTix. In het element <head> voeg je een link naar
  9970. het bestand fl ashtix.js toe:
  9971. <script src= "flashtix.js"></script>
  9972. 4.8 jQuery programmeren 315
  9973. • Opgave 32: De functie prepend()
  9974. Typ de volgende jQuery-code over en sla deze op als fl ashtix.js.
  9975. $(function() {
  9976. $.mobile.pushStateEnabled = false;
  9977. var welkomstMelding = 'Welkom!';
  9978. $('#homecontent').prepend(
  9979. '<p class="melding">'+ welkomstMelding + '</p>');
  9980. }); // einde jQuery
  9981. We coderen alle opgaven tussen deze twee regels in:
  9982. $(function() {
  9983. en
  9984. }); // einde jQuery
  9985. We hebben eerst een globale variabele welkomstMelding gedefi nieerd. Daarna hebben we met behulp van jQuery het element <div id='homecontent'> geselecteerd.
  9986. Let op: een id moet binnen een webpagina uniek zijn. Als je verschillende elementen met dezelfde id hebt, selecteert jQuery alleen het element dat het van boven
  9987. naar beneden het eerst tegenkomt. Het resultaat van opgave 32 is dat het complete
  9988. element <div id="homecontent"> wordt geselecteerd in de jQuery-wrapper.
  9989. <div id="homecontent" data-role="content">
  9990. ...
  9991. </div><!-- /homecontent -->
  9992. Met de functie prepend() voegen we aan het begin van het geselecteerde contentelement een nieuw element <p> toe met daarin de inhoud van de variabele welkomstMelding.
  9993. $('#homecontent').prepend(
  9994. '<p class="melding">'+ welkomstMelding + '</p>');
  9995. 316 4 jQuery
  9996. Figuur 4.27
  9997. De functie append() voegt HTML-content toe aan het einde van het geselecteerde
  9998. element. Bijvoorbeeld:
  9999. $('#homecontent').append('<p> Einde alinea.</p>');
  10000. Hier hebben we een alinea-element aan het einde van het element
  10001. <div id='homecontent'> toegevoegd.
  10002. • Opgave 33: De functie append()
  10003. Typ de volgende jQuery-code
  10004. $('#homecontent').append('<p id="gratis">Gratis tickets!</p>');
  10005. binnen de jQuery-functie:
  10006. $(function() {
  10007. . . .
  10008. });// einde jQuery
  10009. in het bestand fl ashtix.js. Het resultaat zie je in fi guur 4.28.
  10010. 4.8 jQuery programmeren 317
  10011. Figuur 4.28
  10012. In de volgende tabel zie je een aantal voorbeelden van eenvoudige selectieopdrachten en het resultaat ervan.
  10013. Tabel 6.1 Selectieopdrachten in jQuery
  10014. Selectieopdracht Resultaat
  10015. "p" Alle alinea-elementen
  10016. "#poster" Het unieke element met id= "poster"
  10017. ".header" Alle elementen met class= "header"
  10018. "p #welkom" Eerste alinea met id= "welkom"
  10019. "a.knop" Alle ankers met class= "knop"
  10020. "p a.knop" Alle ankers met class= "knop" binnen een alinea-element.
  10021. "img#image. poster" De unieke afbeelding met id= "image" en class="poster"
  10022. Verwijderen: remove()
  10023. We kunnen elementen aan het DOM toevoegen, maar met de functie remove()
  10024. kunnen we ook elementen die niet meer nodig zijn verwijderen. Met de volgende
  10025. regel verwijder je de content van de homepage:
  10026. $('#homecontent').remove();
  10027. of
  10028. $('#homecontent').children('.class').remove();
  10029. 318 4 jQuery
  10030. • Opgave 34: De functie remove( )
  10031. Open fl ashtix.js en codeer een jQuery-opdracht die het element <p id="gratis"> in
  10032. homecontent verwijdert.
  10033. 4.9 Events en event-handlers
  10034. Alle browsers hebben de mogelijkheid om te reageren op events (gebeurtenissen), zoals een muisklik. Maar niet alle browsers gaan op dezelfde manier om met
  10035. events. Daarom hebben interactieve applicaties een cross-browser-eventmodel
  10036. nodig. Dat is een model waarmee je events kunt afhandelen zonder dat je rekening
  10037. hoeft te houden met de verschillen tussen de browsers.
  10038. Planning Inleveren
  10039. Opgaven 35 t/m 38
  10040. Wat is een event?
  10041. Een event is een actie die gedetecteerd wordt door een programma, zoals het klikken op een muisknop of het tikken op het toetsenbord. Een event-gestuurde applicatie is een applicatie die is ontworpen om op events te reageren.
  10042. Wat is een event-handler?
  10043. Een event-handler is een reactie op een event, bijvoorbeeld een reactie op een
  10044. touch-event. Een event-handler is een functie waarin je codeert hoe er gereageerd
  10045. moet worden wanneer een bepaald event plaatsvindt. Een event mag één of meer
  10046. handlers activeren.
  10047. Het event-model van jQuery
  10048. Het event-model van jQuery is een cross-browsermodel. Het houdt rekening met
  10049. de event-modellen van de verschillende browsers, zodat je maar één handler hoeft
  10050. te coderen die in alle browsers werkt. Enkele voordelen:
  10051. • verschillende handlers voor de event-typen;
  10052. • er zijn standaardnamen voor events;
  10053. • een event kan een invoerparameter voor de handler zijn;
  10054. • er zijn standaardmethodes voor handlers.
  10055. Met het event-model van jQuery kunnen we handlers instellen voor events die
  10056. plaatsvinden in DOM-elementen. In fi guur 4.29 zie je een event: een wijziging in
  10057. het element <input>. Het event begint bovenin de DOM-hiërarchie. In de afvangfase lopen we de DOM-structuur door op zoek naar het doelelement. Als het doel
  10058. eenmaal is gevonden, kan het event een eigen handler triggeren. In de tweede fase
  10059. lopen we door de DOM-structuur weer naar boven tot het einde van het event.
  10060. 4.9 Events en event-handlers 319
  10061. Figuur 4.29 Begin, target en eind van een event
  10062. De functie bind()
  10063. We coderen event-handlers met de functie bind(). De syntaxis van de functie ziet
  10064. er als volgt uit:
  10065. bind(eventType, data, handler)
  10066. Een voorbeeld:
  10067. $('p').bind('click',function(event){
  10068. alert('je hebt op een tekst geklikt');
  10069. });
  10070. In dit voorbeeld selecteren we eerst alle <p>-elementen. Daarna coderen en koppelen we een handler voor click-events op alle <p>-elementen in de wrapper.
  10071. Events kunnen window-, form-, mouse- of toetsenbord-events zijn, bijvoorbeeld
  10072. een click-event.
  10073. Handlers zijn de functies die we coderen om deze events te behandelen, bijvoorbeeld de achtergrondkleur van een element veranderen wanneer er op het element
  10074. wordt geklikt. Events en handlers kunnen we koppelen aan verschillende elementen. Dit doen we met de bind()-functie.
  10075. Deze handler voert telkens als op een <p>-element wordt geklikt de functie alert()
  10076. uit. De handler is gecodeerd binnen de anonieme functie:
  10077. function(event){
  10078. alert('je hebt op een tekst geklikt');
  10079. }
  10080. 320 4 jQuery
  10081. De handler zorgt ervoor dat er een venster wordt getoond met de tekst:
  10082. je hebt op een tekst geklikt.
  10083. Tabel 6.2 Events
  10084. Event Toelichting
  10085. Formulieren
  10086. change element is gewijzigd
  10087. blur element raakt focus kwijt
  10088. focus element heeft de focus
  10089. select element is geselecteerd
  10090. submit formulier is verstuurd
  10091. reset formulier is gereset
  10092. Touch/muis
  10093. tap een korte tik
  10094. taphold een lange tik
  10095. swipe horizontaal of verticaal slepen
  10096. swiperight swipe naar rechts
  10097. swipeleft swipe naar links
  10098. • Opgave 35: De functie bind( )
  10099. Open fl ashtix.js en codeer een handler voor het swipe-event:
  10100. $('body').bind('swipe',function(event){
  10101. alert('Je hebt over het scherm geveegd');
  10102. });
  10103. Maak deze opgave af door een handler te coderen die een taphold-event koppelt
  10104. aan het element <body>. Als je met je vinger op het scherm tikt of klikt met de muis,
  10105. moet de alertbox verschijnen.
  10106. 4.9 Events en event-handlers 321
  10107. Tabel 6.3 Meer events
  10108. Event Toelichting
  10109. vmouseover touch of muisaanwijzer boven element
  10110. vmouseout touch of muisaanwijzer verlaat element
  10111. vmousedown touch-start of muisknop wordt ingedrukt
  10112. vmouseup touch-einde of muisknop wordt losgelaten
  10113. vmousemove touch-move of muisaanwijzer wordt verplaatst
  10114. vclick touch-end of klik met de muis
  10115. vmousecancel opheff en touch- of muis-beweging
  10116. Scroll
  10117. scrollstart begin scrollen
  10118. scrollstop eind scrollen
  10119. Page Load
  10120. pageload pagina is geladen
  10121. pageloadfailed pagina is niet geladen
  10122. Events inspecteren
  10123. Wanneer je een handler hebt vastgelegd met bind(), kun je het event als invoerparameter doorgeven aan de handler-functie met function(event). Bijvoorbeeld:
  10124. $('body').bind('taphold', function( event ) {
  10125. alert('Je hebt op het scherm langgetikt');
  10126. event.stopImmediatePropagation();
  10127. return false;
  10128. });
  10129. Je ziet dat de invoerparameter (event) het event zelf is dat wordt doorgegeven aan
  10130. de anonieme functie van de handler. Zo kunnen we het event verder inspecteren.
  10131. Bijvoorbeeld:
  10132. event.stopImmediatePropagation();
  10133. Hier voeren we de actie stopImmediatePropagation uit op het event. Zo kunnen we
  10134. verdere acties aan het event toevoegen.
  10135. Tabel 6.4 toont een lijst met eigenschappen (properties) van jQuery-events. (Bedenk dat de x-as horizontaal loopt en de y-as verticaal.)
  10136. 322 4 jQuery
  10137. Tabel 6.4 Event-eigenschappen
  10138. Eigenschap van touch-/muis-event
  10139. data tweede parameter in de functie bind()
  10140. pageX x-coördinaat van pagina
  10141. pageY y-coördinaat van pagina
  10142. clientX x-coördinaat van browser
  10143. clientY y-coördinaat van browser
  10144. screenX x-coördinaat van scherm
  10145. screenY y-coördinaat van scherm
  10146. • Opgave 36: Eigenschappen van events
  10147. Open fl ashtix.js en codeer een handler voor het click-event op het <body>-element.
  10148. Toon de eigenschappen e.pageX en e.pageY van het click-event in een alertbox.
  10149. $('body').bind('click',function(e){
  10150. ...
  10151. });
  10152. Het resultaat van opgave 36 zie je in fi guur 4.30.
  10153. Figuur 4.30
  10154. De functie unbind()
  10155. Deze functie gebruiken we om events en handlers los te koppelen van een element.
  10156. Met de functie unbind() maken we een bind ongedaan. De syntaxis van unbind()
  10157. ziet er als volgt uit:
  10158. unbind(eventType,listener)
  10159. Bijvoorbeeld:
  10160. $('body').unbind('click');
  10161. Deze functie gebruiken we om een handler los te koppelen van een element.
  10162. • Opgave 37: De functie unbind()
  10163. Open fl ashtix.js en voeg de volgende code toe: koppel het click-event en het swipeevent los van het body-element.
  10164. 4.9 Events en event-handlers 323
  10165. De functie one()
  10166. De functie one() is bijna identiek aan bind(). Met one() kunnen we een handler
  10167. coderen die eenmalig wordt uitgevoerd. De syntaxis van de functie one() ziet er als
  10168. volgt uit:
  10169. one(eventType, data, handler)
  10170. Bijvoorbeeld:
  10171. $('body').one('click',function(event){
  10172. alert('je hebt geklikt');
  10173. });
  10174. In dit voorbeeld selecteren we het <body>-element. Daarna koppelen we eenmalig
  10175. de handler. Deze handler geldt alleen voor het eerste click-event. Wordt voor de
  10176. tweede keer op het <body>-element geklikt, dan is er geen handler meer.
  10177. De functie live()
  10178. De functie live() is bijna identiek aan bind(), met als belangrijk verschil: met
  10179. live() kunnen we handlers coderen voor bestaande én niet-bestaande elementen.
  10180. Op het moment dat er een nieuw DOM-element geladen wordt, is de handler gekoppeld aan dat element. De syntaxis van de functie live() ziet er als volgt uit:
  10181. live(eventType, data, handler)
  10182. Bijvoorbeeld:
  10183. $('h1').live('click',function(event){
  10184. alert('je hebt op een tekst geklikt');
  10185. });
  10186. Hier wordt een handler gecodeerd voor alle geselecteerde <h1>-elementen. Op het
  10187. moment dat je een nieuw <h1>-element toevoegt aan de DOM-structuur wordt
  10188. deze handler ook gekoppeld aan het nieuwe element.
  10189. De functie die()
  10190. Met de functie die() (sterf) kunnen we een live-handler verwijderen; die() is verder gelijk aan unbind(). De syntaxis van de functie die() ziet er als volgt uit:
  10191. die(eventType, listener)
  10192. Bijvoorbeeld:
  10193. $('h1').die('click');
  10194. De functie trigger()
  10195. Tot nu toe hebben we gezien hoe events van de browser en de gebruiker een handler activeren. Maar we kunnen ook zelf bepalen wanneer een event geactiveerd
  10196. 324 4 jQuery
  10197. wordt. Misschien wil je een event ieder uur activeren. Dit doe je met de functie
  10198. trigger(). De syntaxis van trigger()ziet er als volgt uit:
  10199. trigger(eventType, data)
  10200. Bijvoorbeeld:
  10201. $('body').trigger('click');
  10202. Met deze regel code wordt een click-event op het body-element vanuit je script
  10203. geactiveerd, zonder dat je op de body klikt.
  10204. • Opgave 38: De functie trigger( )
  10205. Open fl ashtix.js en voeg de volgende code toe:
  10206. $('body').taphold(function(){
  10207. datum = new Date();
  10208. uur = datum.getHours();
  10209. if(uur <= 11){
  10210. $('<p>Goedemorgen!</p>').prependTo('#homecontent');
  10211. } else if(uur >= 12 && uur <= 17){
  10212. $('<p>Goedemiddag!</p>'). prependTo('#homecontent');
  10213. }else if(uur >= 18 && uur <= 24){
  10214. $('<p>Goedenavond!</p>').prependTo('#homecontent');
  10215. }
  10216. });
  10217. $('body').trigger('taphold');
  10218. Maak deze opgave af door ervoor te zorgen dat als het taphold-event wordt geactiveerd ook de tijd wordt weergegeven.
  10219. 4.10 Het canvas van HTML5
  10220. In HTML5 bestaat ook het <canvas>-element. Met dit element kunnen we tekenen
  10221. en grafi eken op een webpagina maken. Hier kunnen we teksten, lijnen en basisvormen zoals vierkanten en cirkels met verlopende kleuren tekenen. We kunnen ook
  10222. handlers voor click- en touch-events binnen het <canvas>-element coderen. We
  10223. beginnen met het plaatsen van een <canvas>-element bovenaan de afbeelding op de
  10224. homepage.
  10225. Planning Inleveren
  10226. Opgaven 39 t/m 49
  10227. • Opgave 39: Het element <canvas>
  10228. Open index.html van je FlashTix-app en voeg het <canvas>-element in boven het
  10229. #poster-element van de homepage.
  10230. <canvas id="mycanvas"></canvas>
  10231. 4.10 Het canvas van HTML5 325
  10232. • Opgave 40: Stijlen voor <canvas>
  10233. Open styles.css van je FlashTix-app en voeg de volgende CSS-stijlen toe:
  10234. #mycanvas{
  10235. width: 330px;
  10236. height: 100px;
  10237. margin-bottom: 40px;
  10238. border-radius: 10px;
  10239. backgroundColor: #F7F387;
  10240. }
  10241. Het canvasraster
  10242. De afmetingen van het raster zijn in pixels aangegeven (zie fi guur 4.31).
  10243. Figuur 4.31 Raster van het canvas
  10244. De afmetingen van ons <canvas>-element zijn in de CSS-stijl ingesteld op:
  10245. width: 330px;
  10246. height: 160px;
  10247. Dat is 330 pixels breed en 160 pixels hoog. Dit betekent dat het canvas begint op
  10248. positie 0,0 en eindigt op positie 330,160. Een positie in het raster correspondeert
  10249. met een pixel in het canvas. Een positie wordt aangegeven door zijn x- en y-coördinaten. Bijvoorbeeld, de positie van de eerste blauwe pixel is (0,0), de positie van de
  10250. tweede blauwe pixel is (3,2) en de positie van de derde pixel is (6,4).
  10251. De canvas-context
  10252. Om in het canvas te kunnen tekenen, gebruiken we een aantal tekenfuncties. Eerst
  10253. moeten we een pointer naar het canvas-element maken. Dit doen we met getElementById(). Dan moeten we een context voor het canvas maken. Dit doen we met
  10254. getContext('2d'):
  10255. var mycanvas = document.getElementById('mycanvas');
  10256. var ctx = mycanvas.getContext('2d');
  10257. Tekenen in het canvas
  10258. Om een tekening te maken, begin je met een pad. Dit pad is een lijst van alle tekenacties, bijvoorbeeld eerst een move-actie gevolgd door het tekenen van een lijn. De
  10259. functie stroke() tekent de acties. Bijvoorbeeld:
  10260. 326 4 jQuery
  10261. ctx.beginPath();
  10262. ctx.moveTo(25,80);
  10263. ctx.lineTo(200,80);
  10264. ctx.stroke();
  10265. Hier beginnen we een pad. Daarna kiezen we een positie (25,80). Dan zeggen we
  10266. dat een lijn getekend moet worden van (25,80) naar (200,80). Met stroke() voer je
  10267. deze acties uit.
  10268. • Opgave 41: Canvas
  10269. Open fl ashtix.js en voeg de volgende code toe:
  10270. $('#mycanvas').bind('click', function(e) {
  10271. var mycanvas = document.getElementById('mycanvas');
  10272. var ctx = mycanvas.getContext('2d');
  10273. ctx.beginPath();
  10274. ctx.moveTo(25,80);
  10275. ctx.lineTo(200,80);
  10276. ctx.stroke();
  10277. });
  10278. // einde canvas
  10279. Maak deze opgave af met het tekenen van een tweede, parallelle lijn.
  10280. Als je op het canvas klikt, moet het resultaat eruitzien als in fi guur 4.32.
  10281. Figuur 4.32 Een lijn tekenen
  10282. De canvasfunctie gradient()
  10283. Kleurverlopen (gradients) maken we met de functie createLinearGradient(). Hier
  10284. moeten we een beginpunt (x,y) en een eindpunt (x,y) specifi ceren. Bijvoorbeeld:
  10285. var grd=ctx.createLinearGradient(200,70,200,110);
  10286. Voor het verloop moeten we een beginkleurwaarde en een eindkleurwaarde specifi ceren. Bijvoorbeeld:
  10287. grd.addColorStop(0, '#f55b5b');
  10288. grd.addColorStop(1, '#3112a3');
  10289. De fi llStyle
  10290. Om het verloop te kunnen gebruiken, moeten we dit als fillStyle doorgeven. Bijvoorbeeld:
  10291. ctx.fillStyle=grd;
  10292. 4.10 Het canvas van HTML5 327
  10293. De functie fi llRect()
  10294. De functie fillRect() tekent een gevuld vierkant. De syntaxis van deze functie is:
  10295. fillRect(x,y,breedte,hoogte)
  10296. De functie strokeRect()
  10297. De functie strokeRect() tekent de randen van een vierkant. De syntaxis van deze
  10298. functie is:
  10299. strokeRect(x,y,breedte,hoogte)
  10300. De functie clearRect()
  10301. De functie clearRect() gebruiken we om een vierkant te wissen. De syntaxis van
  10302. deze functie is:
  10303. clearRect(x,y,breedte,hoogte)
  10304. • Opgave 42: Vierkant tekenen
  10305. Open fl ashtix.js en teken het volgende vierkant binnen het canvas-element:
  10306. var grd=ctx.createLinearGradient(200,70,200,110);
  10307. grd.addColorStop(0, '#f55b5b');
  10308. grd.addColorStop(1, '#3112a3');
  10309. ctx.fillStyle=grd;
  10310. ctx.fillRect(25,25,100,100);
  10311. ctx.strokeRect(25,25,100,100);
  10312. }); // einde canvas
  10313. Het resultaat van deze opgave zie je in fi guur 4.33.
  10314. Figuur 4.33 Een vierkant tekenen
  10315. Canvas: font en shadow
  10316. Naast een tekening kunnen we ook tekst binnen een canvas-element laten weergeven. In de volgende opgave tekenen we een tekst met schaduw.
  10317. • Opgave 43: Canvastekst
  10318. Open fl ashtix.js en teken de volgende tekst met schaduw:
  10319. ctx.font= '40pt Georgia';
  10320. ctx.shadowBlur = 5;
  10321. ctx.shadowColor = 'rgb(0, 0, 0)';
  10322. ctx.fillText('tekst',50,100);
  10323. }); // einde canvas
  10324. 328 4 jQuery
  10325. Het resultaat van de opgave zie je in fi guur 4.34.
  10326. Figuur 4.34 Een tekst tekenen
  10327. Bogen en cirkels
  10328. Om bogen en cirkels te tekenen gebruiken we de functie arc(). De syntaxis is:
  10329. arc(x, y, straal, starthoek, eindhoek, klok)
  10330. Het centrum van de cirkel defi niëren we met de x- en y-coördinaten. De straal (radius) is de afstand van het centrum tot de rand van de cirkel.
  10331. De start- en eindhoek zijn het begin- en eindpunt van de boog of cirkel. Hoeken
  10332. worden in radialen en niet in graden gecodeerd. Bij klok geven we een waarde true
  10333. of false. Als de waarde true is wordt de cirkel of arc met de klok mee getekend. In
  10334. JavaScript kun je de conversie van graden naar radialen als volgt uitrekenen:
  10335. var radialen = (Math.PI/180)*graden;
  10336. • Opgave 44: Bogen en cirkels
  10337. Open fl ashtix.js en teken de volgende cirkel:
  10338. ctx.beginPath();
  10339. var x = 220;
  10340. var y = 100;
  10341. var radius = 25;
  10342. var beginhoek = 0;
  10343. var eindhoek = (Math.PI/180)*360;
  10344. var klok = false;
  10345. ctx.arc(x,y,radius,beginhoek,eindhoek,klok);
  10346. ctx.fill();
  10347. ctx.stroke();
  10348. }); // einde canvas
  10349. Het resultaat van de opgave zie je in fi guur 4.35.
  10350. Figuur 4.35 Een cirkel tekenen
  10351. Interactief tekenen
  10352. Interactief tekenen binnen het canvas kan bijvoorbeeld als we tekenacties baseren op mouseclick-events of touch-tap-events. In de volgende opgave tekenen we
  10353. cirkels die gebaseerd zijn op de positie van mouseclick-events of met je vinger het
  10354. scherm aanraken.
  10355. 4.10 Het canvas van HTML5 329
  10356. • Opgave 45: Interactief tekenen
  10357. Open fl ashtix.js en voeg de volgende code toe:
  10358. ctx.save();
  10359. ctx.beginPath();
  10360. x = e.pageX - this.offsetLeft;
  10361. y = e.pageY - this.offsetTop;
  10362. radius = 15;
  10363. ctx.arc(x,y,radius,beginhoek,eindhoek,klok);
  10364. ctx.fill();
  10365. ctx.stroke();
  10366. ctx.restore();
  10367. }); // einde canvas
  10368. Het resultaat is dat waar je ook klikt er een cirkel wordt getekend – zie fi guur 4.36.
  10369. Figuur 4.36 Interactief tekenen
  10370. Canvasanimaties
  10371. We hebben vierkanten, lijnen, cirkels en teksten op het canvas getekend. Met deze
  10372. kennis kunnen we nu door naar het maken van animaties binnen het canvas. In
  10373. deze paragraaf maken we een animatie met de volgende elementen: een cirkel,
  10374. een tekst en een afbeelding. In dit geval gebruiken we een timer om deze drie elementen elke 40 milliseconden opnieuw te tekenen (een animatieframe bestaat uit
  10375. 40 milliseconden). Bij elk frame maken we de elementen iets groter; we beginnen
  10376. met een minimale grootte en eindigen met een maximale grootte. Wanneer we alle
  10377. frames naast elkaar tekenen, creëren we een animatie (zie fi guur 4.37).
  10378. Figuur 4.37 Canvasanimaties
  10379. We beginnen met het coderen van drie objecten.
  10380. • Opgave 46: Animaties
  10381. Open fl ashtix.js en voeg de volgende code toe:
  10382. cirkelObj={
  10383. radius: 10, maxRadius: 100,
  10384. x: e.pageX - this.offsetLeft,
  10385. y: e.pageY - this.offsetTop
  10386. }
  10387. tekstObj={
  10388. size: 10,
  10389. 330 4 jQuery
  10390. font: 'pt Georgia',
  10391. maxSize: 50,
  10392. x: e.pageX - this.offsetLeft,
  10393. y: e.pageY - this.offsetTop
  10394. }
  10395. posterObj={
  10396. x: e.pageX - this.offsetLeft,
  10397. y: e.pageY - this.offsetTop
  10398. }
  10399. ctx.lineWidth = 2;
  10400. // load image
  10401. newPosterObj = new Image();
  10402. newPosterObj.src = 'shakiraposter.jpg';
  10403. }); // einde canvas
  10404. Vervolgens coderen we de functie voor de animaties.
  10405. • Opgave 47: De functie animeren()
  10406. Open fl ashtix.js en voeg de volgende code toe:
  10407. function animeren(){
  10408. ctx.save();
  10409. // canvas vegen
  10410. ctx.clearRect(0,0,mycanvas.width, mycanvas.height);
  10411. // teken poster in x,y klik coördinaten
  10412. ctx.drawImage(newPosterObj,posterObj.x,posterObj.y);
  10413. posterObj.x +=3;
  10414. ctx.restore();
  10415. } // einde animeren
  10416. setInterval(animeren,100);
  10417. }); // einde canvas
  10418. JavaScript heeft twee functies om een functie om de zoveel milliseconden te laten
  10419. uitvoeren. Dat zijn setTimeout() en setInterval(). In de vorige opgave in de laatste
  10420. regel voeren we de functie animeren() uit met behulp van de functie setInterval().
  10421. We tekenen de afbeelding elke 100 milliseconden en iedere keer beweegt de afbeelding 3 pixels naar rechts. Het resultaat zie je in fi guur 4.38.
  10422. Figuur 4.38 Animatie met afb eelding
  10423. In de volgende opgave tekenen we een cirkel die steeds groter wordt.
  10424. • Opgave 48: Cirkel tekenen
  10425. Open fl ashtix.js en voeg de volgende code toe binnen de functie animeren().
  10426. // increase radius
  10427. cirkelObj.radius +=2;
  10428. ctx.beginPath();
  10429. 4.11 Use cases van de lastminute-pagina 331
  10430. ctx.arc(
  10431. cirkelObj.x,
  10432. cirkelObj.y,
  10433. cirkelObj.radius,
  10434. 0,
  10435. 2*Math.PI,
  10436. false);
  10437. ctx.stroke();
  10438. } // einde animeren
  10439. Het resultaat zie je in afbeelding 4.39.
  10440. Figuur 4.39 Animatie met cirkel
  10441. In de volgende opgave tekenen we een tekst die steeds groter wordt.
  10442. • Opgave 49: Teken tekst
  10443. Open fl ashtix.js en voeg de volgende code toe binnen de functie animeren().
  10444. ctx.font= tekstObj.size + tekstObj.font;
  10445. ctx.fillText('FlashTix ',tekstObj.x,tekstObj.y);
  10446. // tekengrootte
  10447. tekstObj.size +=2;
  10448. ctx.restore();
  10449. } // einde animeren
  10450. Het resultaat zie je in fi guur 6.15
  10451. Figuur 4.40 Animatie met tekst
  10452. 4.11 Use cases van de lastminute-pagina
  10453. Planning Inleveren
  10454. Opgaven 50 t/m 58
  10455. In deze paragraaf coderen we nieuwe functionaliteit voor de lastminute-pagina
  10456. volgens de use cases:
  10457. 332 4 jQuery
  10458. Use cases van de lastminute-pagina
  10459. Use case 01 Tijdens het weekeinde worden geen tickets voor het
  10460. rockconcert verkocht.
  10461. Use case 02 Uitverkochte concerten moeten worden vermeld.
  10462. Use case 03 Extra kortingen per concert moeten worden vermeld.
  10463. Opmerkingen
  10464. Het <content>-element van de lastminute-pagina hebben we als volgt gecodeerd:
  10465. <div class="content" data-role="content">
  10466. <ul data-role="listview" data-split-theme="b">
  10467. <li data-role="list-divider">POP</li>
  10468. <li id="shakira-concert">
  10469. <a href="#shakira-biopage">
  10470. <img class="poster" src="shakiraposter.jpg"/>
  10471. <h3>Shakira</h3><br />
  10472. <p>AmsterdamArena</p>
  10473. <p>Vandaag 22:00 uur</p>
  10474. </a>
  10475. <a href="#shakira-biopage"
  10476. data-transition="slideup">
  10477. </a>
  10478. </li>
  10479. </ul>
  10480. </div>
  10481. We hebben een <ul>-element met een speciale data-role="listview" gecodeerd.
  10482. Daarna zie je dat het <ul>-listview-element twee soorten <li>-child-elementen
  10483. heeft:
  10484. – het eerste <li>-element krijgt een data-role="list-divider";
  10485. – het tweede <li>-element heeft twee <a>-elementen.
  10486. In het eerste <a>-element zie je dat het mogelijk is om meerdere elementen zoals
  10487. een <p>- en een <img>-element binnen een <a>-element te plaatsen.
  10488. Child-selectors
  10489. Elementen met meer subelementen zijn parent-elementen en de subelementen zijn
  10490. child-elementen. Volgens bovenstaande code heeft het <ul>-element twee <li>-
  10491. child-elementen:
  10492. <li id="pop" data-role="list-divider">POP</li>
  10493. <li id="shakira-concert">
  10494. Child-elementen selecteren we met het teken >, bijvoorbeeld:
  10495. $('#content > ul > li')
  10496. Bovenstaande opdracht selecteert alle <li>-child-elementen van het <ul>-element,
  10497. binnen het element <div id="content">.
  10498. 4.11 Use cases van de lastminute-pagina 333
  10499. $('#content > #shakira-concert > .poster')
  10500. Bovenstaande opdracht selecteert het element <img class="poster"> van het element <li id="shakira-concert"> binnen het element <div id="content">.
  10501. jQuery gebruikt de CSS-syntaxis voor classes en id’s:
  10502. # voor id
  10503. . voor class
  10504. De functie addClass()
  10505. De functie addClass() voegt de eigenschappen (properties) van een specifi eke CSSclass toe aan alle wrapper-elementen. Bijvoorbeeld:
  10506. $('#content> #specials').addClass('specials');
  10507. Hier hebben we de class specials aan alle elementen met id='specials' toegevoegd.
  10508. • Opgave 50: De functie addClass()
  10509. Zorg ervoor dat in fl ashtix.js de class .ui-corner-all wordt toegevoegd aan alle
  10510. posters van de lastminute-pagina.
  10511. $('#lastminutecontent > ul > li > a > img').addClass(
  10512. 'ui-corner-all');
  10513. Het resultaat zijn afbeeldingen met afgeronde hoeken.
  10514. De functie CSS()
  10515. De functie css() voegt een nieuwe CSS-eigenschap toe aan het geselecteerde element. Bijvoorbeeld:
  10516. $('#content').css('width', 450);
  10517. Hier krijgt het element <div id= "content "> een breedte van 450 pixels.
  10518. • Opgave 51: De functie css
  10519. Open fl ashtix.js en voeg de volgende code toe.
  10520. $('#lastminutecontent > ul > li > a > img').css(
  10521. 'border-radius','50%');
  10522. Het resultaat zijn afbeeldingen met afgeronde hoeken.
  10523. Eigenschap-selectors [ ]
  10524. We kunnen ook een individueel <li>-element selecteren en manipuleren door
  10525. naar de eigenschap van het element te zoeken. Hiervoor gebruiken we de vierkante
  10526. haakjes [ ]. Als je bijvoorbeeld het tweede <li>-element in de volgende lijst specials wilt selecteren:
  10527. 334 4 jQuery
  10528. <ul id='spacials'>
  10529. <li><a href='#cdspage'>CD's</a></li>
  10530. <li><a href='#posterspage'>Posters</a></li>
  10531. </ul>
  10532. dan kun je specifi ek op de waarde van de eigenschap href= selecteren. Bijvoorbeeld:
  10533. $('[href="#posterspage"]')
  10534. Stel je voor dat de tickets voor het Shakira-concert zijn uitverkocht. Dan wil je dat
  10535. in je webpagina vermelden. Dat doen we in de volgende opgave.
  10536. • Opgave 52: Attributen selecteren [ ]
  10537. Open fl ashtix.js en voeg onderaan de volgende jQuery-opdracht toe:
  10538. $('[href="#shakira-biopage"]').
  10539. append('<p class="melding">Uitverkocht!</p>');
  10540. Maak deze opgave af door de melding voor het jazzconcert: Nog 10 kaarten! Het
  10541. resultaat moet zijn zoals in fi guur 4.41.
  10542. De functie show()
  10543. Met de functie show() maken we onzichtbare elementen weer zichtbaar.
  10544. De functie hide()
  10545. Stel je voor dat je besloten hebt dat er in de weekends geen lastminutes voor rockconcerten worden verkocht. In de volgende opgave coderen we het volgende: wanneer het weekend is, maken we alle rockconcerten onzichtbaar.
  10546. • Opgave 53: De functie hide( )
  10547. Open fl ashtix.js en voeg onderaan de volgende jQuery-opdracht toe:
  10548. datum = new Date();
  10549. if(datum.getDay()===6 || datum.getDay()===0){
  10550. $('.rock').hide();
  10551. $('#bruce-concert').hide();
  10552. }
  10553. Als het weekend is, moet het resultaat zijn zoals in fi guur 4.41.
  10554. 4.11 Use cases van de lastminute-pagina 335
  10555. Figuur 4.41 De functie hide()
  10556. • Opgave 54: De functie hide()
  10557. Open fl ashtix.js en voeg onderaan de volgende jQuery-opdracht toe:
  10558. Zorg ervoor dat het concert van Jennifer Lopez onzichtbaar wordt.
  10559. • Opgave
  10560. Open fl ashtix.js en voeg onderaan de volgende jQuery-opdracht toe:
  10561. Voeg een afbeelding van een ster toe onderaan het Nora-concert.
  10562. De wildcard-selectors van CSS
  10563. Met de wildcard-selectors kunnen we elementen met specifi eke CSS-eigenschappen selecteren. Bijvoorbeeld eigenschappen die met een specifi eke tekst beginnen
  10564. of eindigen.
  10565. De beginwaardeselector [^=]
  10566. We kunnen een groep elementen selecteren door naar de waarde van de eigenschappen te zoeken. Door het teken (^) te gebruiken, kunnen we onze zoekopdracht verder uitbreiden. Bijvoorbeeld:
  10567. $('[href ^="#"]').hide();
  10568. In dit geval selecteren we alle elementen die een interne hyperlink hebben. Het
  10569. deel ^="#" betekent dat de eigenschap href= moet beginnen met de tekst "#".
  10570. 336 4 jQuery
  10571. De eindwaardeselector [$=]
  10572. Als je wilt zoeken naar alle elementen met eigenschappen die met een bepaalde
  10573. tekst eindigen, gebruik je het teken $. Bijvoorbeeld:
  10574. $('[href $="biopage"]').hide();
  10575. Hiermee selecteer je alle elementen met href-eigenschappen die eindigen met
  10576. "biopage". Met andere woorden: alle links naar de biopagina’s.
  10577. De wildcard-selector [*=]
  10578. Als je op zoek bent naar elementen met een eigenschap met een bepaalde tekst
  10579. aan het begin, in het midden of aan het eind van de eigenschap, dan gebruik je het
  10580. teken (*). Bijvoorbeeld:
  10581. $('[href *="bio"] ').hide();
  10582. Hiermee selecteer je alle hyperlinks met daarin de tekst "bio".
  10583. De functie size()
  10584. De functie size() geeft als uitvoer het aantal elementen binnen een wrapper. Als
  10585. je bijvoorbeeld wilt weten hoeveel <li>-elementen er in de lastminute-pagina zijn,
  10586. doe je het volgende:
  10587. alert($('#lastminutecontent > ul > li').size());
  10588. De functie fi rst()
  10589. De functie first() geeft als uitvoer een nieuwe wrapper met het eerste element uit
  10590. de wrapper. Bijvoorbeeld:
  10591. $('#lastminutecontent > ul > li').first().hide();
  10592. De functie last()
  10593. De functie last() geeft als uitvoer een nieuwe wrapper met het laatste element uit
  10594. de wrapper. Bijvoorbeeld:
  10595. $('#lastminutecontent > ul > li').last().show();
  10596. De functie html()
  10597. Er zijn twee functies voor het ‘setten’ (instellen) en het ‘getten’ (lezen) van HTMLcontent binnen geselecteerde elementen. Met de functie html() kunnen we vragen
  10598. naar de HTML-content van een element. Bijvoorbeeld:
  10599. $('#shakira-concert a > h3').html();
  10600. Dit geeft als resultaat de tekst ‘Shakira’ binnen het <h3>-element:
  10601. <h3>Shakira</h3>
  10602. 4.11 Use cases van de lastminute-pagina 337
  10603. De functie html(‘content’)
  10604. Met de functie html('content') kunnen we de content binnen een element wijzigen. Bijvoorbeeld:
  10605. $('#shakira-concert a > h3').html('Shakira!!!!!');
  10606. Hier vervangen we de content binnen het <h3>-element door:
  10607. <h3>Shakira!!!!!</h3>
  10608. Elementen verplaatsen
  10609. Het is mogelijke om een element overal in je webpagina te verplaatsen. Hiervoor
  10610. hebben we de functies before() en after().
  10611. De functies after() en before()
  10612. Stel dat je de volgorde van de concerten in de lastminute-pagina wilt veranderen.
  10613. Dan moet je eerst een doelelement selecteren en vervolgens een tweede element
  10614. verplaatsen naar voor of na dat doelelement. Bijvoorbeeld:
  10615. $('#nora-concert').after($('#shakira-concert'));
  10616. Hier hebben we het #nora-concert-element als doel geselecteerd en vervolgens het
  10617. #shakira-concert-element verplaatst naar onder het doel.
  10618. • Opgave 56: De functies after( ) en before( )
  10619. Open fl ashtix.js en voeg de volgende code toe:
  10620. $('#nora-concert').after($('#shakira-concert'));
  10621. Maak deze opgave af door ervoor te zorgen dat de elementen <li id='#jazz'> en
  10622. <li id='#nora-concert'> worden verplaatst naar boven het element <li id='#pop'>.
  10623. Het resultaat moet eruitzien zoals in fi guur 4.42.
  10624. 338 4 jQuery
  10625. Figuur 4.42
  10626. De each (iterator)
  10627. each(iterator) doorloopt alle wrapper-elementen. Zo kunnen we operaties per
  10628. element uitvoeren. Om bijvoorbeeld acties bij elk <li>-element van de content uit
  10629. te voeren doe je het volgende:
  10630. $('#content > li').each(function(){acties;});
  10631. In het volgende voorbeeld doorlopen we alle <li>-elementen en voeren we de actie
  10632. show() uit binnen de anonieme functie bij alle elementen in de wrapper.
  10633. • Opgave 57: De each(iterator)
  10634. Open fl ashtix.js en voeg de volgende code toe:
  10635. $('#lastminutecontent li') .each(function(){
  10636. $(this).show();
  10637. });
  10638. De functie insertBefore( )
  10639. Met de functies insertBefore() en insertAfter() kunnen nieuwe elementen toegevoegd worden tussen bestaande DOM-elementen. De syntaxis van insertBefore()
  10640. is:
  10641. $('nieuwe elementen').insertBefore(target-element)
  10642. of
  10643. $('nieuwe elementen').insertAfter(target-element)
  10644. 4.12 Use cases van de biopagina 339
  10645. In de volgende opgave voegen we een afbeelding in bovenaan de content van de
  10646. lastminute-pagina.
  10647. • Opgave 58: De functie insertBefore()
  10648. Open fl ashtix.js en voeg de volgende code toe:
  10649. $('<img class="poster" src="kylieposter.jpg" alt="pic" width="35%" />')
  10650. .insertBefore('#lastminutecontent > ul');
  10651. Het resultaat moet eruitzien zoals in fi guur 4.43.
  10652. Figuur 4.43 De functie insertBefore
  10653. 4.12 Use cases van de biopagina
  10654. Planning Inleveren
  10655. Opgaven 59 t/m 64
  10656. De biopagina is in zijn geheel gewijd aan de artiesten. De informatie moet gerealiseerd worden zoals aangegeven in onderstaande use cases.
  10657. Use cases van de biopagina
  10658. Use case 01 De video- en de biografi e-elementen van de biopagina moeten gesplitst worden in twee tabs.
  10659. Use case 02 Er moeten tweets van de artiesten vertoond
  10660. worden in de videotab van de biopagina.
  10661. Opmerkingen
  10662. In deze paragraaf splitsen we de content van de biopagina in twee tabs. Hiervoor
  10663. coderen we eerst de twee tabs. Het <content>-element van de Shakira-biopagina
  10664. hebben we in paragraaf 4.5 gecodeerd.
  10665. 340 4 jQuery
  10666. Je ziet dat we hier een <video>-element en een <p>-element binnen de content van
  10667. de biopagina hebben gecodeerd. We willen dat het <p>-element en het video-element onder een eigen tab komen te staan.
  10668. data-role= "tabs"
  10669. Met data-role= "tabs " kunnen we binnen het <content>-element een navbar-element coderen.
  10670. data-role= "navbar"
  10671. Met data-role= "navbar " kunnen we de links naar de tab-elementen coderen.
  10672. • Opgave 59: De navbar
  10673. Open index.html en vervang de content van de biopagina door de volgende tabs:
  10674. <div data-role="tabs" id="tabs">
  10675. <div data-role="navbar">
  10676. <ul>
  10677. <li><a href="#video" data-ajax="false">Video</a></li>
  10678. <li><a href="#bio" data-ajax="false">Biografie</a></li>
  10679. </ul>
  10680. </div>
  10681. </div> <!-- einde tabs -->
  10682. class= "ui-body-d"
  10683. De body of werkelijke tabs coderen we binnen class = "ui-body-d".
  10684. • Opgave 60: De eerste tab
  10685. Open index.html en voeg het volgende video-element onderaan het tabs-element
  10686. toe:
  10687. <div id="video" class="ui-body-d ui-content">
  10688. <h1>Video</h1>
  10689. <video controls="controls" width="90%"
  10690. preload id="video" poster="shakiraposter.jpg">
  10691. <source src="wildlife.mp4" type="video/mp4"/>
  10692. <source src="shakira.webm" type="video/webm"/>
  10693. <source src="shakira.3gpp" type="video/3gpp"/>
  10694. </video><!-- einde video -->
  10695. </div>
  10696. In dit voorbeeld hebben we de content van de video-tab gecodeerd.
  10697. • Opgave 61: De tweede tab
  10698. Open index.html en voeg de content van de tweede tab met de biografi e tekst eraan toe. Het resultaat moet er als volgt uitzien:
  10699. 4.12 Use cases van de biopagina 341
  10700. Figuur 4.44
  10701. De zoek-bar
  10702. In de volgende opgave coderen we een zoek-bar waar we een zoekterm kunnen
  10703. invoeren.
  10704. • Opgave 62: De eerste tab
  10705. Open index.html en voeg de volgende code aan de bio-tab toe:
  10706. <ul data-role="listview"
  10707. data-filter="true"
  10708. data-filter-reveal="true"
  10709. data-filter-placeholder="Zoek term ..."
  10710. data-inset="true">
  10711. <li><a href="#">T-shirts</a></li>
  10712. <li><a href="#">Boeken</a></li>
  10713. <li><a href="#">Albums</a></li>
  10714. </ul>
  10715. jQuery-plug-ins
  10716. jQuery kan worden uitgebreid met plug-ins. Plug-ins zijn jQuery-functies met een
  10717. specifi eke oplossing die ontwikkeld zijn door andere softwaredevelopers. Er zijn
  10718. bijvoorbeeld meerdere plug-ins voor het canvas te vinden op internet. Jij kunt ook
  10719. zelf plug-ins ontwikkelen en op internet posten. Zo kunnen andere developers je
  10720. 342 4 jQuery
  10721. plug-ins gebruiken. Meer informatie over het maken van plug-ins vind je via de
  10722. link
  10723. http:// docs.jquery.com/Plugins/Authoring.
  10724. Er is een interessante jQuery plug-in te vinden in op de site
  10725. http://plugins.in1.com/socialist.
  10726. Met deze plug-in kun je social-media-sites zoals Twitter, Facebook en LinkedIn in
  10727. je applicatie integreren. Download de plug-in en volg de stappen zoals beschreven
  10728. in de website.
  10729. • Opgave 63: jQuery-plug-ins
  10730. Open index.html en voeg de volgende links aan het <head>-element toe:
  10731. <link href="jquery.socialist.css" rel="stylesheet" />
  10732. <script src="jquery.socialist.js"></script>
  10733. Onderaan de video-tab van de Shakira-biopagina maak je het volgende <div>-element voor het weergeven van Shakira-tweets.
  10734. <div id="twittercontent"></div>
  10735. • Opgave 64: De Twitter-plug-in
  10736. Open fl ashtix.js en voeg de volgende code toe:
  10737. $('#twittercontent').socialist({
  10738. networks: [ {name: 'twitter',id: 'shakira'}
  10739. ] });
  10740. Het resultaat zie je in fi guur 4.45.
  10741. 4.13 Use cases van de bestelpagina 343
  10742. Figuur 4.45 jQuery-plug-ins
  10743. 4.13 Use cases van de bestelpagina
  10744. De bestelpagina is in zijn geheel gewijd aan het bestellen van gratis lastminutetickets. De informatie moet gerealiseerd worden zoals aangegeven in onderstaande
  10745. use cases.
  10746. Planning Inleveren
  10747. Opgaven 65 t/m 68
  10748. Use cases van de bestelpagina
  10749. Use case 01 Bij het verzenden van een bestelling krijgt de user via de
  10750. E-ticketspagina een e-ticket in de vorm van een QR-code
  10751. Opmerkingen
  10752. Om een digitaal ticket van de bestelling te versturen naar de app maken we gebruik
  10753. van AJAX.
  10754. Wat is AJAX?
  10755. AJAX is een mix van technologieën: HTML, JavaScript, XMLHttpRequest en een
  10756. server-side-programmeertaal zoals ASP (Active Server Pages) of PHP (Personal
  10757. Home Page). Met deze mix van technologieën kunnen we complexe, interactieve
  10758. 344 4 jQuery
  10759. en gebruikersvriendelijke interfaces opbouwen. Eenvoudig gezegd: AJAX bestaat
  10760. uit de volgende vier stappen:
  10761. 1 AJAX stuurt een httpRequest vanuit een webpagina naar een webserver.
  10762. 2 De webserver vertaalt de request in een query-opdracht, bijvoorbeeld naar een
  10763. data base. De database geeft het resultaat terug.
  10764. 3 AJAX verstuurt het resultaat naar de client/browser.
  10765. 4 AJAX vernieuwt een deel van de webpagina met het resultaat van de httpRequest.
  10766. AJAX lost het probleem van het vernieuwen van webpagina’s op, zodat je zonder te
  10767. veel opnieuw laden van pagina’s (page reloads) snellere, dynamischer en interactievere webapplicaties kunt ontwikkelen.
  10768. De term AJAX staat voor asynchroon JavaScript en XML.
  10769. XML is een op tekst gebaseerde markup-taal. XML wordt meestal gebruikt om
  10770. data te beschrijven en te transporteren. Zo kun je data uitwisselen, delen en opslaan.
  10771. Met XMLHttpRequest kun je een aanvraag vanuit een webpagina naar een webserver sturen en een resultaat ontvangen zonder dat de hele webpagina opnieuw moet
  10772. worden geladen. De gebruiker ziet dezelfde webpagina terwijl gegevens worden
  10773. uitgewisseld met de server. Alleen een deel van de pagina wordt vernieuwd.
  10774. Tabel 6.5 Eigenschappen van XMLHttpRequest
  10775. Eigenschap Beschrijving
  10776. onreadystatechange Event-handler als request-status verandert
  10777. readyState
  10778. Deze getallen beschrijven de actuele request-status:
  10779. 0 = UNSENT
  10780. 1 = OPENED
  10781. 2 = HEADERS_RECEIVED
  10782. 3 = LOADING
  10783. 4 = DONE
  10784. responseText Geretourneerde content
  10785. status Serverstatuscode: 200 voor succes, 404 voor niet gevonden
  10786. statusText Tekstmelding van de response
  10787. De functie $.ajax()
  10788. JQuery heeft het gebruik van AJAX voor ons eenvoudig gemaakt. Om een request
  10789. te versturen hebben we het volgende nodig:
  10790. • een POST- of GET-methode specifi ceren;
  10791. • een server-side URL die de request opvangt;
  10792. • een functie die informeert over de voortgang van de request.
  10793. In de volgende opgave coderen we de GET-methode van de functie $.ajax() om de
  10794. bestelling te lezen en om een digitaal ticket naar de app te versturen.
  10795. 4.13 Use cases van de bestelpagina 345
  10796. • Opgave 65: De POST-methode van AJAX
  10797. Open fl ashtix.js en voeg de volgende code toe:
  10798. $('#submit').click(function(){
  10799. var email = document.form.email.value;
  10800. var concert = document.form.concert.value;
  10801. $.ajax({
  10802. type:'POST',
  10803. url: 'getEticket.php',
  10804. data: ({
  10805. email: email,
  10806. concert: concert
  10807. }),
  10808. cache: false,
  10809. dataType: "text",
  10810. success: onSuccess
  10811. });
  10812. . . .
  10813. });
  10814. De functie ajax() krijgt de volgende attributen:
  10815. – type: POST is de soort AJAX-transactie.
  10816. – url: is het server-script dat de transactie afhandelt.
  10817. – data: de verstuurde data.
  10818. – dataType: mag text of json zijn.
  10819. – success: is de functie die data uit de server terugkrijgt en verwerkt.
  10820. Er zijn twee mogelijke uitkomsten uit een AJAX-request: success of error. Op de
  10821. puntjes behandelen we de twee mogelijkheden.
  10822. • Opgave 66: ajaxError
  10823. Open fl ashtix.js en voeg de volgende code toe:
  10824. $('#log').ajaxError(function(event, request, settings, exception) {
  10825. $('#log').html("Error: " + settings.url +
  10826. "<br />HTTP Code: " + request.status);
  10827. });
  10828. In het geval van success moet de succesfunctie de melding ‘E-ticket voor concert is
  10829. besteld.’ vertonen en het e-ticket moet in localStorage opgeslagen worden.
  10830. • Opgave 67: ajax succes
  10831. Open fl ashtix.js en voeg de volgende code toe:
  10832. function onSuccess(data){
  10833. $('#form').append('<p>E-Ticket voor concert'+ concert +
  10834. '</p><img src="'+ data + '" alt="pic" width="35%" />');
  10835. localStorage.setItem(concert,data);
  10836. }
  10837. 346 4 jQuery
  10838. Het server-script
  10839. Het server-script moet in dit geval een E-ticket in de vorm van een QR-code leveren. Om QR-code te genereren zoeken we een plug-in of server-library voor deze
  10840. taak. Een voorbeeld is de library gecodeerd door Kentaro Fukuchi en te vinden op:
  10841. http://phpqrcode.sourceforge.net/
  10842. Download en installeer deze library en gebruik deze in de volgende opgave.
  10843. • Opgave 68: Het serverscript
  10844. Typ het volgende php-script over en sla het op als getEticket.php.
  10845. <?php
  10846. include("phpqrcode/qrlib.php");
  10847. $email = $_REQUEST['email'];
  10848. $concert = $_REQUEST['concert'];
  10849. $filename = $email . $concert . '.png';
  10850. QRcode::png("Gratis toegang tot concert $concert
  10851. bij het vertonen van dit QR code", $filename);
  10852. $eticket= "http://localhost:8888/Flashtix/$filename";
  10853. echo $eticket;
  10854. ?>
  10855. De echo-opdracht is de URL van het e-ticket doorgegeven aan de succesfunctie.
  10856. Het resultaat zie je in fi guur 4.46. Klik op Control-Shift-C en kies Resources om
  10857. naar je Local Storage te kijken.
  10858. LET OP
  10859. Controleer de instellingen van je webbrowser om je localStorage te activeren.
  10860. Figuur 4.46 Local Storage met link naar e-ticket
  10861. 4.14 De e-ticketspagina
  10862. In deze paragraaf maken we een functioneel ontwerp voor de e-ticketspagina. Het
  10863. doel van deze pagina is om alle e-tickets in de localStorage te vertonen.
  10864. Planning Inleveren
  10865. Opgaven 69 t/m 72
  10866. 4.14 De e-ticketspagina 347
  10867. Functioneel ontwerp van de eticketspagina
  10868. In het functioneel ontwerp van de e-ticketspagina tekenen we een <header>-
  10869. element met de header-navigatie, gevolgd door een <content>-element met daarin
  10870. de e-tickets in QR-code uit de localStorage. Als laatste tekenen we het <footer>-
  10871. element met de footer-navigatie.
  10872. Figuur 4.47 Draadmodel van de eticketspagina
  10873. De beschrijving van de e-ticketspagina ziet er als volgt uit:
  10874. Functioneel ontwerp van de e-ticketspagina
  10875. Beschrijving De e-ticketspagina toont alle e-tickets
  10876. uit je localStorage
  10877. Header-element
  10878. Navigatie-elementen
  10879. Link naar vorige bestelpagina
  10880. Link naar homepage
  10881. Content-element E-tickets
  10882. Footer-element Link naar agendapagina
  10883. Link naar locatiepagina
  10884. Opmerkingen
  10885. • Opgave 69: De e-ticketspagina
  10886. Open index.html en codeer het volgende <div data-role="page">-element onderaan de agendapagina.
  10887. <div data-role="page" class="page" id="eticketspage">
  10888. . . .
  10889. </div><!-- einde eticketspage -->
  10890. Op de puntjes coderen we in de komende opgaven meer content.
  10891. 348 4 jQuery
  10892. • Opgave 70: Header en footer van e-ticketspagina
  10893. Open index.html en codeer het header- en footer-element met de navigatie volgens het draadmodel in fi guur4.47.
  10894. • Opgave 71: Content van e-ticketspagina
  10895. Open index.html en codeer het content-element als volgt:
  10896. <div data-role="content" class="content" >
  10897. <div id="etickets"></div>
  10898. </div><!-- einde content -->
  10899. Use cases van de e-ticketspagina
  10900. In deze paragraaf coderen we nieuwe functionaliteit voor de e-ticketspagina zoals
  10901. beschreven in de volgende use cases:
  10902. Use cases van de e-ticketspagina
  10903. Use case 01 Wanneer de gebruiker naar de e-ticketspagina
  10904. navigeert ziet hij/zij de bestelde gratis e-tickets
  10905. Opmerkingen
  10906. In de volgende opgave zoeken en vertonen we e-tickets vanuit localStorage.
  10907. • Opgave 72: Toon e-tickets
  10908. Open fl ashtix.js en voeg de volgende code toe:
  10909. if(localStorage.getItem('bruce')!== null){
  10910. eticket = localStorage.getItem('bruce');
  10911. $('#etickets').append(
  10912. '<p>E-Ticket Concert Bruce Springsteen</p><img src="'+
  10913. eticket + '" alt="pic" width="35%" />');
  10914. }
  10915. if(localStorage.getItem('shakira')!== null){
  10916. eticket = localStorage.getItem('shakira');
  10917. $('#etickets').append(
  10918. '<p>E-Ticket Concert Shakira</p><img src="'+ eticket +
  10919. '" alt="pic" width="35%" />');
  10920. }
  10921. 4.15 De agendapagina
  10922. In deze paragraaf maken we het functioneel ontwerp voor de agendapagina. Het
  10923. doel van deze pagina is om een agenda bij te houden van belangrijke concertdata,
  10924. bijvoorbeeld de datum en tijd van concerten en de locatie.
  10925. 4.15 De agendapagina 349
  10926. Planning Inleveren
  10927. Opgaven 73 t/m 80
  10928. Functioneel ontwerp van de agendapagina
  10929. In het functioneel ontwerp van de agendapagina tekenen we een <header>-element
  10930. met de header-navigatie, gevolgd door een <content>-element met daarin agendaregels. Als laatste tekenen we het <footer>-element met de footer-navigatie.
  10931. Figuur 4.48 Draadmodel van de agendapagina
  10932. De beschrijving van de agendapagina ziet er als volgt uit:
  10933. Functioneel ontwerp van de agendapagina
  10934. Beschrijving De agendapagina toont reminders van concerten
  10935. Header-element
  10936. Navigatie-elementen
  10937. Link naar homepage
  10938. Link naar agendapagina
  10939. Link naar lastminute-pagina
  10940. Content-element
  10941. Agenda-items
  10942. Een datumveld
  10943. Een tekstveld
  10944. Footer-element Link naar agendapagina
  10945. Link naar locatiepagina
  10946. Opmerkingen
  10947. 350 4 jQuery
  10948. Use cases van de agendapagina
  10949. In deze paragraaf coderen we nieuwe functionaliteit voor de agendapagina zoals
  10950. beschreven in de volgende use cases:
  10951. Use cases van de agendapagina
  10952. Use case 01 Wanneer de gebruiker op de plus-knop klikt, wordt
  10953. een nieuw agenda-item gemaakt.
  10954. Use case 02 Wanneer de gebruiker op de aanvink-knop klikt,
  10955. wordt een agenda-item aangevinkt.
  10956. Use case 03 Wanneer de gebruiker op de min-knop klikt, wordt
  10957. een aanvinking ongedaan gemaakt.
  10958. Use case 04 Wanneer de gebruiker op de del-knop klikt, wordt een
  10959. item verwijderd.
  10960. Use case 05 Wanneer de gebruiker op de refresh-knop klikt, wordt
  10961. de agenda in local storage opgeslagen.
  10962. Use case 06 Wanneer de gebruiker de applicatie opstart, worden
  10963. alle agenda-items vanuit local storage vertoond.
  10964. Opmerkingen
  10965. De content van de agendapagina moet een lijst met knoppen voor de volgende
  10966. functionaliteiten hebben:
  10967. • selecteer item;
  10968. • selectie ongedaan maken;
  10969. • item toevoegen;
  10970. • item verwijderen;
  10971. • agenda opslaan.
  10972. Codering van de agendapagina
  10973. In de volgende opgave coderen we de header- en footer-elementen van de agendapagina. We beginnen met het coderen van de knoppen en daarna voegen we de
  10974. functionaliteit aan de knoppen toe.
  10975. De knop Item toevoegen
  10976. In de volgende opgaven coderen en koppelen we functionaliteit aan de knop Item
  10977. toevoegen.
  10978. • Opgave 73: Content van agendapagina
  10979. Open index.html en codeer de volgende content binnen de agendapagina:
  10980. <div data-role="content" class="content" >
  10981. <div data-role="controlgroup" data-type="horizontal">
  10982. <a href="#agendapage" data-role="button"
  10983. data-icon="check" id="sel"
  10984. data-iconpos="notext">Select</a>
  10985. 4.15 De agendapagina 351
  10986. <a href="#agendapage" data-role="button"
  10987. data-icon="plus" id="add"
  10988. data-iconpos="notext">Add</a>
  10989. <a href="#agendapage" data-role="button"
  10990. data-icon="delete" id="del"
  10991. data-iconpos="notext">Delete</a>
  10992. <a href="#agendapage" data-role="button"
  10993. data-icon="refresh" id="sav"
  10994. data-iconpos="notext">Save</a>
  10995. </div>
  10996. <div id="agendalijst"></div>
  10997. </div><!-- einde content -->
  10998. • Opgave 74: Item toevoegen
  10999. Open fl ashtix.js en voeg de volgende code toe.
  11000. $('#add').bind('click',function() {
  11001. $('#agendalijst').append('<li class="agendaitem">'+
  11002. '<input class="itembox" type="checkbox"/>'+
  11003. '<input type="date" value="" id="itemdate" />'+
  11004. '<input id="itemtext" type="textarea" '+
  11005. 'placeholder="to do ..." /></li>');
  11006. });
  11007. • Opgave 75: Agendastijlen
  11008. Open mijnstyles.css en voeg de volgende code toe.
  11009. #agendalijst{
  11010. padding: 0px 10px 0px 10px;
  11011. list-style-type: none;
  11012. width: 95%;
  11013. }
  11014. .agendaitem{
  11015. padding: 0px 0px 0px 0px;
  11016. backgroundColor: #F7F387;
  11017. border: 0px;
  11018. border-bottom: solid 1px #3DD0B3;
  11019. text-align: left;
  11020. }
  11021. #itemdate{
  11022. backgroundColor: #F7F387;
  11023. border: 0px;
  11024. width: 35%;
  11025. }
  11026. #itemtext{
  11027. backgroundColor: #F7F387;
  11028. border: 0px;
  11029. width: 50%;
  11030. }
  11031. Als je vier keer op de plus-knop klikt, krijg je het resultaat zoals in fi guur 4.49 voor
  11032. het selecteren van een datum.
  11033. 352 4 jQuery
  11034. Figuur 4.49 Toegevoegde items
  11035. De knop Selecteren
  11036. We willen een knop coderen die alle agenda-items kan selecteren door het keuzevakje (checkbox) van alle items aan te vinken. In de volgende opgave coderen we de
  11037. knop en koppelen we de functionaliteit eraan.
  11038. • Opgave 76: Selecteer alle items
  11039. Open mijnjquery.js en voeg de volgende codes eraan toe.
  11040. $('#sel').bind('click',function() {
  11041. $('.itembox').each(function(){
  11042. $(this).click();
  11043. });
  11044. });
  11045. Het resultaat is dat als je op de knop #sel klikt alle selectievakjes worden aangevinkt (fi guur 4.50).
  11046. 4.15 De agendapagina 353
  11047. Figuur 4.50
  11048. • Opgave 77: Selecteer/deselecteer alle items
  11049. Open fl ashtix.js en voeg de volgende functionaliteit toe.
  11050. Verander de functionaliteit van de Select-knop zodat als je een tweede keer op de
  11051. knop klikt alle selectievakjes leeg worden gemaakt.
  11052. Local storage
  11053. Nadat je de agenda-items hebt toegevoegd die je ziet in fi guur 4.51 ga je de agenda
  11054. in local storage opslaan.
  11055. Figuur 4.51 Save agenda-items
  11056. In de volgende opgave coderen we deze knop en koppelen we de functionaliteit
  11057. eraan.
  11058. 354 4 jQuery
  11059. • Opgave 78: Bewaar alle items
  11060. Open fl ashtix.js en voeg de volgende code toe:
  11061. $('#sav').bind('click',function() {
  11062. localStorage.clear();
  11063. var teller = 0;
  11064. $('.agendaitem').each(function(){
  11065. itemdate = $(this).children('input: eq(1)').val();
  11066. itemtext = $(this).children('input: eq(2)').val();
  11067. if(itemdate === null) return;
  11068. teller++;
  11069. obj = {
  11070. id: teller,
  11071. datum: itemdate,
  11072. tekst: itemtext
  11073. }
  11074. localStorage.setItem(teller,JSON.stringify(obj));
  11075. });
  11076. });
  11077. Het resultaat is dat als je op de knop #sav klikt, alle agenda-items in local storage
  11078. worden opgeslagen. Als je kijkt naar de local storage in je browser, moet je hetzelfde kunnen zien als in fi guur 4.51.
  11079. De agenda opnieuw laden
  11080. Dit is de laatste stap voor onze agendapagina. In deze stap coderen we een functie zodat elke keer als je de agendapagina opent, alle agendagegevens vanuit local
  11081. storage opnieuw in de agendapagina worden geladen. Vervolgens worden de gegevens opnieuw in de agendapagina geladen.
  11082. • Opgave 79: Agenda opnieuw laden
  11083. Open fl ashtix.js en voeg de volgende code toe:
  11084. for (var i=1;i<= localStorage.length;i++){
  11085. if(localStorage.getItem(i)=== null){ continue;}
  11086. read_obj = JSON.parse(localStorage.getItem(i));
  11087. tekst = read_obj.tekst;
  11088. datum = read_obj.datum;
  11089. $('#agendalijst').append(
  11090. '<li class="agendaitem">'+
  11091. '<input class="itembox" type="checkbox"/>'+
  11092. '<input type="date" value="' +
  11093. datum + 'id="itemdate" />'+
  11094. '<input id="itemtext" type="textarea" '+
  11095. 'value="' + tekst + '" /></li>');
  11096. }
  11097. De knop Verwijderen
  11098. Stel dat je het laatste item (zie fi guur 4.52) wilt verwijderen. Dan moet je eerst het
  11099. item selecteren en daarna alle geselecteerde items verwijderen. Dat gebeurt in de
  11100. volgende opgave.
  11101. 4.16 De locatiepagina 355
  11102. Figuur 4.52 Aangevinkte items verwijderen
  11103. • Opgave 80: Verwijder aangevinkte items
  11104. Open fl ashtix.js en voeg de volgende code toe:
  11105. $('#del').bind('click',function() {
  11106. $('.itembox').each(function(){
  11107. var itemChecked = $(this).prop('checked');
  11108. if(itemChecked){
  11109. $(this).parent().remove();
  11110. }
  11111. });
  11112. });
  11113. Het resultaat is dat als je op de knop #del klikt, alle geselecteerde agenda-items
  11114. vanuit je local storage worden verwijderd. Als je naar de local storage in je browser
  11115. kijkt, moeten de aangevinkte items verwijderd zijn.
  11116. 4.16 De locatiepagina
  11117. In deze paragraaf maken we het functioneel ontwerp van de locatiepagina. Het
  11118. doel van deze pagina is om een Google-map met de locaties van de verschillende
  11119. concertpodia te tonen.
  11120. Planning Inleveren
  11121. Opgaven 81 t/m 87
  11122. 356 4 jQuery
  11123. Functioneel ontwerp van de locatiepagina
  11124. In het functioneel ontwerp van de locatiepagina tekenen we een <header>-element
  11125. met de header-navigatie, gevolgd door een <content>-element met daarin een
  11126. Google-map met de concertlocaties. Als laatste tekenen we het <footer>-element
  11127. met de footer-navigatie.
  11128. De beschrijving van de locatiepagina ziet er als volgt uit:
  11129. Figuur 4.53 Google-map
  11130. Functioneel ontwerp van de locatiepagina
  11131. Beschrijving De locatiepagina toont een Google-map
  11132. Header-element
  11133. Navigatie-elementen
  11134. Link naar homepage
  11135. Link naar vorige agendapagina
  11136. Link naar bestelpagina
  11137. Content-element Google-map met locatie van de verschillende
  11138. concertpodia
  11139. Footer-element Link naar agendapagina
  11140. Link naar locatiepagina
  11141. Opmerkingen
  11142. Codering van de locatiepagina
  11143. In de volgende opgave coderen we de locatiepagina met een Google-map en de
  11144. locaties van de concertpodia.
  11145. 4.16 De locatiepagina 357
  11146. • Opgave 81: De locatiepagina
  11147. Open index.html en codeer het volgende element <div data-role="page"> onderaan de locatiepagina.
  11148. <div data-role="page" id="locationpage" class="page">
  11149. .. .
  11150. </div><!-- einde locationpage -->
  11151. Op de puntjes coderen we in de komende opgaven meer content.
  11152. Header en footer van de locatiepagina
  11153. In deze paragraaf coderen we het header- en footer-element van de locatiepagina
  11154. volgens het functioneel ontwerp.
  11155. • Opgave 82: Header en footer van de locatiepagina
  11156. Open index.html en codeer het header- en footer-element met de navigatie zoals
  11157. in fi guur 6.28 te zien is.
  11158. Use cases van de locatiepagina
  11159. Hier coderen we nieuwe functionaliteit voor de locatiepagina zoals aangegeven in
  11160. de volgende use cases:
  11161. Use cases van de locatiepagina
  11162. Use case 01 Wanneer de gebruiker de locatiepagina opent, ziet hij
  11163. een Google-map met de locaties van de concertpodia
  11164. De content van de locatiepagina moet een kaart vanuit de Google-servers weergeven. De kaart krijgt markeringen op de verschillende adressen van de concertpodia
  11165. Om gebruik te maken van Google Maps moet je je eigen developer-key van de volgende Google-site halen:
  11166. https://developers.google.com/maps/documentation/javascript/get-api-key
  11167. Nadat je je eigen API_KEY hebt gekregen, maak je de volgende opgave.
  11168. • Opgave 83: Link naar Google-Maps-libraries
  11169. Open index.html en voeg de volgende link toe aan het <head>-element naar de server van Google Maps:
  11170. <script
  11171. src="http://maps.google.com/maps/api/js?sensor=false
  11172. &libraries=geometry&v=3.22&key=YOUR_API_KEY">
  11173. </script>
  11174. 358 4 jQuery
  11175. Het attribuut sensor=false betekent dat we geen gps willen gebruiken. YOUR_API_
  11176. KEY moet je zelf bij Google ophalen.
  11177. Content van de locatiepagina
  11178. We beginnen met het coderen van de content van de locatiepagina. Hier maken we
  11179. een Google-map.
  11180. • Opgave 84: Google-map-tag
  11181. Open index.html en voeg de content van de loatiepagina eraan toe:
  11182. <div data-role="content" class="content" id="googlemap" >
  11183. <div id="gmap" style="width: 100%;height: 100%;"></div>
  11184. </div><!-- /content -->
  11185. We hebben de coördinaten van een locatie nodig, bijvoorbeeld Paradiso in Amsterdam. Ga naar de volgende URL en typ het adres om de coördinaten te krijgen:
  11186. http://www. mapcoordinates.net/en
  11187. Van de site krijgen we de volgende coördinaten:
  11188. latitude = 52.3622774
  11189. longitude = 4.883945
  11190. • Opgave 85: Google-map maken
  11191. Open fl ashtix.js en voeg de volgende code eraan toe:
  11192. var positie = new google.maps.LatLng(52.3622774,4.883945);
  11193. var mapOptions = {
  11194. zoom: 4,
  11195. center: positie
  11196. }
  11197. var map = new google.maps.Map(document.getElementById("gmap"), mapOptions);
  11198. Het resultaat zie je hieronder:
  11199. 4.16 De locatiepagina 359
  11200. Figuur 4.54 Google-map
  11201. LET OP
  11202. Als je geen Google-map te zien krijgt, probeer de pagina in je browser dan weer te
  11203. laden totdat je de map ziet.
  11204. Google-markers
  11205. Om markers in je Google-map te kunnen plaatsen voer je de volgende opgave uit.
  11206. • Opgave 86: Markers in je Google-map
  11207. Open fl ashtix.js en voeg de volgende code eraan toe.
  11208. var marker = new google.maps.Marker({
  11209. position: positie,
  11210. title:'Paradiso: Weteringschans 6,\n' +
  11211. '1017 SG Amsterdam \n'+
  11212. 'Telefoon 020 222 22222'
  11213. });
  11214. // maak de marker
  11215. marker.setMap(map);
  11216. 360 4 jQuery
  11217. Figuur 4.55 Het resultaat van opgave 52: Google-map met markers
  11218. • Opgave 87: Meer markers in je Google-map
  11219. Open fl ashtix.js en voeg markers voor de volgende twee podia toe:
  11220. – Melkweg
  11221. – Bimhuis
  11222. 361
  11223. CSS
  11224. selecteren 15
  11225. CSS-attributen
  11226. background 44
  11227. background-color 16
  11228. background-color 25
  11229. background-position 45, 75
  11230. background-url 45
  11231. border-radius 47
  11232. box-shadow 21
  11233. capitalize 74
  11234. centreren 26
  11235. class 15
  11236. clear 39
  11237. color 15, 16
  11238. display block 37
  11239. fl oat 38
  11240. font 26
  11241. font-size 26
  11242. font-weight 27
  11243. gradient 39
  11244. height 16
  11245. id 15
  11246. in line 18
  11247. list-style-type 37
  11248. lowercase 74
  11249. margin 25
  11250. overfl ow 25
  11251. padding 20
  11252. position 51
  11253. rgb 29
  11254. rgba 32
  11255. text-align 15, 25
  11256. text-decoration 40
  11257. uppercase 74, 75
  11258. width 16
  11259. z-index 56
  11260. css-functie 333
  11261. CSS-klassen
  11262. pseudo 40
  11263. CSS sub attributen
  11264. declareren 27
  11265. D
  11266. datalist 80
  11267. data-role
  11268. content 284
  11269. footer 284
  11270. header 284
  11271. page 284
  11272. data-theme
  11273. b 291
  11274. B
  11275. background 44
  11276. background-color 16
  11277. backgroundColor 25
  11278. background-position 45, 75
  11279. background size 92
  11280. background-url 45
  11281. before functie 337
  11282. Beslissingsstructuren
  11283. do-while lus 196
  11284. if else 166
  11285. lussen 184
  11286. bind functie 319
  11287. bind function 256
  11288. boolean 133
  11289. border-radius 47
  11290. box-shadow 21
  11291. browser
  11292. download 6
  11293. browser prefi x 48
  11294. C
  11295. callback-functies 259
  11296. call-functie 254
  11297. canvas 324
  11298. Canvas
  11299. clearRect 327
  11300. fi llRect 327
  11301. fi llStyle 326
  11302. gradient 326
  11303. strokeRect 327
  11304. capitalize 74
  11305. CDN
  11306. content delivery network 284
  11307. centreren 26
  11308. chaining-properties 266
  11309. charAt 187
  11310. charAt string methode 204
  11311. charset 9
  11312. Class
  11313. ui-grid-b 290
  11314. class-diagram 235
  11315. class met methoden 236
  11316. class met properties 236
  11317. clear 39
  11318. clearTimeout 216
  11319. closure-functies 261
  11320. colspan 71
  11321. constructor pattern 240
  11322. Register
  11323. ~ 110
  11324. A
  11325. absolute positie 54
  11326. addClass-functie 333
  11327. after-functie 337
  11328. ajax-functie 344
  11329. anonieme functies 259
  11330. append-functie 314
  11331. apply-functie 256
  11332. Apps
  11333. frameworks 279
  11334. hybride apps 279
  11335. meta viewport 284
  11336. native apps 278
  11337. webapps 278
  11338. Array
  11339. declareren 138
  11340. element declareren 138
  11341. element verwijderen 147
  11342. multidimensionaal 140
  11343. pointers 142
  11344. transporteren 149
  11345. Array-methodes
  11346. indexOF 147
  11347. join 150
  11348. lenght 154
  11349. pop 144
  11350. push 144
  11351. reverse 146
  11352. shift 143
  11353. sort 146
  11354. splice 145
  11355. typeof 148
  11356. unshift 144
  11357. array-object 152
  11358. attributen
  11359. data-icon 295
  11360. label for 308
  11361. placeholder 308
  11362. text-transform 74
  11363. Attribuut-data-iconpos 295
  11364. Audio
  11365. element 73
  11366. formats 73
  11367. source 73
  11368. 362 Register
  11369. I
  11370. if else 166
  11371. indexOf array 147
  11372. indexOf string-methode 202
  11373. inheritance 244
  11374. in line 18
  11375. input type =\“checkbox\” 82
  11376. input type =\“date\” 81
  11377. input type =\“radio\” 81
  11378. input type =\“textarea\” 82
  11379. J
  11380. JavaScript
  11381. console 125
  11382. taalcomponenten 124
  11383. join array 150
  11384. jQuery
  11385. addClass 333
  11386. after 337
  11387. ajax 344
  11388. append 314
  11389. before 337
  11390. bind 319
  11391. css 333
  11392. die 323
  11393. DOM laden 314
  11394. fi rst 336
  11395. hide 334
  11396. html 336
  11397. last 336
  11398. live 323
  11399. one 323
  11400. prepend 314
  11401. remove 317
  11402. show 334
  11403. size 336
  11404. trigger 323
  11405. unbind 322
  11406. JS-methoden
  11407. charAt 187
  11408. clearTimeout 216
  11409. document.write 124
  11410. parseFloat 134
  11411. parseInt 134
  11412. prompt 125
  11413. setTimeout 215
  11414. toString 135
  11415. typeof 132
  11416. undefi ned 136
  11417. element kopiëren met slice 149
  11418. element verwijden met
  11419. splice 148
  11420. element verwijderen 147
  11421. em 87
  11422. encapsulation 246
  11423. F
  11424. fi rst-functie 336
  11425. fi xed 52
  11426. fl oat 38
  11427. font 26
  11428. font-size 26
  11429. font-weight 27
  11430. formulieren
  11431. <datalist> 80
  11432. element 78
  11433. input type =\“checkbox\” 82
  11434. input type =\“date\” 81
  11435. input type =\“radio\” 81
  11436. input type =\“textarea\” 82
  11437. legend 79
  11438. <option> 81
  11439. <select> 81
  11440. frameworks voor apps 279
  11441. G
  11442. geneste object literals 266
  11443. Google
  11444. markers 359
  11445. gradient 39
  11446. H
  11447. heredity 262
  11448. hide-functie 334
  11449. HTML
  11450. Character Entity Encoding 60
  11451. editors 3
  11452. elementen 4
  11453. evolutie 1
  11454. symbolen 60
  11455. html-functie 336
  11456. hybride apps 279
  11457. hyperlinks
  11458. active 41
  11459. focus 41, 43, 50
  11460. hover 41
  11461. visited 41, 43
  11462. data-transition
  11463. slide 291
  11464. datatype
  11465. boolean 133
  11466. NaN 136
  11467. string 132
  11468. date object 156
  11469. description 9
  11470. destructor 239
  11471. die-functie 323
  11472. display block 37
  11473. display fl ex 103
  11474. document.write 124
  11475. DOM
  11476. window-events 214
  11477. do-while-lus 196
  11478. drawer-menu 105
  11479. E
  11480. elementen
  11481. <a> 34
  11482. <audio> 73
  11483. <body> 10
  11484. canvas 324
  11485. commentaar 5
  11486. <div> 10
  11487. <!DOCTYPE> 5
  11488. <em> 87
  11489. <footer> 10
  11490. <form> 78
  11491. <h1> tot <h6> 11
  11492. <head> 6
  11493. <html> 5
  11494. <li> 34
  11495. <link> 23
  11496. <main> 10
  11497. <mark> 87
  11498. <nav> 10, 34
  11499. <ol> 34
  11500. <section> 10
  11501. semantische 10
  11502. sluiten> 5
  11503. <source> 68
  11504. <strong> 87
  11505. <tbody> 71
  11506. <tfoot> 70
  11507. <th> 70
  11508. <thead> 70
  11509. <title> 6
  11510. <tr> 70
  11511. <ul> 34
  11512. <video> 67
  11513. Register 363
  11514. pop array 144
  11515. position
  11516. absolute 54
  11517. fi xed 52
  11518. prepend-functie 314
  11519. prompt 125
  11520. prototype pattern 242
  11521. pseudoklassen
  11522. active 41
  11523. hover 41
  11524. push array 144
  11525. R
  11526. random math methode 200
  11527. remove-functie 317
  11528. responsive design 88
  11529. return-functies 260
  11530. reverse array 146
  11531. rgb 29
  11532. rgba 32
  11533. round math-methode 200
  11534. S
  11535. select 81
  11536. setTimeout 215
  11537. shift array 143
  11538. show-functie 334
  11539. size-functie 336
  11540. slide-transition 291
  11541. sort array 146
  11542. splice array 145
  11543. split string-methode 204
  11544. string 132
  11545. string-methodes
  11546. charAt 204
  11547. indexOf 202
  11548. split 204
  11549. substr 206
  11550. substring 205
  11551. toLowerCase 206
  11552. toUpperCase 206
  11553. strong 87
  11554. subclass 236
  11555. substring-methode 205
  11556. substr string-methode 206
  11557. symbolen in HTML 60
  11558. max math-methode 199
  11559. media query 91
  11560. meta-elementen
  11561. author 9
  11562. charset 9
  11563. description 9
  11564. keywords 9
  11565. language 9
  11566. refresh 9
  11567. robots 9
  11568. meta viewport 284
  11569. methode overschrijven 246
  11570. methodes
  11571. play 73
  11572. min math-methode 199
  11573. mobiele emulator 281
  11574. N
  11575. NaN 136
  11576. native apps 278
  11577. O
  11578. objecten berichten sturen 243
  11579. objecten bundelen 267
  11580. object literals 264
  11581. one-functie 323
  11582. OOP
  11583. constructor pattern 240
  11584. delete 247
  11585. destructor 239
  11586. encapsulation 246
  11587. heredity 262
  11588. inheritance 244
  11589. methode overschrijven 246
  11590. objecten communiceren 243
  11591. prototype pattern 242
  11592. webshop 270
  11593. opacity 40, 48
  11594. operatoren 127
  11595. option 81
  11596. overfl ow 25
  11597. overload-operatoren 129
  11598. P
  11599. padding 20
  11600. parseFloat 134
  11601. parseInt 134
  11602. pixels 15
  11603. play 73
  11604. JS-objecten
  11605. array 152
  11606. date 156
  11607. JSON
  11608. chaining properties 266
  11609. geneste object literals 266
  11610. objecten bundelen 267
  11611. object literals 264
  11612. JS speciale functies
  11613. anonieme 259
  11614. apply 256
  11615. bind 256
  11616. call 254
  11617. callback 259
  11618. closure 261
  11619. return 260
  11620. zelfuitvoerende 260
  11621. L
  11622. last-functie 336
  11623. legend 79
  11624. lenght array 154
  11625. link 23
  11626. lists 34
  11627. list-style-type 37
  11628. live-functie 323
  11629. localStorage
  11630. lezen 269
  11631. lowercase 74
  11632. lussen 184
  11633. M
  11634. margin 25
  11635. mark 87
  11636. Material design
  11637. beweging 99
  11638. cards 114
  11639. hiërarchie 101
  11640. interactie 101
  11641. licht 98
  11642. objecten 97
  11643. omvorming 98
  11644. schaduw 98
  11645. tabs 112
  11646. z-as 96
  11647. Math
  11648. max 199
  11649. min 199
  11650. random 200
  11651. round 200
  11652. 364 Register
  11653. W
  11654. webapps 278
  11655. webpagina
  11656. layout 1
  11657. window-events in DOM 214
  11658. write 124
  11659. Z
  11660. zelfuitvoerende functies 260
  11661. z-index
  11662. lagen 56
  11663. U
  11664. UML
  11665. class diagram 235
  11666. class met methoden 236
  11667. class met properties 236
  11668. subclass 236
  11669. unbind-functie 322
  11670. undefi ned 136
  11671. unshift-array 144
  11672. uppercase 74, 75
  11673. url 43
  11674. V
  11675. variabelen 126
  11676. Video
  11677. conversies 69
  11678. formats 68
  11679. videoconversies 303
  11680. T
  11681. taalcomponenten 124
  11682. tabellen
  11683. body 71
  11684. colspan 71
  11685. footer 70
  11686. kolom 70
  11687. kop 70
  11688. rij 70
  11689. testen in de cloud 286
  11690. text-decoration 40
  11691. text-transform 74
  11692. toLOwerCase string-methode 206
  11693. toString 135
  11694. toUpperCase string-methode 206
  11695. translate3d 109
  11696. trigger-functie 323
  11697. typeof 132
  11698. typeof array 148
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement