Øvelser del 1 (se også kopier)
6. Brug af DOM'en til at læse og ændre html elementer (Document Object Model)
Øvelser del 2 (se også kopier)
Opsamling + Freehostia

Sammenlignende operatorer
| Sammenligning | Hvad den gør |
|---|---|
| x == y | Returnerer sand hvis x og y er ens |
| x != y | Returnerer sand hvis x og y ikke er ens |
| x > y | Returnerer true hvis x er større end y |
| x >= y | Returnerer sand hvis x er større end eller lig med y |
| x < y | Returnerer sand hvis x er mindre end y |
| x <= y | Returnerer sand hvis x er mindre end eller lig med y |
| Logisk operator | Hvad den gør |
|---|---|
| x && y | Returnerer sand hvis både x og y er sand |
| x || y | Returnerer sand hvis enten x eller y er sand |
| !x | Returnerer sand hvis x er falsk |
Via disse operatorer kan man i JavaScript opstiller logiske betingelser som kan styre programmets afvikling.
En betingelse er i flowchartet repræsenteret ved en betingelses diamant.
Betingelser på et website kan f.eks. være:
(userName == "Bjarne" && passWord == "12345678") som enten kan være sandt eller falsk
(browser=="Netscape"||browser=="Microsoft Internet Explorer")
(screenWidth >= 1024)
I dagligdagen træffer vi konstant forskellige afgørelser, der afhænger af de givne omstændigheder. Fx når det gælder vejret. Falder temperaturen under et bestemt punkt skifter vi til vintertøj, og når den igen stiger om foråret er det sommertøjet vi finder frem. Når det regner, er det parablyen vi leder efter. Er vi ude at handle ind er det parametre som pris og kvalitet, økonomi og behov, der afgør hvilken vare vi køber eller undlader at købe.
På tilsvarende vis træffes der beslutninger i softwareprogrammer. De erklæringer, der foretager beslutningerne, kaldes inden for programmering kontrolstrukturer.
I JavaScript findes tre grundlæggende kontrolstrukturer:
JavaScript-kode afvikles sekventielt, hvis ikke andet er specificeret. Dermed menes, at koden afvikles oppe fra og ned, linje for linje. I et JavaScript, der kun indeholder kontrolstrukturen sekvens, vil al koden blive afviklet. I sekventielt afviklet kode træffes der ingen beslutninger undervejs.
Ofte ønsker man dog, at lade programmet skal tage stilling til om en bestemt del af JavaScriptet skal afvikles eller ikke. Til det formål kan man opstille betingelser der afgør, om koden udføres.
Den mest simple programkontrol er at undersøge om en bestemt betingelse er opfyldt, og lade programmet udføre en eller flere erklæringer, hvis det er tilfældet. Det kaldes enkeltselektion:
if (betingelse){
erklæring(er) hvis sand;
}
Læg godt mærke til syntaksen. Det reserverede ord if efterfølges af betingelsen, der er placeret i et sæt parenteser. Det, der skal udføres, hvis betingelsen er opfyldt, er omsluttet af tuborgklammer. Inden for tuborgklammerne kan der placeres en række erklæringer, der strække sig over flere linjer. Pointen er, at disse kodelinjer opfattes som en samlet kodeblok, der enten bliver afviklet samlet eller slet ikke.
var minAlder;
minAlder = 12;
if (minAlder < 18) {
alert("Beklager, du har ikke stemmeret.")
}
I det øjeblik JavaScriptet afvikles bliver betingelsen testet. Hvis betingelsen testes sand bliver koden i tuborgklammerne udført, teses den derimod falsk, bliver den ikke udført. Da betingelsen i ovennævnte eksempel er sand (12 er mindre end 18) bliver koden udført. Var værdien af minAlder derimod 18 eller højere, ville alert-boksen ikke blive vist.
Den eller de betingede erklæringer rykkes normalt ind. Det gør koden mere læsevenlig og dermed lettere at vedligeholde.
If-konstruktionen fungerer fint så længe, at der kun er behov for, at en sand evaluering af betingelsen skal udløse en særlig programsekvens. Men ofte vil man i sine programmer være interesseret i at evalueringen falsk, også skal udløse en særlig programsekvens. Til det formål benyttes en if...else konstruktion. Det kaldes også en dobbeltselektion:
if (betingelse){
erklæring(er) hvis sand
} else {
erklæring(er) hvis falsk
}
Den eneste forskel fra if konstruktionen ovenfor er det reserverede ord else, der muliggør indsættelse af erklæringer, der bliver udført, hvis betingelsen er falsk.
Lad os se på et eksempel:
var minAlder;
minAlder = 21;
if (minAlder< 18) {
alert("Beklager, du har ikke stemmeret.")
}
else {
alert("Velkommen til stemmeboksen.")
}
Det afgørende her er at lægge mærke til, at hvis minAlder er mindre end 18, bliver erklæringen i den første betingelse udført, mens erklæringen i den anden betingelse bliver udført i alle andre tilfælde.
En tredje mulighed er:
if (betingelse1){
erklæring(er) hvis sand
} else if (betingelseN){
erklæring(er) hvis sand
}
Denne sidste if...else if konstruktion kan evt. kombineres med flere else if betingelser og evt. med en else betingelse til sidst.
var partifarve;
partifarve = "hvid";
if (partifarve == "rød" ){
alert("Velkommen i den socialistiske gruppe.");
}
else if (partifarve == "blå" ) {
alert("Velkommen i den borgerlige lejr.");
}
else if (partifarve == "lyserød" ) {
alert("Velkommen i den socialdemokratisk partiforening.");
}
else if (partifarve == "sort" ) {
alert("Velkommen blandt anarkisterne.");
}
else {
alert("Velkommen til " + partifarve + " gruppe");
}
I dette tilfælde er det den sidste betingelse - else-betingelsen - der bliver udført. Sådanne kontrolstrukturer, hvor der er en række mulige udfald, kaldes multipel selektion.
Endelig kan kontrolstrukturen switch anvendes:
switch ( parameter ) {
case value:
instruktion(er);
break;
case value:
instruktion(er);
break;
....
[default:
instruktion(er);]
}
I eksemplet er parameter en variabelværdi, som overføres til selektionen, og value repræsenterer mulige værdier variablen kan antage, og som programkoden skal reagere på. Svarer ingen værdier til parameterens værdi, kan man - det er frivilligt - indsætte default-instruktioner til sidst, som da bliver udført.
Den funktionalitet det er muligt at udføre med switch, kan også udføres med en "if, else if, else" konstruktion, men er der mere en tre-fire betingelser at teste, er switch enklere at skrive og dermed lettere at vedligeholde. Lad os tage eksemplet fra før og placere den samme funktionalitet i en switch:
var partifarve;
partifarve = "hvid";
switch (partifarve) {
case "rød":
alert("Velkommen i den socialistiske gruppe.");
break;
case "blå":
alert("Velkommen i den borgerlige lejr.");
break;
case "lyserød":
alert("Velkommen i den socialdemokratiske partiforening.");
break;
case "sort":
alert("Velkommen blandt anarkisterne.");
break;
default:
alert("Velkommen til " + partifarve + " gruppe");
}
En løkke er en kontrolstruktur, der giver programmøren mulighed for at opbygge kode, som gentager sig selv, enten et bestemt antal gange eller så længe en bestemt betingelse er opfyldt. Så snart betingelsen ikke er opfyldt, bryder scriptet ud af løkken og fortsætter med at udføre de øvrige erklæringer i koden.
Stort set alle programmeringssprog rummer 3 grundlæggende løkke-strukturer: En for-løkke, hvor man angiver et antal gennemløb ("iteration" - af lat. iteratio af iterare, der betyder at gentage), en while-løkke der indeholder en test i løkkens start, og en do-while-løkke der indeholder en test i løkkens slutning.
for (initiale værdi; betingelse; opdaterede værdi){
erklæring(er) inde i løkken
}
Løkken starter med det reserverede ord for efterfulgt af 3 erklæringer i parentesen. De er afgørende for den måde løkken arbejder på. Det første udtryk angiver navnet på en variabel, der tildeles en startværdi. Det andet udtryk er en betingelse, præcis som i betingelse-erklæringen i if konstruktionen. Så længe betingelsen er sand, udføres løkkens kodeblok, dvs. koden mellem tuborgklammerne. Er den derimod falsk, forsætter programmet og afvikler koden efter løkkens kodeblok. Den sidste erklæring er en opdateringserklæring, der tildeler variablen en ny værdi, hver gang løkken har foretaget et gennemløb. De tre erklæringer adskilles med semikolon. Løkken gennemløbes altså, så længe betingelsen er opfyldt.
En meget almindelig implementering af for-løkken, er at definere den initiale udtryk som et tal, der for hvert gennemløb opdateres vha. det opdaterede udtryk. :
for (var i = minVærdi; i <= maxVærdi; i++) {
erklæring(er) inde i løkken;
}
Man kan tilsvarende konstruere en løkke med en tæller, der tæller nedad:
for (var i = maxVærdi; i >= minVærdi; i--){
erklæring(er) inde i løkken;
}
Lad os se på et eksempel:
for (var i = 1; i <= 4; i++){
alert("Dit " + i + ". klik!")
}
Denne struktur er enklere i sin opbygning end for-løkken:
while (betingelse){
erklæring(er) inde i løkken;
}
Løkken starter med det reserverede ord while, og herefter følger et sæt parenteser, som indeholder en betingelse. Så længe betingelsen er sand udføres koden i løkkens kodeblok (erklæringerne mellem tuborgklammerne). Er betingelsen falsk fortsætter programmet efter løkkens kodeblok.
Vi har allerede brugt funktionerne alert( ) og prompt( ) og parseInt( ) i forbindelse med output af tekst og variable indhold, bruger input samt konvertering/parsing af Strings til en helt tal (integer ).
var userName = prompt("Hvad hedder du?","Kim?");
var userAge = parseInt(prompt(" Hvor gammel er du?",2));
alert("Goddag "+ userName);
I programmet tager prompt funktionen to String parametre, som browseren bruger i udformningen af prompt boksen.

Når brugeren har indtastet sit navn og trykket på ok knappen, returnere prompt funktionen navnet og det bliver i programmet tildelt (gemt i) variablen userName.
Prompt funktionen (en window metode) er defineret af udviklerne af browseren men kan kaldes fra javascript programmet hvis man bruger den rigtige syntaks.
Denne syntax kan man f.eks. finde i en Javascript reference som www.w3schools.com
| prompt(text,defaultText) |
| Parameter | Description |
|---|---|
| text | Optional. The message to display in the dialog box. Default is "" |
| defaultText | Optional. The default input text |
fra http://www.w3schools.com/HTMLDOM/met_win_prompt.asp
Funktioner kan også kaldes direkte fra brugergrænsefladen vil links og form elementer.
Eksempler:
- Calling the alert commando with a button or a link
I programmering vil man ofte lave sine egne funktioner. Dette gøre via keywordet function efterfulgt af navnet på funktionen. Lige som for variable gælder der også regler for navngivning af funktioner dvs.
Generelt defineres en funktion altid ved at man angiver en funktionshoved og en funktionskrop.
| funktionshoved | function minFunktion (parameter1, parameter2) |
| funktionskrop | { de kommandoer som funktionen udfører når den bliver kaldt. Evt om funktionen returner noget result } |
Funktioner defineres som reglen i et javascript i head elementet eller i en ekstern js fil som der linkes til fra headen. JavaScript fortolkeren registrer her funktionshovedet og springer funktionskroppen over.
Når fortolkeren længere nede i programmet kommer til et funktionskald f.eks. minFunktion("Hans ", 25); vil den sætte variablen parameter1="Hans" og parameter2=25, og derefter udfører kommandoerne i funktionskroppen.
I stedet for specifikke værdier som "Hans" og 25, kan værdierne også være gemt i variable sådan at funktionskaldet bliver minFunktion(navn, alder);
Fortolkeren vil her gemme værdien af navn og alder variablerne i parameter1 og parameter2 dvs. parameter1 = navn og parameter2 = alder.
- 3 Types of functions openWindow( ) , greet(name) , result = average(a, b, c )
// function definitions ////////////////////Bjarne 2009///////////////////
// open a specific URL in a specific window
function openWindow(){
window.open("http://en.wikipedia.org/wiki/Golden_ratio","my_new_window","toolbar=yes, location=yes, directories=no, status=no, menubar=yes, scrollbars=yes, resizable=no, copyhistory=yes, width= 600, height=400")
}
// takes one parameter
function greet(name) {
alert("Greetings to you "+ name );
}
// takes 3 Number parameters and returns the average of these
function average(a,b,c) {
result = (a + b + c) / 3;
return( result );
}
Objekter er en måde at lave en model af virkeligheden på.
| Instance of objece | Object | Parts / Navneord + properties/egenskaber | Actions/verb |
pluto, fido carA, bjarneCar |
Dog Car |
tail, width, height, x, y color, age, speed, |
bark, wag accelerate, turn_left, turn_rigth, break
|
Grundobjekterne i JavaScript har hverisær en række egenskaber/properties og metoderer så de kan simulere/modellere typiske program elementer.
| Objekttype | Number | String | Boolean | Array | Math | Date |
| Modellere | tal | tekst | logik (s/f) | data | Lommeregner | Kalender |
JS object reference: http://www.w3schools.com/jsref/jsref_obj_string.asp
| Properties | Methods |
| length | charAt( ) |
| indexOf( ) |
http://www.w3schools.com/jsref/jsref_obj_math.asp
Anvendes f.eks. i forbindelse med tilfældige tal.
tilfaeldigVaerdi = Math.random(); // intervallet mellem 0 og 1 f.eks. 0.11111 og 0.999
tilfaeldigVaerdi = (Math.random() * 6) + 1; // intervallet mellem 1 og 7 f.eks. 1.234 og 6.778
tilfaeldigVaerdi = Math.floor((Math.random() * 6) + 1); // floor metoden fjerne decimalerne dvs. at mulig tal er 1,2,3,4,5,6 (Terning)
http://www.w3schools.com/jsref/jsref_obj_date.asp
Anvendes f.eks. i forbindelse med at finde ugedagen på brugerens computer.
<script type="text/javascript">
var d=new Date();
var weekday=new Array(7);
weekday[0]="Sunday";
weekday[1]="Monday";
weekday[2]="Tuesday";
weekday[3]="Wednesday";
weekday[4]="Thursday";
weekday[5]="Friday";
weekday[6]="Saturday";
document.write("Today it is " + weekday[d.getDay()]);
</script>
Arrays er en af de mest anvendte datastrukturer i JavaScript. Et array er defineret som et ordnet sæt af værdier, der er associeret med et enkelt variabelnavn eller med en alternativ formulering som en indekseret samling af elementer. Dataelementerne/værdierne i et array kan være alle datatyper, også objekter.
Arrays kan med andre ord opfattes som en flerværdiet variabeltype, der overflødiggør gentagelse af variable af samme type og med næsten enslydende navne. Forstil dig for eksempel, at du skal implementere en "frugtkurv" i et JavaScript program. Uden brug af arrays ville du da være nødt til at oprette en ny variabel for hver ny frugt: var frugt1 = "æbler"; var frugt2 = "ananas"; var frugt3 = "kirsebær"; var frugt4 = "ferskner";
Med arrays kan du i stedet definere én enkelt variabel, der består af en samling frugter, hvor hver frugt indgår som et element i arrayet:
var frugtKurv = new Array("æbler", "ananas", "kirsebær", "ferskner");
Hvis du skal forestille dig et array, kan du sammenligne med en tabel, der blot består af to kolonner og et antal rækker. Hvor mange rækker bestemmer du selv. De to kolonner har overskrifterne Indeks og Værdi, og hver række indeholder et nummer og data. Numrene på de enkelte rækker starter ved 0 og kaldes index:
| Index | Værdi |
|---|---|
| 0 | "æbler" |
| 1 | "ananas" |
| 2 | "kirsebær" |
| 3 | "ferskner" |
Arrays i JavaScript kan oprettes på flere måder. Den første måde ser sådan ud:
var ugedage = new Array(7);
ugedage[0] = "mandag";
ugedage[1] = "tirsdag";
ugedage[2] = "onsdag";
ugedage[3] = "torsdag";
ugedage[4] = "torsdag";
ugedage[5] = "fredag";
ugedage[6] = "søndag";
Der erklæres en variabel, og dernæst angives, at variablen skal oprettes som et array. Det sker med det reserverede ord Array. Det reserverede ord new foran Array skal angives, fordi Array som datatype er et objekt. Tallet i parentesen efter Array angiver, at det nyoprettede array indeholder 7 elementer. Det er frivilligt om du vil angive, hvor mange elementer et array skal indeholde. Antallet markerer heller ingen maksimumsgrænse for hvor mange elementer arrayet kan indholdeholde. Tilføjer du ekstraelementer, udvider JavaScript det automatisk.
I de følgende linjer tilføjes elementer til arrayet. På hver linje er indexnummeret angivet i skarpe parenteser til højre for navnet på arrayet. Det er indeksnummeret, der identificerer de enkelte elementer. Ved hjælp af indeksnumrene er det muligt at referere til et bestemt element. Til højre for lighedstegnet den værdi angivet, elementet skal tildeles. Da ugenavnene er tekststrenge, er de sat i citationstegn.
Alternativt kan et array oprettes uden at angive indeksnumre:
var ugedage = new Array("mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag", "søndag");
eller endnu kortere
var ugedage = ["mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag", "søndag"];
I dette tilfælde tildeles det nye array værdier samtidig med at det oprettes. JavaScript indekserer i dette tilfælde selv de enkelte elementer fra 0 til 6.
Da index værdierne i et array starter ved 0, er antallet af rækker i et array altid én større end array'ets højeste index værdi.
For at få adgang til en oplysning i et array, skal man kende navnet på arrayet og nummeret på rækken.
Eksempel på at hente data fra et array:
document.write (ugedage[3]);
Udtrykket ugedage[3] refererer til det fjerde element med indeksnummer 3 i arrayet ugedage, og JavaScript-koden udskriver derfor "torsdag".
Som objekt har array egenskaben length. Denne egenskab indeholder oplysning om, hvor mange elementer et array indeholder. Fx:
var ugedage = new Array("mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag", "søndag")
antalUgedage = ugedage.length;
Variablen ugedage.length er i dette tilfælde identisk med 7, fordi arrayet ugedage indeholder 7 elementer i alt.
Via Array metoden push( ) kan man tilføje et ny element til et array.
frugtKurve.push("banan");
På W3schools' javascript reference kan man se flere eksempler på Array metoder.
| Method | Description | FF | IE |
|---|---|---|---|
| concat() | Joins two or more arrays and returns the result | 1 | 4 |
| join() | Puts all the elements of an array into a string. The elements are separated by a specified delimiter | 1 | 4 |
| pop() | Removes and returns the last element of an array | 1 | 5.5 |
| push() | Adds one or more elements to the end of an array and returns the new length | 1 | 5.5 |
| reverse() | Reverses the order of the elements in an array | 1 | 4 |
| shift() | Removes and returns the first element of an array | 1 | 5.5 |
| slice() | Returns selected elements from an existing array | 1 | 4 |
| sort() | Sorts the elements of an array | 1 | 4 |
| splice() | Removes and adds new elements to an array | 1 | 5.5 |
| toSource() | Represents the source code of an object | 1 | - |
| toString() | Converts an array to a string and returns the result | 1 | 4 |
| unshift() | Adds one or more elements to the beginning of an array and returns the new length | 1 | 6 |
| valueOf() | Returns the primitive value of an Array object | 1 | 4 |
Ref: http://www.w3schools.com/jsref/jsref_obj_array.asp
Opsamling:
| Variable name | An Arrays objects | Properties | Method |
| klasseListe | ['Bob', 'Hans', 'Kim' ] | length | push( ) sort( ) reverse( )
|
Selection/betingelser
Øvelse 1. Make a window prompt were the user can enter his/her age. If the age is under 15 then send the user to the www.lego.com. If age >= 15 then send the user to www.aabc.dk
Use the javascript command: window.location = "http://www.lego.com";
To send the user to a new URL
Øvelse 2. Realiser følgende flowdiagram via javascript hvor du/I bruger alert bokse til at realisere output bokse f.eks. alert("Start") og
prompt bokse til at stille spørgsmål til brugeren.

Array, Date, Math
Øvelse 3.
Skriv et JavaScript program, der laver et Array kaldet favorits, som indeholder 4 af dine favorit URL'er.
Udskriv det sidste element i favorits via en document.write( ); kommando.
Udskriv antallet af elementer i favorits vha. Array egenskaben/property Length.
Prøv at anvende nogle af Array metoderne på favorits (f.eks. push( ), pull(), reverse() )
Hvordan kunne man via Date objectet lave det sådan at en favoritwebside bliver hentet afhængig af ugedagen (d.getDay() )?
Hint: window.location = favorits[x];
Hvordan kunne man via Math objectet evt. lave et link som sender brugeren til en tilfælde af ens favorit URL'er?
Hint: Husk at links kan skrives i dokumentet via kommandoen. document.write("<a href='http://www.pol.dk'>Prøv lykken</a>");
Øvelse 4 Lave et javascript der via en for løkke åbner 10 nye browser vinduer.
Brug f.ex. window.open("http://www.w3schools.com")
Husk at slå popup blokkeren fra.
Dokument objektet er en hierarkisk model af det aktuelle HTML-dokument.

Figur 1.3: Hierarki af DOM objekter (kilde: Yanks & Adams: Simply JavaScript. SitePoint 2007)
Når man refererer til det enkelte objekt (element) gøres det nemmest ved at give objektet en unik id. f.eks. <h1 id="vigtig">Hello</h1> eller
<input type="text" name="kundenavn" id="kundenavn" value="Indtast dit navn " / >
document.getElementById("kundenavn")
man kan også referere til et tag via
document.getElementByTag("h1");
eller via dot syntaks.
window.document.body.h1;
Hvis man vil hente brugerinput via en HTML form, gøre dette ved at læse input elementets værdi (value) dvs.
var tekst = document.getElementById("kundenavn").value;
Eksempel 1
<form id="bestilling">
<input type="text" name="kundenavn" id="kundenavn" value="Indtast dit navn " / >
<input type="button" onclick="visInput();" value="click" />
</form>
<script type="text/javascript">
function visInput(){
var tekst = document.getElementById('kundenavn').value
alert("Yo "+ tekst);
}
</script>
Tekstfelt objektet med id-værdien (instansnavn) kundenavn har egenskaben value. Den bliver aflæst ved at angive egenskabens navn umiddelbart efter objektreferencen.
Vi kunne også med JavaScript have ændret værdien af indtastningsfeltets kundenavn og selektere (markere) indtastningsfeltet efter alert boksen er vist:
Eksempel 2
function nyTekst(){
document.getElementById('kundenavn').value = "En ny tekst fra javascript";
document.getElementById('kundenavn').select();
}
Øvelser 0. Test inputfelt for brugerinput.
Øvelse 1. Lav en html form som taget et tekst input og tester om teksten indeholder @.
Hints: Læs teksten ind i en variabel tekst og test om tekst.indexOf("@") == -1 (hvis dette er sandt indeholder tekst ikke et @).
Øvelse 4 String og løkke øvelse.
a. Lav et JavaScript der finder ud af hvormange t'er der er i teksten tekst= 'There are times when you want to know how many chararcters are in a string.'
hint: Lav et løkke som tæller fra i=0 til tekst.length og test om tekst.charAt(i)== "t".
Hvis det er tilfældet skal antalT = antalT + 1;
Øvelser 4UI = User Interface
Lav en html form med et textarea hvor brugeren kan indtaste eller paste en tekst, og en button som kalder en funktion der beregner antal t'er i textarea'et.
Hint's:
tekst = document.getElementsById("tekstFelt").value,
<textarea name="tekst" cols="100" rows="10" id="tekstFelt">There are times when you want to know how many chararcters are in a string.</textarea>
Øvelse 5. Lav en array kaldet ugedag som indeholder ugenavnene i en dansk uge .
1. Lav en løkke med en tællevariabel i, og udskriv ugedagene via document.write(i + ": "+ugedag[i] + "<br />");
2. Tilpas koden sådan at resultatet udskrives i en HTML tabel.
| Index | Ugedag |
| 0 | Mandag |
| 1 | Tirsdag |
| 2 | Onsdag |
| 3 | Torsdag |
| 4 | Fredag |
| 5 | Lørdag |
| 6 | Søndag |
Husk at tabeller kan lave via følgende HTML.
<table width="40%" border="1">
<tr>
<td>0</td>
<td>Mandag</td>
</tr>
<tr>
<td>1</td>
<td>Tirsdag</td>
</tr>
</table>
Øvelse 6. Bestil et gratis webhotel på freehostia.com og upload nogle af dagens øvelser hertil.
Kort vejledning: Upload løsninger til webhotel (Freehostia.com )