Avatar billede mickiii Nybegynder
27. juli 2005 - 11:32 Der er 16 kommentarer og
2 løsninger

Dynamisk tabel/form - dynamiske felt navne & sum

Hej,

Jeg har lavet denne dynamiske tabel, som indeholder formfelter.:

<script language="javascript">
var gRowId = 2;

function delRow(button)
{
var row = button.parentNode.parentNode;
var tbody = document.getElementById('table1').getElementsByTagName('tbody')[0];
tbody.removeChild(row);
}

function addRow()
{
var tbody = document.getElementById('table1').getElementsByTagName('tbody')[0];

var row = document.createElement('TR');//Bogføringslinie

var cell1 = document.createElement('TD');
var cell2 = document.createElement('TD');
var cell3 = document.createElement('TD');
var cell4 = document.createElement('TD');
var cell5 = document.createElement('TD');
var cell6 = document.createElement('TD');
var cell7 = document.createElement('TD');
var cell8 = document.createElement('TD');
var cell9 = document.createElement('TD');
var cell10 = document.createElement('TD');
var cell11 = document.createElement('TD');
var cell12 = document.createElement('TD');

var inp1 =  document.createElement('SELECT');//Bogføringstype
    inp1.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp1.setAttribute('className','standard_form_field');/*IE gets this*/
    inp1.setAttribute('name','type' + gRowId);
    inp1.setAttribute('value','bogføringstype');
   
    /*Bogføringstype options fyldes*/
    var type = new Array("Køb","Salg","Betaling");
    var L = type.length; 
    var i; 
    var o; 
    o = document.createElement("option"); 
    o.setAttribute("name","o"); 
    o.setAttribute("id","o"); 
    o.setAttribute("value","0"); 
    o.appendChild(document.createTextNode("-- Vælg --")); 
    inp1.appendChild(o); 
    for (i=0; i<L; i++) {     
        o = document.createElement("option");
        o.setAttribute("name","o"+i);     
        o.setAttribute("id","o"+i);     
        o.setAttribute("value",type[i]);     
        o.appendChild(document.createTextNode(type[i]));     
        inp1.appendChild(o);     
    }   

   
var inp2 =  document.createElement('INPUT');//Bilagsnummer
    inp2.setAttribute('type','text');
    inp2.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp2.setAttribute('className','standard_form_field');/*IE gets this*/
    inp2.setAttribute('width','60');
    inp2.setAttribute('name','doc_nr' + gRowId);
   
var inp3 =  document.createElement('INPUT');//Eksternt bilagsnummer
    inp3.setAttribute('type','text');
    inp3.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp3.setAttribute('className','standard_form_field');/*IE gets this*/
    inp3.setAttribute('width','60');
    inp3.setAttribute('name','ext_doc_nr' + gRowId);
   
var inp4 =  document.createElement('SELECT');//Kontotype
    inp4.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp4.setAttribute('className','standard_form_field');/*IE gets this*/
    inp4.setAttribute('name','account_type' + gRowId);
    inp4.setAttribute('value','kontotype');
   
    /*Kontotype options fyldes*/
    var account_type = new Array("Finans","Debitor","Kreditor","Anlæg","Vare");
    var L = account_type.length; 
    var i; 
    var o; 
    o = document.createElement("option"); 
    o.setAttribute("name","o"); 
    o.setAttribute("id","o"); 
    o.setAttribute("value","0"); 
    o.appendChild(document.createTextNode("-- Vælg --")); 
    inp4.appendChild(o); 
    for (i=0; i<L; i++) {     
        o = document.createElement("option");
        o.setAttribute("name","o"+i);     
        o.setAttribute("id","o"+i);     
        o.setAttribute("value",account_type[i]);     
        o.appendChild(document.createTextNode(account_type[i]));     
        inp4.appendChild(o);     
    }   

var inp5 =  document.createElement('INPUT');//Konto nr. 
    inp5.setAttribute('type','text');
    inp5.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp5.setAttribute('className','standard_form_field');/*IE gets this*/
    inp5.setAttribute('width','60');
    inp5.setAttribute('name','account_no' + gRowId);

var inp6 =  document.createElement('INPUT');//Beskrivelse
    inp6.setAttribute('type','text');
    inp6.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp6.setAttribute('className','standard_form_field');/*IE gets this*/
    inp6.setAttribute('width','120');
    inp6.setAttribute('name','description' + gRowId);
   
var inp7 =  document.createElement('INPUT');//Beløb
    inp7.setAttribute('type','text');
    inp7.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp7.setAttribute('className','standard_form_field');/*IE gets this*/
    inp7.setAttribute('width','60');
    inp7.setAttribute('name','amount' + gRowId);
   
var inp8 =  document.createElement('SELECT');//Moms
    inp8.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp8.setAttribute('className','standard_form_field');/*IE gets this*/
    inp8.setAttribute('name','vat' + gRowId);
    inp8.setAttribute('value','moms');

    /*Momstype options fyldes*/
    var vat_type = new Array("Fritaget");
    var L = vat_type.length; 
    var i; 
    var o; 
    o = document.createElement("option"); 
    o.setAttribute("name","o"); 
    o.setAttribute("id","o"); 
    o.setAttribute("value","0"); 
    o.appendChild(document.createTextNode("Moms 25%")); 
    inp8.appendChild(o); 
    for (i=0; i<L; i++) {     
        o = document.createElement("option");
        o.setAttribute("name","o"+i);     
        o.setAttribute("id","o"+i);     
        o.setAttribute("value",vat_type[i]);     
        o.appendChild(document.createTextNode(vat_type[i]));     
        inp8.appendChild(o);     
    }

var inp9 =  document.createElement('SELECT');//Valuta
    inp9.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp9.setAttribute('className','standard_form_field');/*IE gets this*/   
    inp9.setAttribute('name','currency' + gRowId);
    inp9.setAttribute('value','valuta');

    /*Valutatype options fyldes*/
    var currency_type = new Array("AUD","BGN","CAD","CYP","CNY","EEK","EUR","PHP","HKD","HRK","IDR","ISK","JPY");
    var L = currency_type.length; 
    var i; 
    var o; 
    o = document.createElement("option"); 
    o.setAttribute("name","o"); 
    o.setAttribute("id","o"); 
    o.setAttribute("value","0"); 
    o.appendChild(document.createTextNode("DKK")); 
    inp9.appendChild(o); 
    for (i=0; i<L; i++) {     
        o = document.createElement("option");
        o.setAttribute("name","o"+i);     
        o.setAttribute("id","o"+i);     
        o.setAttribute("value",currency_type[i]);     
        o.appendChild(document.createTextNode(currency_type[i]));     
        inp9.appendChild(o);     
    }

var inp10 =  document.createElement('INPUT');//Modkonto 
    inp10.setAttribute('type','text');
    inp10.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp10.setAttribute('className','standard_form_field');/*IE gets this*/
    inp10.setAttribute('width','60');
    inp10.setAttribute('name','op_account' + gRowId);
   
var inp11 = document.createElement('INPUT');//Knap til at slette linie
    inp11.setAttribute('type','button');
    inp11.setAttribute('value','Delete');
    inp11.onclick=function(){delRow(this);}

cell1.innerHTML = gRowId;
cell2.appendChild(inp1);
cell3.appendChild(inp2);
cell4.appendChild(inp3);
cell5.appendChild(inp4);
cell6.appendChild(inp5);
cell7.appendChild(inp6);
cell8.appendChild(inp7);
cell9.appendChild(inp8);
cell10.appendChild(inp9);
cell11.appendChild(inp10);
cell12.appendChild(inp11); 

row.appendChild(cell1);
row.appendChild(cell2);
row.appendChild(cell3);
row.appendChild(cell4);
row.appendChild(cell5);
row.appendChild(cell6);
row.appendChild(cell7);
row.appendChild(cell8);
row.appendChild(cell9);
row.appendChild(cell10);
row.appendChild(cell11);
row.appendChild(cell12);

tbody.appendChild(row);

gRowId++;
}
</script>

Det fungere som sådan ganske fint, men jeg mangler hjælp til 2 ting:

Hvis jeg indsætter en linie, så navngiver den, dens formfelter som f.eks. input1, input2 osv. men hvis jeg sletter en linie skulle det gerne være sådan at den ændre øvrige, således at det til enhver tid er øverste række som er nummer 1, og deraf input1, dernæst altid linie 2, som er nummer 2 og formfelterne skal være input2 og så fremdeles. Hvordan gøres dette?

Derefter så skal der implementeres en 'running' sum som skal tælle f.eks. amount1, amount2 osv. sammen. Hvordan gøres dette smartest, også så det fungere i FF?

Håber nogen er i stand til at hjælpe, og hvis der skal lidt mere afklaring til ovenstående, så spørg endelig.

På forhånd tak.
Avatar billede softspot Forsker
27. juli 2005 - 12:00 #1
Hvis du undlader at navngive dine kontroller som input1, input2 osv., men i stedet navngiver dem alle med samme navn (og undgå helst de navne som falder sammen med navne på standard HTML-elementer, som f.eks. input), kan du tilgå dem som et array af kontroller således:

document.forms[0].elements["mininput"][0].value // som er den første kontrol i listen.

Denne konstruktion er lidt lettere at iterere end nummererede kontroller. Det gælder også hvis du f.eks. skal lægge tal sammen i en hel række felter. Det kunne gøres således:

var amountControls = document.forms[0].elements["amount"];
var sum = 0;
for(var i = 0; i < amountControls.length; i++)
{
  if(amountControls[i] && amountControls[i].value != "")
  {
    sum += parseFloat(amountControls[i].value);
  }
}
alert("resultat: " + sum);
Avatar billede mickiii Nybegynder
27. juli 2005 - 12:43 #2
Softspot - Okay det lyder fornuftigt. Men skaber det ikke problemer, når selve formen skal håndteres serverside? I dette tilfælde bruger jeg PHP? Jeg ved at i ASP er det superlet at arbejde med input ved samme navn, men ikke i PHP.
Avatar billede roenving Novice
27. juli 2005 - 12:45 #3
-- men der skal så også være styr på det serverside, som vel skal modtage de endelige indtasninger, og der er de unummererede ting ikke så gode, men det kan man komme om ved at sætte [] på navnene, og så i den løkke softspot viser, lige tilføje det:

    inp7.setAttribute('name','amount[]');

-- og så:

var amountControls = document.forms[0].elements["amount[]"];

-- iøvrigt er du lige en tur over åen, for at hente vandet i den første lille funktion:

function delRow(button)
{
var row = button.parentNode.parentNode;
var tbody = row.parentNode;
tbody.removeChild(row);
}

-- iøvrigt kan man sagtens tillader sig den lettere frække udgave:

var row = button.parentNode.parentNode;
row.parentNode.removeChild(row);
Avatar billede softspot Forsker
27. juli 2005 - 12:54 #4
Ja, jeg har kun erfaring med ASP og der er det som du siger rimelig overkommeligt at gennemløbe felterne (jeg kan ikke helt genkende det du siger roenving, men det kan hænge sammen med at jeg ikke har arbejdet med det for nylig :)).
Avatar billede mickiii Nybegynder
27. juli 2005 - 13:01 #5
Okay, jeg tror jeg har den info jeg skal have for at komme videre. Tak begge. I kan dele point, hvis i smider svar.
Avatar billede roenving Novice
27. juli 2005 - 13:05 #6
Velbekomme '-)

-- og det ligner det meste til softspot !-)
Avatar billede softspot Forsker
27. juli 2005 - 13:18 #7
Velbekomme

Jeg har det fint med at dele lige over med roenving - om ikke andet så for at komme i audiens ;)
Avatar billede mickiii Nybegynder
27. juli 2005 - 13:20 #8
Således :o)
Avatar billede softspot Forsker
27. juli 2005 - 13:24 #9
Tak for point
Avatar billede roenving Novice
27. juli 2005 - 13:27 #10
-- og jeg takker også for point ;~}
Avatar billede mickiii Nybegynder
27. juli 2005 - 15:43 #11
Hov, hvis en af jer har tid igen, hvordan kan det være at denne del i sumfunktionen ikke virker i IE?:

..for(var i = 0; i < amountControls.length; i++)

Det fungere ganske fint i FF, men i IE, får jeg 'length is null or not an object'

Håber i lige har tid, trods der ikke er point på spil.
Avatar billede roenving Novice
27. juli 2005 - 15:47 #12
Det vorker da i en hurtig test hos mig, kan du lægge et link ?-)
Avatar billede mickiii Nybegynder
27. juli 2005 - 16:02 #13
Nej desværre, jeg køre det lokalt, men jeg har pastet koden her:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Kladde</title>
<script language="javascript">
var gRowId = 2;

function delRow(button)
{
var row = button.parentNode.parentNode;
var tbody = document.getElementById('table1').getElementsByTagName('tbody')[0];
tbody.removeChild(row);
}

function addRow()
{
var tbody = document.getElementById('table1').getElementsByTagName('tbody')[0];

var row = document.createElement('TR');//Bogføringslinie

var cell1 = document.createElement('TD');
var cell2 = document.createElement('TD');
var cell3 = document.createElement('TD');
var cell4 = document.createElement('TD');
var cell5 = document.createElement('TD');
var cell6 = document.createElement('TD');
var cell7 = document.createElement('TD');
var cell8 = document.createElement('TD');
var cell9 = document.createElement('TD');
var cell10 = document.createElement('TD');
var cell11 = document.createElement('TD');
var cell12 = document.createElement('TD');

var inp1 =  document.createElement('SELECT');//Bogføringstype
    inp1.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp1.setAttribute('className','standard_form_field');/*IE gets this*/
    inp1.setAttribute('name','type[]');
    inp1.setAttribute('value','bogføringstype');
   
    /*Bogføringstype options fyldes*/
    var type = new Array("Køb","Salg","Betaling");
    var L = type.length; 
    var i; 
    var o; 
    o = document.createElement("option"); 
    o.setAttribute("name","o"); 
    o.setAttribute("id","o"); 
    o.setAttribute("value","0"); 
    o.appendChild(document.createTextNode("-- Vælg --")); 
    inp1.appendChild(o); 
    for (i=0; i<L; i++) {     
        o = document.createElement("option");
        o.setAttribute("name","o"+i);     
        o.setAttribute("id","o"+i);     
        o.setAttribute("value",type[i]);     
        o.appendChild(document.createTextNode(type[i]));     
        inp1.appendChild(o);     
    }   

   
var inp2 =  document.createElement('INPUT');//Bilagsnummer
    inp2.setAttribute('type','text');
    inp2.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp2.setAttribute('className','standard_form_field');/*IE gets this*/
    inp2.setAttribute('width','60');
    inp2.setAttribute('name','doc_nr[]');
   
var inp3 =  document.createElement('INPUT');//Eksternt bilagsnummer
    inp3.setAttribute('type','text');
    inp3.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp3.setAttribute('className','standard_form_field');/*IE gets this*/
    inp3.setAttribute('width','60');
    inp3.setAttribute('name','ext_doc_nr[]');
   
var inp4 =  document.createElement('SELECT');//Kontotype
    inp4.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp4.setAttribute('className','standard_form_field');/*IE gets this*/
    inp4.setAttribute('name','account_type[]');
   
    /*Kontotype options fyldes*/
    var account_type = new Array("Finans","Debitor","Kreditor","Anlæg","Vare");
    var L = account_type.length; 
    var i; 
    var o; 
    o = document.createElement("option"); 
    o.setAttribute("name","o"); 
    o.setAttribute("id","o"); 
    o.setAttribute("value","0"); 
    o.appendChild(document.createTextNode("-- Vælg --")); 
    inp4.appendChild(o); 
    for (i=0; i<L; i++) {     
        o = document.createElement("option");
        o.setAttribute("name","o"+i);     
        o.setAttribute("id","o"+i);     
        o.setAttribute("value",account_type[i]);     
        o.appendChild(document.createTextNode(account_type[i]));     
        inp4.appendChild(o);     
    }   

var inp5 =  document.createElement('INPUT');//Konto nr. 
    inp5.setAttribute('type','text');
    inp5.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp5.setAttribute('className','standard_form_field');/*IE gets this*/
    inp5.setAttribute('width','60');
    inp5.setAttribute('name','account_no[]');

var inp6 =  document.createElement('INPUT');//Beskrivelse
    inp6.setAttribute('type','text');
    inp6.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp6.setAttribute('className','standard_form_field');/*IE gets this*/
    inp6.setAttribute('width','120');
    inp6.setAttribute('name','description[]');
   
var inp7 =  document.createElement('INPUT');//Beløb
    inp7.setAttribute('type','text');
    inp7.setAttribute('id','amount' + gRowId);// Unique ID to ensure the total calculation
    inp7.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp7.setAttribute('className','standard_form_field');/*IE gets this*/
    inp7.setAttribute('width','60');
    inp7.setAttribute('name','amount[]');
    inp7.onchange=function(){doSum();} ;
   
var inp8 =  document.createElement('SELECT');//Moms
    inp8.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp8.setAttribute('className','standard_form_field');/*IE gets this*/
    inp8.setAttribute('name','vat[]');

    /*Momstype options fyldes*/
    var vat_type = new Array("Fritaget");
    var L = vat_type.length; 
    var i; 
    var o; 
    o = document.createElement("option"); 
    o.setAttribute("name","o"); 
    o.setAttribute("id","o"); 
    o.setAttribute("value","0"); 
    o.appendChild(document.createTextNode("Moms 25%")); 
    inp8.appendChild(o); 
    for (i=0; i<L; i++) {     
        o = document.createElement("option");
        o.setAttribute("name","o"+i);     
        o.setAttribute("id","o"+i);     
        o.setAttribute("value",vat_type[i]);     
        o.appendChild(document.createTextNode(vat_type[i]));     
        inp8.appendChild(o);     
    }

var inp9 =  document.createElement('SELECT');//Valuta
    inp9.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp9.setAttribute('className','standard_form_field');/*IE gets this*/   
    inp9.setAttribute('name','currency[]');

    /*Valutatype options fyldes*/
    var currency_type = new Array("AUD","BGN","CAD","CYP","CNY","EEK","EUR","PHP","HKD","HRK","IDR","ISK","JPY");
    var L = currency_type.length; 
    var i; 
    var o; 
    o = document.createElement("option"); 
    o.setAttribute("name","o"); 
    o.setAttribute("id","o"); 
    o.setAttribute("value","0"); 
    o.appendChild(document.createTextNode("DKK")); 
    inp9.appendChild(o); 
    for (i=0; i<L; i++) {     
        o = document.createElement("option");
        o.setAttribute("name","o"+i);     
        o.setAttribute("id","o"+i);     
        o.setAttribute("value",currency_type[i]);     
        o.appendChild(document.createTextNode(currency_type[i]));     
        inp9.appendChild(o);     
    }

var inp10 =  document.createElement('INPUT');//Modkonto 
    inp10.setAttribute('type','text');
    inp10.setAttribute('class','standard_form_field');/*Mozilla gets this*/
    inp10.setAttribute('className','standard_form_field');/*IE gets this*/
    inp10.setAttribute('width','60');
    inp10.setAttribute('name','op_account[]');
   
var inp11 = document.createElement('INPUT');//Knap til at slette linie
    inp11.setAttribute('type','button');
    inp11.setAttribute('value','Delete');
    inp11.onclick=function(){delRow(this);}

cell1.innerHTML = gRowId;
cell2.appendChild(inp1);
cell3.appendChild(inp2);
cell4.appendChild(inp3);
cell5.appendChild(inp4);
cell6.appendChild(inp5);
cell7.appendChild(inp6);
cell8.appendChild(inp7);
cell9.appendChild(inp8);
cell10.appendChild(inp9);
cell11.appendChild(inp10);
cell12.appendChild(inp11); 

row.appendChild(cell1);
row.appendChild(cell2);
row.appendChild(cell3);
row.appendChild(cell4);
row.appendChild(cell5);
row.appendChild(cell6);
row.appendChild(cell7);
row.appendChild(cell8);
row.appendChild(cell9);
row.appendChild(cell10);
row.appendChild(cell11);
row.appendChild(cell12);

tbody.appendChild(row);

gRowId++;
}

function doSum() {
var amountControls = document.forms[0].elements['amount[]'];
var sum = 0;
for(var i = 0; i < amountControls.length; i++) {
  if(amountControls[i] && amountControls[i].value != "") {
    sum += parseFloat(amountControls[i].value);
  }
}
alert("resultat: " + sum);
}
</script>
<style>
.standard_form {margin:0px 0px 0px 0px;padding:0px 0px 0px 0px;}
    .standard_form_field {font:10px verdana;margin:5px 0px 0px 0px;padding:0px 0px 0px 0px;}
    .standard_form_radio {width:auto;text-align:left;float:left;margin:3px 6px 0px 0px;padding:0px;font:10px/20px verdana;}
    .standard_form ul {margin:0px;list-style-type:none;font: bold 10px/26px Verdana;text-align:left;color:#333333;}
        .standard_form ul li {height:26px;}
        .standard_form ul.standard_form_desc {float:left;width:50px;text-indent:10px;margin:0px 0px 0px 0px;padding:0px 0px 0px 0px;}
        .standard_form ul.standard_form_field {float:left;margin:0px 0px 0px 0px;padding:0px 0px 0px 10px;width:250px;}
</style>
</head>
<body>
<form name="myform" id="myform" method="post" action="">
<table id="table1" style=" font:10px verdana;">
    <tbody>
        <tr>
            <th>ID</th><th>Type</th><th>Bilagsnr.</th><th>Eksternt<br>bilagsnr.</th><th>Kontotype</th><th>Konto nr.</th><th>Beskrivelse</th><th>Beløb</th><th>Moms</th><th>Valuta</th><th>Modkonto</th><th></th>
        </tr>
    </tbody>
</table>
<input type="button" value="Insert Row" onClick="addRow();">
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>
Avatar billede softspot Forsker
27. juli 2005 - 16:04 #14
Er dokumentet opbygget idet du kalder doSum?
Avatar billede roenving Novice
27. juli 2005 - 16:07 #15
Det er en IE-underlighed, hvor den ikke sætter en name-attribut ved DOM-oprettelse af elementer, så tilføj denne til dine amount-elementer:

    inp7.setAttribute('id','amount[]');
Avatar billede mickiii Nybegynder
27. juli 2005 - 16:09 #16
Arhh! har stirret mig blind på at lede efter fejl. Tak.
Avatar billede softspot Forsker
27. juli 2005 - 16:11 #17
Er det ikke fordi den gamle metode med optælling af postfix stadig benyttes? Jeg kan finde flg. kode til oprettelse af id-attribut:

inp7.setAttribute('id','amount' + gRowId);// Unique ID to ensure the total calculation

men summa sumarum skal den jo stadig ende med at se ud som den roenving foreslår...
Avatar billede roenving Novice
27. juli 2005 - 16:13 #18
-- men test lige, om du kan få fat i name server-side, hvis det er IE, som har haft fat i formularen !-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester