Avatar billede donslund Nybegynder
12. september 2003 - 17:20 Der er 13 kommentarer og
1 løsning

Validering af datofelter.

Jeg er ikke nogen helt til javascripting, men vil gerne lære lidt.

Jeg har en side hvor der skal vælges en dato ud fra 3 dropdown-bokse. 1. boks indeholder fra 1-31, 2. bok fra 1-12 og 3. boks årstal 30 år frem.

Hvis man vælger måned 2, kan man naturligvis kun vælge dag fra 1-28 (lige nu springer vi over skudår.)

Men hvordan gør jeg det?

if (document.formname.maaned ==2) {
if (document.formname.dag > 27) {
echo "Denne dato er ikke gyldig!)"
}
}

Er det noget der ligner?
Avatar billede bamzen Nybegynder
12. september 2003 - 17:49 #1
følgende kunne sikkert bruges, selvom det nok kunne gøres meget smartere

jeg vil prøve at lære dig hvad der skal til, så sig endelig til hvis du har spørgsmål

først skal vi til vores form, dette gør vi for at spare kode senere hen.Det gør vi ved at skrive:

df = document.forms[0]

Hvis det er den første formular på siden... 1 hvis det er formular 2 etc etc
Når javascript selv tæller elementer starter den med at tælle fra 0

Det næste er at vi skal have lavet en funktion vi kan kalde for at validere datoen....

function valiDate(){
d = parseInt(df.dag.options[df.dag.selectedIndex].text)
/*
text hvis det er udenfor option taggen, value hvis det er i value attributten
Vi bruger parseInt til at lave værdien fra selectboxen om til et tal (hel tal, men det er ligegyldigt)
*/
m = parseInt(df.maaned.options[df.maaned.selectedIndex].text)



maxMonths = (m==1|m==3|m==5|m==7|m==8|m==10|m==12)?31:(m==2)?27:30
/*Den ovenstaaende linie checker for om det er en af de første 31 dages maaneder, i saa fald 31, ellers checkes om maaneden er nummer 2, saa er det 27 dage (der tages ikke hoejde for skudaar)
*/
switch (maxMonths){
case 31:
return true  //her behoever vi ikke tjekke mere
break;

case 30:
if(d>30){
alert('denne maaned har kun 30 dage')
return false
}else{
return true
}
  break;

case 27:
if(d>27){
alert("februar har kun 27 dage")
return false
}else{
return true
}
break;
}


}

så kan du i din <form> tag skrive <form onsubmit="return valiDate()">

Håber du lærte lidt af det ;-)
Avatar billede donslund Nybegynder
12. september 2003 - 18:11 #2
Hvis det nu er en formular, der skal videre til opret.php, hvordan fletter jeg så det ind? Lige nu står det bare under action i <form>-taggen, men så vliderer den jo ikke.
Avatar billede roenving Novice
12. september 2003 - 21:19 #3
En skønhedsfejl:

maxMonths = (m==1|m==3|m==5|m==7|m==8|m==10|m==12)?31:(m==2)?27:30

skal være:

maxMonths = (m==1||m==3||m==5||m==7||m==8||m==10||m==12)?31:(m==2)?28:30

Da enkelt-| er en bit-operator og februar har 28 dage udenfor skudår !-)
Avatar billede donslund Nybegynder
12. september 2003 - 22:09 #4
Der er stadigvæk noget galt, for jeg kan sagtens oprette en dato der hedder 31-02-2003 og det burde jo ikke kunne lade sig gøre.
Avatar billede bamzen Nybegynder
12. september 2003 - 22:29 #5
du burde ikke kunne submitte

og din form tag skal hedde

<form action="opret.php" onsubmit="return valiDate()">
Avatar billede bamzen Nybegynder
12. september 2003 - 22:30 #6
roenving, tak fordi du retter mine skønhedsfejl, var lidt under tidspres... så skrev bare løs ud fra det blå ;-)
Avatar billede roenving Novice
12. september 2003 - 22:32 #7
Har selv denne liggende, som bruger et Date-objekt til validering, for så slipper jeg selv for at tage stilling til skudår, lange og korte måneder m.m.m.

<script language='javascript' type='text/javascript'>
function checkDato( dmy ) {
        var dag = parseInt(dmy[0],10);
        var maaned = parseInt(dmy[1],10)-1;
        var dato = new Date(parseInt(dmy[2]), maaned, dag );
        alert(dag+" "+maaned+" "+dato.getDate()+" "+dato.getMonth());
        if (dato.getDate() == dag && dato.getMonth() == maaned) {
            return true;
        }
    return false;
};

function valider (formObjekt) {
    var dmy = [formObjekt.day.options[formObjekt.day.selectedIndex].value, formObjekt.month.options[formObjekt.month.selectedIndex].value, formObjekt.year.options[formObjekt.year.selectedIndex].value];
    if (!checkDato(dmy)) {
        alert("den indtastede dato duer ikke.\nBenyt formatet DD-MM-YYYY");
        return false;
    }
    return true;
};
</script>

<form method=post action="form.htm" onsubmit="return valider(this);">
<select name="day">
<option value="23">23</option>
</select>
<select name="month">
<option value="06">06</option>
</select>
<select name="year">
<option value="2003">2003</option>
</select>
<input type="submit">
</form>
Avatar billede donslund Nybegynder
14. september 2003 - 15:55 #8
roenving. Det ser ud til at virke, men jeg får to alert-bokse op. Den ene står der bare NaN NaN NaN NaN
Avatar billede roenving Novice
14. september 2003 - 16:00 #9
Det må være fra denne linje, og det forstår jeg ikke, for så burde det ikke virke !-)

        alert(dag+" "+maaned+" "+dato.getDate()+" "+dato.getMonth());

-- den skal forøvrigt slettes, da den er brugt til debugging ...
Avatar billede donslund Nybegynder
14. september 2003 - 16:03 #10
jeg får i øvrigt også fejl hvis jeg vælger en dato der er god nok. Er det denne linies skyld?
Avatar billede roenving Novice
14. september 2003 - 16:06 #11
-- nej det er ikke linjens skyld, men prøv lige at vise een af dine selects !-)

-- og lav også denne linje om:

        var dato = new Date(parseInt(dmy[2],10), maaned, dag );
Avatar billede donslund Nybegynder
14. september 2003 - 16:12 #12
Så er den hjemme, det viste sig at mine options slet ingen values havde. Det hjalp, da jeg fik dem på. Point til roenving hvis du smider et svar.
Avatar billede roenving Novice
14. september 2003 - 16:13 #13
Velbekomme '-)
Avatar billede roenving Novice
14. september 2003 - 16:28 #14
-- 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

IT-JOB

Banedanmark

ERTMS Test Manager

Netcompany A/S

IT Consultant

Riskpoint A/S (Riskpoint Solutions Limited)

IT Business Analyst