22. maj 2003 - 12:26Der er
28 kommentarer og 2 løsninger
validering af dato
Jeg har fundet flg. funktion til at valider et datofelt. Mit problem er at den valdier efter MM-DD-ÅÅ istedet for DD-MM-ÅÅ. Jeg har prøvet at rette i den, men kan ikke helt finde ud af det sidste....jeg får alertboksen "Ulovlig Dato2" Er der nogen der lige kan rette det sidste til så den valider efter DD-MM-ÅÅ ?
</script> <script language="JavaScript"> <!-- function validatedate(f) { if (f.fodt.value=="") { alert("Du skal skrive en dato"); return false; } if (f.fodt.value.length!=8) { alert("Datoen skal skrives på formen MM-DD-ÅÅ"); return false; } if (f.fodt.value.charAt(2)!="-" || f.fodt.value.charAt(5)!="-") { alert("Datoen skal skrives på formen MM-DD-ÅÅ"); return false; } var dd=parseInt(f.fodt.value.substring(0,2)); var mm=parseInt(f.fodt.value.substring(3,5)); var yy=parseInt(f.fodt.value.substring(6,8)); if (dd<1 || dd>31 || mm<1 || mm>12) { alert("Ulovlig dato"); return false; } if (yy>=70) { yyyy=yy+1900 } else { yyyy=yy+2000; } d=new Date(yyyy,mm-1,dd,0,0,0,0); if (d.getFullYear()!=yyyy || d.getDate()!=dd || (d.getMonth()+1)!=mm) { alert("Ulovlig dato2"); return false; } return true; } //--> </script>
årstal med 4 cifre -- og den kan ikke klare 29/2-2100 eller 1900, men ellers:
function validateDate(txt){ var reg=/^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/; return (txt.match(reg)!=-1); }
roenving >> er det ikke muligt bare at lave den om jeg har? det er vel ik så meget der skal laves om....er det ik bare en af de sidste linjer? jeg er ikke så god til det her JS endnu
-- jeg syns els det var så ret med en tre-linjers funktion -- uanset den ene linje er på 300+ tegn -- forøvrigt har den også checket om det er en gyldig dato og vil virke altid (bortset fra den ene mulighed, som kommer 3 gange på 400 år) ... men
function validatedate(f) { if (f.fodt.value=="") { alert("Du skal skrive en dato"); return false; } if (f.fodt.value.length!=8) { alert("Datoen skal skrives på formen DD-MM-ÅÅ"); return false; } if (f.fodt.value.charAt(2)!="-" || f.fodt.value.charAt(5)!="-") { alert("Datoen skal skrives på formen DD-MM-ÅÅ"); return false; } var dd=parseInt(f.fodt.value.substring(0,2)); var mm=parseInt(f.fodt.value.substring(3,5)); var yy=parseInt(f.fodt.value.substring(6,8)); if (dd<1 || dd>31 || mm<1 || mm>12) { alert("Ulovlig dato"); return false; } if (yy>=70) { yyyy=yy+1900 } else { yyyy=yy+2000; } d=new Date(yyyy,mm-1,dd,0,0,0,0); if (d.getFullYear()!=yyyy || d.getDate()!=dd || (d.getMonth()+1)!=mm) { alert("Ulovlig dato2"); return false; } return true; }
-- hvad er der galt ???
Jeg får også fejlmeddelelser i stribe, men af en underlig type hvor 11-06-56 er god nok (og datodelene er: 11-6-56) men 11-08-56 ikke er (med datodelene: 11-0-56) ???
Ha, jeg prøvede lige det her -- og jeg kan _ikke_ finde fejlen:
<script language="JavaScript"> <!-- function validatedate(f) { txt=f.fodt.value; if (f.fodt.value=="") { alert("Du skal skrive en dato"); return false; } if (f.fodt.value.length!=8) { alert("Datoen skal skrives på formen DD-MM-ÅÅ"); return false; } if (f.fodt.value.charAt(2)!="-" || f.fodt.value.charAt(5)!="-") { alert("Datoen skal skrives på formen DD-MM-ÅÅ"); return false; } var dd=parseInt(f.fodt.value.substring(0,2)); var mm=parseInt(f.fodt.value.substring(3,5)); var yy=parseInt(f.fodt.value.substring(6,8)); if (dd<1 || dd>31 || mm<1 || mm>12) { alert("Ulovlig dato\n"+dd+"-"+mm+"-"+yy+"\n"+txt); return false; } alert("Lovlig dato\n"+dd+"-"+mm+"-"+yy+"\n"+txt);
-- smid du de to linjer ind jeg gav dig (der er nemlig også checket for underlige tegn) og lav evt. nogle mere beskrivende fejlmeddelelser ved i stedet for:
return (txt.match(reg)!=-1);
at skrive:
if (txt.match(reg)!=-1){ return true; } alert("Datoen skal skrives DD-MM-ÅÅÅÅ"); return false;
men man kan vel sætte det her ind: <script> function check_key(key){ if (key > 44 && key < 46 || key > 47 && key < 58 ){ return true; } else { return false; } } </script> så kan man jo kun taste tal og -
Du lader til at have nogle problemer med dit keybord - måske har du Num-lock slået til. Scriptet virker naturligvis ikke, hvis du skriver / i stedet for - imellem datoelementerne
jow nu tror jeg det virker.....men kan man ikke sætte den ind i form tag'et istedet?? fordi når den står nede ved input tag'et kan man bare trykke ok til fejlen, og derefter trykke submit igen, så bliver den accepteret selvom der er fejl i.
<script language="JavaScript"> <!-- function validatedate(f) { if (f=="") { alert("Du skal skrive en dato"); return false; } if (f.length!=8||f.charAt(2)!="-" || f.charAt(5)!="-") { alert("Datoen skal fylde otte karakterer - eller datoen skal indeholde skilletegnet '-' mellem elementerne"); return false; } var dd=Math.floor(f.substring(0,2)); var mm=Math.floor(f.substring(3,5)); var yy=Math.floor(f.substring(6,8)); if (dd<1 || dd>31 || mm<1 || mm>12) { alert("Ulovlig dato: dag skal ligge mellem 1 og 31, måned mellem 1 og 12"); return false; } if (yy>=70) yyyy=yy+1900; else yyyy=yy+2000 d=new Date(); d.setDate(dd); d.setMonth(mm-1) d.setYear(yyyy) alert ("YES! lovlig dato \n"+ d.toLocaleString()) return true; } </script> <form onsubmit="validatedate(i.value)"> <input name="i" type="text" length=10 > </form>
Nu virker den....men problemet er når der bliver submittet med en forkert værdi, så kommer der en fejl, men når man trykker ok til den, så fortsætter den, og det må den IKKE da det er til en opdateringsfunktion til en database
<script language="JavaScript"> <!-- function validatedate(f) { if (f=="") { alert("Du skal skrive en dato"); return false; } if (f.length!=8||f.charAt(2)!="-" || f.charAt(5)!="-") { alert("Datoen skal fylde otte karakterer - eller datoen skal indeholde skilletegnet '-' mellem elementerne"); return false; } var dd=Math.floor(f.substring(0,2)); var mm=Math.floor(f.substring(3,5)); var yy=Math.floor(f.substring(6,8)); if (dd<1 || dd>31 || mm<1 || mm>12) { alert("Ulovlig dato: dag skal ligge mellem 1 og 31, måned mellem 1 og 12"); return false; } if (yy>=70) yyyy=yy+1900; else yyyy=yy+2000 d=new Date(); d.setDate(dd); d.setMonth(mm-1) d.setYear(yyyy)
Jeg tror det virker som det skal nu...men må nok hellere lige teste det lidt mere.... roenving >> kan du ikke lige ligge et svar, så kan du os' få lidt point : )
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.