Avatar billede compac Seniormester
18. juni 2004 - 13:20 Der er 11 kommentarer og
1 løsning

Validering af formular

<html>
<head>
    <title>Nyt dokument</title>
<meta name="generator" content="WebCoder">
</head>
<script>
function check(form){
  if(form.dato.value==""){
  alert("Du skal skrive en dato");
  form.dato.focus();
  return (false);}

  if(form.tekst.value==""){
  alert("Du har glemt at uddfylde et felt");
  form.tekst.focus();
  return (false);
  }
  return (true);
}
</script>
<body>
<form name="form" onsubmit="return check(this);">
<b>Dato1:<input name="dato" size="8"></b><b>Tekst1:</b><input name="tekst" size="75" maxlength="300">
<p>
<b>Dato2:<input name="dato" size="8"></b><b>Tekst2:</b><input name="tekst" size="75" maxlength="300">
<p>
<b>Dato3:<input name="dato" size="8"></b><b>Tekst3:</b><input name="tekst" size="75" maxlength="300">
<p>
<b>Dato4:<input name="dato" size="8"></b><b>Tekst4:</b><input name="tekst" size="75" maxlength="300">

<input type="submit" name="Send" value="send">
</form>
</body>
</html>

-jeg har en formular med ovenstående udseende. Hvordan laver jeg valideringen så den tester på felterne parvis, altså er dato og tekst udfyldt i hver linie? -og at det er tilladt at en linie kan være blank.
Avatar billede skovenborg Nybegynder
18. juni 2004 - 13:39 #1
prøv:
function check(frm) {
        for (i=0;i<frm.length;i+=2) {
                if (frm.elements[i].value.match(/\d/) && !frm.elements[i+1].value.match(/\S/)) {
                        alert("Du skal skrive en tekst til din dato");
                        frm.elements[i+1].focus();
                        return false;
                }
                if (!frm.elements[i].value.match(/\d/) && frm.elements[i+1].value.match(/\S/)) {
                        alert("Du skal skrive en dato til din tekst");
                        frm.elements[i].focus();
                        return false;
                }
        }
        return true;
}
Avatar billede compac Seniormester
18. juni 2004 - 13:56 #2
Skal jeg ikke sætte et index [i] i selve formular-koden? Hvordan bærer jeg mig ad med det?
Avatar billede skovenborg Nybegynder
18. juni 2004 - 14:02 #3
den skulle gerne virke ligesom før, altså med:
<form name="form" onsubmit="return check(this);">

Den regner dog med at alle felterne er stillet parvist op som vist ovenfor
Avatar billede compac Seniormester
18. juni 2004 - 15:32 #4
Ja, og den tager oven i købet hensyn til om det er tal eller bogstaver.

Send et svar
Avatar billede skovenborg Nybegynder
18. juni 2004 - 15:36 #5
sendt !-)
Avatar billede compac Seniormester
18. juni 2004 - 21:59 #6
Jeg troede jeg så kunne finde ud af at fortsætte med resten af formularen, men ak!
Hvis jeg tilføjer 2 checkboxe efter hver tekstlinie, hvilke korrektioner skal jeg så foretage i scriptkoden? (der skal ikke være nogen syntaxkontrol på chechboxene).

<b>Dato1:<input name="dato" size="8"></b><b>Tekst1:</b><input name="tekst" size="75" maxlength="300"><input type="checkbox" name="aarlig0_1"><input type="checkbox" name="aarlig0">
<b>Dato2:<input name="dato" size="8"></b><b>Tekst2:</b><input name="tekst" size="75" maxlength="300"><input type="checkbox" name="aarlig1"><input type="checkbox" name="aarlig1_1">
<b>Dato3:<input name="dato" size="8"></b><b>Tekst3:</b><input name="tekst" size="75" maxlength="300"><input type="checkbox" name="aarlig2"><input type="checkbox" name="aarlig2_1">
<b>Dato4:<input name="dato" size="8"></b><b>Tekst4:</b><input name="tekst" size="75" maxlength="300"><input type="checkbox" name="aarlig3"><input type="checkbox" name="aarlig3_1">
Avatar billede skovenborg Nybegynder
19. juni 2004 - 00:36 #7
for (i=0;i<frm.length;i+=4)
burde kunne gøre det
Avatar billede compac Seniormester
19. juni 2004 - 13:12 #8
Det virker ikke. Måske kan det hjælpe hvis du forklarer mig hvad formlen "laver".
Er indexet [i] antallet af felter på formlen? -eller?
Avatar billede skovenborg Nybegynder
19. juni 2004 - 13:49 #9
nej, det rigtigt det spurgte du også om før - glemte at forklare det.

i er her en del af det loop, som hedder:
for (i=0;i<frm.length;i+=2) {
Hvilket vil sige, at man først sætter i til 0 og så længe i er lavere end antallet af elementer i formen så skal der lægges to til i (eller fire som i sidste tilfælde).
i bruges her som et slags index i din form - men ikke noget du skal ændre i. Når i er 0 tager den det første element (dato1) og checker den, samt det næste (i+1 - altså her tekst1). Hvis én af dem er udfyldt og den anden ikke er, så giver den så en fejl - hvis ikke går den videre i loopet og lægger to til i (som sagt tidligere). Den gennemløber altså alle felterne i din form, indtil der kommer en fejl eller i er ligeså stor eller større end antallet af formelementer.
---Håber det gav lidt forklaring på scriptet.

At det ikke virker er dog lidt mærkeligt, men så må vi også sætte en lille ekstra ting på, så den også tester om elementerne overhovedet har navnet dato og tekst:
<script type="text/javascript">
function check(frm) {
        for (i=0;i<frm.length;i+=2) {
            if (frm.elements[i].name == "dato" && frm.elements[i+1].name == "tekst") {
                if (frm.elements[i].value.match(/\d/) && !frm.elements[i+1].value.match(/\S/)) {
                        alert("Du skal skrive en tekst til din dato");
                        frm.elements[i+1].focus();
                        return false;
                }
                if (!frm.elements[i].value.match(/\d/) && frm.elements[i+1].value.match(/\S/)) {
                        alert("Du skal skrive en dato til din tekst");
                        frm.elements[i].focus();
                        return false;
                }
            }
        }
        return true;
}
</script>
</head>
<body>
<form onsubmit="return check(this);">
<b>Dato1:<input name="dato" size="8"></b><b>Tekst1:</b><input name="tekst" size="75" maxlength="300"><input type="checkbox" name="aarlig0_1"><input type="checkbox" name="aarlig0"><br />
<b>Dato2:<input name="dato" size="8"></b><b>Tekst2:</b><input name="tekst" size="75" maxlength="300"><input type="checkbox" name="aarlig1"><input type="checkbox" name="aarlig1_1"><br />
<b>Dato3:<input name="dato" size="8"></b><b>Tekst3:</b><input name="tekst" size="75" maxlength="300"><input type="checkbox" name="aarlig2"><input type="checkbox" name="aarlig2_1"><br />
<b>Dato4:<input name="dato" size="8"></b><b>Tekst4:</b><input name="tekst" size="75" maxlength="300"><input type="checkbox" name="aarlig3"><input type="checkbox" name="aarlig3_1"><br />
<input type="submit" />
</form>
Avatar billede skovenborg Nybegynder
19. juni 2004 - 13:52 #10
men hvis din form ser akkurat sådan ud, som den står her, så kan du burde du også kunne skrive:
for (i=0;i<frm.length;i+=4) {

Hvis du dog har nogle andre elementer i starten, kan det også være en fordel at skrive:
for (i=0;i<frm.length;i++) { (så den kun lægger én til per gang)
eller starte med i med en højere værdi:
for (i=1;i<frm.length;i+=2) // Starter med at teste andet form-element (fx hvis det er her dato og tekst- elementerne starter. Husk at elementernes index starter med 0 for det første element.
Avatar billede compac Seniormester
19. juni 2004 - 16:20 #11
Ja, jeg havde endnu flere elementer der forvirrede testen. Tak for din forklaring - den afklarede meget for mig.
Avatar billede skovenborg Nybegynder
19. juni 2004 - 17:44 #12
og tak for points :-)
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