Avatar billede kimlarsen1978 Nybegynder
23. juni 2003 - 19:11 Der er 24 kommentarer og
1 løsning

Validering af Datoer

Hej
På min side vælger man datoen i 3 "rullemenuer"
Dag i en med 31 valgmuligheder
Måned i en med 12 valgmuligheder
År i en med valgmulighed til år 2010

Hvordan laver jeg et JavaScrip der kan tjecke om man har valgt en ulovlig dato fx. 31-02-2004.
Når man vælger en ulovlig dato skal der komme en fejlmeddelelse på skræmen.
Jeg giver 60 point, for jeg vil gerne have koden :)
Avatar billede ahv Nybegynder
23. juni 2003 - 19:14 #1
Dette lille scrips skulle kunne tjekke datoen ->

<script type='text/javascript'>
function checkDato( datoStreng ) {
    var format = /^\d\d-\d\d-\d\d\d\d$/;
    if (format.test(datoStreng)) {         
        var dag = parseInt(datoStreng.substring(0,2), 10);
        var maaned = parseInt(datoStreng.substring(3,5), 10);
        var aar = parseInt(datoStreng.substring(6,10), 10);
        var dato = new Date(aar, maaned-1, dag);
        if (dato.getDate() == dag && dato.getMonth() == maaned-1) {
            return true;
        }
    }
    return false;
};

function valider (formObjekt) {
    if (!checkDato(formObjekt.datoFeltNavn.value)) {
        alert("den indtastede dato duer ikke.\nBenyt formatet DD-MM-YYYY");
        formObjekt.datoFeltNavn.focus();
        return false;
    }
    return true;
};
</script>
Avatar billede ahv Nybegynder
23. juni 2003 - 19:14 #2
Sammen med et formefelt vil det blive ->

<script type='text/javascript'>
function checkDato( datoStreng ) {
    var format = /^\d\d-\d\d-\d\d\d\d$/;
    if (format.test(datoStreng)) {         
        var dag = parseInt(datoStreng.substring(0,2), 10);
        var maaned = parseInt(datoStreng.substring(3,5), 10);
        var aar = parseInt(datoStreng.substring(6,10), 10);
        var dato = new Date(aar, maaned-1, dag);
        if (dato.getDate() == dag && dato.getMonth() == maaned-1) {
            return true;
        }
    }
    return false;
};

function valider (formObjekt) {
    if (!checkDato(formObjekt.datoFeltNavn.value)) {
        alert("den indtastede dato duer ikke.\nBenyt formatet DD-MM-YYYY");
        formObjekt.datoFeltNavn.focus();
        return false;
    }
    return true;
};
</script>

<form method=post action="form.htm" onsubmit="return valider(this);">
<input type="text" name="datoFeltNavn"><br>
<input type="submit">
</form>
Avatar billede kimlarsen1978 Nybegynder
23. juni 2003 - 19:17 #3
Okay, men jeg har jo datoen i 3 dropdownmenuer
-en til dag
-en til måned
-og en til år
Du bruger et tekstfelt
Avatar billede tuctoh Nybegynder
23. juni 2003 - 19:17 #4
ahv >> hvad så med skudår?
Avatar billede kimlarsen1978 Nybegynder
23. juni 2003 - 19:20 #5
Ja, det er jo én af de problemer jeg søger en løsning på :)
Avatar billede ahv Nybegynder
23. juni 2003 - 19:22 #6
tuctoh -> Det ser ud til at virke?

kimlarsen1978 -> Jeg ser lige på det.
Avatar billede kimlarsen1978 Nybegynder
23. juni 2003 - 19:24 #7
Zuperrrrrrrrr :)
Avatar billede ahv Nybegynder
23. juni 2003 - 19:43 #8
Yes så skulle den være her (Udfyld selv med dage osv, ved ikke om du f.eks. har et serverscript der kan gøre det, men den skulle virke) ->

<script type='text/javascript'>
function checkDato( datoStreng ) {
    var format = /^\d\d-\d\d-\d\d\d\d$/;
    if (format.test(datoStreng)) {         
        var dag = parseInt(datoStreng.substring(0,2), 10);
        var maaned = parseInt(datoStreng.substring(3,5), 10);
        var aar = parseInt(datoStreng.substring(6,10), 10);
        var dato = new Date(aar, maaned-1, dag);
        if (dato.getDate() == dag && dato.getMonth() == maaned-1) {
            return true;
        }
    }
    return false;
};

function valider (formObjekt) {
    var dmy = formObjekt.day.value + "-" + formObjekt.month.value + "-" + formObjekt.year.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 ahv Nybegynder
23. juni 2003 - 19:44 #9
Alert beskeden kan du selv ændre på, da man jo aktid vil bruge det format ;o) Så ændre den til at det ikke er en lovlig dato eller noget i den stil.
Avatar billede roenving Novice
23. juni 2003 - 19:59 #10
>>ahv

-- du laver da alt for meget:

-- for det fårste skal du ikke checke for format, da du selv har lavet det ...
-- for det andet havde du data i en perfekt form før du gjorde det til en streng, altså:

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

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

mvh
jes
Avatar billede kimlarsen1978 Nybegynder
23. juni 2003 - 19:59 #11
Zuper
Virker Max
Den giver godt en fejl når jeg vælger en rigtig dato:
--------------------------
405 Method Not Allowed
The method specified in the Request Line is not allowed for the resource identified by the request. Please ensure that you have the proper MIME type set up for the resource you are requesting.
-------------------------
Er det fordi jeg kalder sigen selv? min side hedder form.htm og det er jo også action på formen?
Avatar billede ahv Nybegynder
23. juni 2003 - 20:01 #12
kimlarsen1978 -> det ved jeg ikke hvorfor den siger, roenving ved det måske? Han er hverfald mere inde i den her kategori end jeg er.
Avatar billede kimlarsen1978 Nybegynder
23. juni 2003 - 20:02 #13
>>ahv
dit virker, men det giver den der 405 Method Not Allowed

>>Jes
dit virker ikke den giver "alert" ligemeget hvilken dato jeg vælger
Avatar billede roenving Novice
23. juni 2003 - 20:09 #14
Virker det ???

-- Jeg havde lige overset to kæmpebrølere i det ahv havde skrevet, så dem havde jeg ukritisk taget med, men de er også rettet nu:

<script language='javascript' type='text/javascript'>
function checkDato( dmy ) {
        var dag = parseInt(dmy[0]);
        var maaned = parseInt(dmy[1])-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>
Avatar billede roenving Novice
23. juni 2003 - 20:10 #15
1. rettede brøler:
New Date(YYYY, MM, DD)

og anden:
Value på en select findes ved selct.options[select.selectedIndex].value

hth
jes
Avatar billede kimlarsen1978 Nybegynder
23. juni 2003 - 20:11 #16
Dit virker også nu, men der kommer 2 alert bokse ved fejldato og en ved rigtig dato efterfylgt af den der: 405 Method Not Allowed
Min kode/Din kode
------------
<script language='javascript' type='text/javascript'>
function checkDato( dmy ) {
        var dag = parseInt(dmy[0]);
        var maaned = parseInt(dmy[1])-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" onsubmit="return valider(this);" action="form.htm">
  <p><select size="1" name="day">
    <option value="01">01</option>
    <option value="28">28</option>
    <option value="29">29</option>
    <option value="31">31</option>
  </select>
 
  <select size="1" name="month">
    <option value="01">01</option>
    <option value="02">02</option>
    <option value="03">03</option>
    <option value="04">04</option>
  </select>
 
  <select size="1" name="year">
    <option value="2001">2001</option>
    <option value="2002">2002</option>
    <option value="2003">2003</option>
    <option value="2004">2004</option> 
  </select></p>
  <p><input type="submit" value="Send" name="B1"><input type="reset" value="Nulstil" name="B2"></p>
</form>
Avatar billede ahv Nybegynder
23. juni 2003 - 20:13 #17
/me synes roenving er god til at overtgae mine spm. når det ser sort ud ;o)

roenving -> Du skulle vel ikke have ICQ eller MSN?
Avatar billede roenving Novice
23. juni 2003 - 20:21 #18
-- hov jeg havde ikke fjernet min debug-ting:

function checkDato( dmy ) {
        var dag = parseInt(dmy[0]);
        var maaned = parseInt(dmy[1])-1;
        var dato = new Date(parseInt(dmy[2]), maaned, dag );
        if (dato.getDate() == dag && dato.getMonth() == maaned) {
            return true;
        }
    return false;
};

-- og nej, jeg har ik' sådan noget ...
Avatar billede kimlarsen1978 Nybegynder
23. juni 2003 - 20:29 #19
Ja det virker nu
Ville du have noget imod at forklarer hvad der sker, så jeg kan lære lidt :)
Du bruger fnktionen checkDato som hjælpefunktion til valider. Men hvad sker der i de enkelte trin i "checkDato"? Fx hvorfor skriver du -1 ved måned?
Avatar billede kimlarsen1978 Nybegynder
23. juni 2003 - 20:38 #20
Hvordan vil I dele points?
ahv-->> var hurtigst
men
jes-->> din kode var mest effektiv

De virker begge 2
50/50 ????????
Avatar billede ahv Nybegynder
23. juni 2003 - 20:43 #21
Det er jo let for mig bare at sige 50/50, men roenving hvad siger du?
Avatar billede roenving Novice
24. juni 2003 - 04:33 #22
Jeg tror jeg har points nok ...
Avatar billede roenving Novice
24. juni 2003 - 04:43 #23
Du sørger jo for, ved hjælp af dine selects at man ikke kan indtaste tåbelige ting, så det skal vi jo ikke bruge kræfter på ...

ahv's tankegang om at lave et Date-object er den eneste rigtige for at checke om en dato findes -- jeg tror faktisk, at jeg kan lave en algoritme uden et Date-object, som er en anelse slankere i processor-tid, men da vi snakker om et native objekt mod et custom-check, vil det kun være effektivere for alvor i de hårde situationer (29/2-1800) -- dem findes der (der gættes !-) 3 af på 400 år !

Så det vi gør, er at bede javascript lave en dato, hvis den dato som javascript efter sin indbyggede fejlretningsrutine finder er den samme, som vi har, findes datoen faktisk ...
Avatar billede kimlarsen1978 Nybegynder
24. juni 2003 - 10:28 #24
Takker :)
Avatar billede roenving Novice
24. juni 2003 - 15:47 #25
Hov vi glemte lige at fortælle, at dato-funktionen (Date-objektet) i javascript tæller måneder på 'normal' javascript-maner, dvs. de starter med nummer 0 (som en slags index) -- datoer og år regnes som 'navne' dvs. man skriver dem 'rigtigt' ...

altså dage fra 1 til 31
måneder fra 0 til 11
årstal, ja det de er ...
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