23. juni 2003 - 19:11Der 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 :)
<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>
<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>
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>
-- 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>
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?
-- 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>
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>
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; };
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?
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 ...
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 ...
Synes godt om
Ny brugerNybegynder
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.