12. juni 2003 - 13:43Der er
30 kommentarer og 1 løsning
Validering af dato - korrekt format?
Jeg forsøger som en gal, at få en validering af en formular til at virke. Det jeg har indtil nu, virker faktisk fint, men jeg mangler at includere én enkelt funktion i valideringen, nemlig at tjekke for korrekt dato-format (DD/MM/ÅÅÅÅ) i to felter. Felterne, som skal tjekkes, hedder "firstsinput" og "secondinput". I øjeblikket bliver der kun tjekket for indtastning i felterne, men ikke for korrekt format: hele scriptet ser således ud: <SCRIPT language="JavaScript"> <!-- Hide from older browsers
//Check the enquiry form is filled in correctly function CheckForm () {
//Initialise variables var errorMsg = "";
//Check for a first name if (document.frmEnquiry.Name.value == ""){ errorMsg += "\n\tNavn \t\t- Indtast dit navn"; }
//Check for phone if (document.frmEnquiry.tel.value == ""){ errorMsg += "\n\tTelefonnummer \t- Indtast dit tlf.nr."; }
//Check for an e-mail address and that it is valid if ((document.frmEnquiry.email.value == "") || (document.frmEnquiry.email.value.length > 0 && (document.frmEnquiry.email.value.indexOf("@",0) == - 1 || document.frmEnquiry.email.value.indexOf(".",0) == - 1))) { errorMsg += "\n\tE-mail adresse \t- Indtast en gyldig e-mail adresse"; }
//Check for firstinput if (document.frmEnquiry.firstinput.value == ""){ errorMsg += "\n\tFørste overnatning \t- Indtast første nat"; }
//Check for secondinput if (document.frmEnquiry.secondinput.value == ""){ errorMsg += "\n\tSidste overnatning \t- Indtast sidste nat"; }
//Check for an enquiry if (document.frmEnquiry.enquiry.value == "") { errorMsg += "\n\tBesked \t\t- Skriv en besked"; }
//If there is aproblem with the form then display an error if (errorMsg != ""){ msg = "______________________________________________________________\n\n"; msg += "Din besked er ikke blevet sendt da der er problem(er) med formen.\n"; msg += "Venligst ret problemet(erne) og send formen igen.\n"; msg += "______________________________________________________________\n\n"; msg += "Følgende felt(er) skal rettes til: -\n";
Er der ikke et klogt hoved derude, som kan ændre valideringen for "firstinput" og "secondinput", så der også bliver kontrolleret for korrekt dato-format?
//Check for firstinput dat = document.frmEnquiry.firstinput.value; if (dat == ""||!regex.test(dat)){ errorMsg += "\n\tFørste overnatning \t- Indtast første nat"; }else{ dat = dat.split("/"); var tdate = new Date(parseInt(dat[2]),parseInt(dat[1]),parseInt(dat[0])); if (tdate.getDate()!=dat[0]||tdate.getMonth()+1!=dat[1]||tdate.getFullYear()!=dat[2]){ errorMsg += "\n\tFørste overnatning \t- Indtast første nat (DD/MM/ÅÅÅÅ)"; } }
//Check for secondinput dat = document.frmEnquiry.secondinput.value; if (dat == ""||!regex.test(dat)){ errorMsg += "\n\tSidste overnatning \t- Indtast sidste nat"; }else{ dat = dat.split("/"); var tdate = new Date(parseInt(dat[2]),parseInt(dat[1]),parseInt(dat[0])); if (tdate.getDate()!=dat[0]||tdate.getMonth()+1!=dat[1]||tdate.getFullYear()!=dat[2]){ errorMsg += "\n\tSidste overnatning \t- Indtast sidste nat (DD/MM/ÅÅÅÅ)"; } }
-- endnu ikke testet -- men ideen er til at bruge helt !-)
Hvor skal dette indsættes: regex =/^(3[01]|0[1-9]|[12]\d)\/(0(1-9]|1[012])\/\d{4}/;
Lige nu ser scriptet således ud, men nu bliver der slet ikke valideret i nogen felter :-(
<SCRIPT language="JavaScript"> <!-- Hide from older browsers
//Check the enquiry form is filled in correctly function CheckForm () {
//Initialise variables var errorMsg = "";
//Check for a first name if (document.frmEnquiry.Name.value == ""){ errorMsg += "\n\tNavn \t\t- Indtast dit navn"; }
//Check for phone if (document.frmEnquiry.tel.value == ""){ errorMsg += "\n\tTelefonnummer \t- Indtast dit tlf.nr."; }
//Check for an e-mail address and that it is valid if ((document.frmEnquiry.email.value == "") || (document.frmEnquiry.email.value.length > 0 && (document.frmEnquiry.email.value.indexOf("@",0) == - 1 || document.frmEnquiry.email.value.indexOf(".",0) == - 1))) { errorMsg += "\n\tE-mail adresse \t- Indtast en gyldig e-mail adresse"; }
//Check for firstinput dat = document.frmEnquiry.firstinput.value; if (dat == ""||!regex.test(dat)){ errorMsg += "\n\tFørste overnatning \t- Indtast første nat"; }else{ dat = dat.split("/"); var tdate = new Date(parseInt(dat[2]),parseInt(dat[1]),parseInt(dat[0])); if (tdate.getDate()!=dat[0]||tdate.getMonth()+1!=dat[1]||tdate.getFullYear()!=dat[2]){ errorMsg += "\n\tFørste overnatning \t- Indtast første nat (DD/MM/ÅÅÅÅ)"; } }
//Check for secondinput dat = document.frmEnquiry.secondinput.value; if (dat == ""||!regex.test(dat)){ errorMsg += "\n\tSidste overnatning \t- Indtast sidste nat"; }else{ dat = dat.split("/"); var tdate = new Date(parseInt(dat[2]),parseInt(dat[1]),parseInt(dat[0])); if (tdate.getDate()!=dat[0]||tdate.getMonth()+1!=dat[1]||tdate.getFullYear()!=dat[2]){ errorMsg += "\n\tSidste overnatning \t- Indtast sidste nat (DD/MM/ÅÅÅÅ)"; } }
//Check for an enquiry if (document.frmEnquiry.enquiry.value == "") { errorMsg += "\n\tBesked \t\t- Skriv en besked"; }
//If there is aproblem with the form then display an error if (errorMsg != ""){ msg = "______________________________________________________________\n\n"; msg += "Din besked er ikke blevet sendt da der er problem(er) med formen.\n"; msg += "Venligst ret problemet(erne) og send formen igen.\n"; msg += "______________________________________________________________\n\n"; msg += "Følgende felt(er) skal rettes til: -\n";
//Check for firstinput dat = document.minForm.minText1.value; if (dat == ""||!regex.test(dat)){ errorMsg += "\n\tFørste overnatning \t- Indtast første nat"; }else{ dat = dat.split("/"); var tdate = new Date(parseInt(dat[2]),parseInt(dat[1])-1,parseInt(dat[0])); if (tdate.getDate()!=parseInt(dat[0])||tdate.getMonth()+1!=parseInt(dat[1])||tdate.getFullYear()!=parseInt(dat[2])){ errorMsg += "\n\tFørste overnatning \t- Ugyldig dato (DD/MM/ÅÅÅÅ)"; }else{dato1=tdate.getTime()}; }
//Check for secondinput dat = document.minForm.minText2.value; if (dat == ""||!regex.test(dat)){ errorMsg += "\n\tSidste overnatning \t- Indtast sidste nat"; }else{ dat = dat.split("/"); var tdate = new Date(parseInt(dat[2]),parseInt(dat[1])-1,parseInt(dat[0])); if (tdate.getDate()!=parseInt(dat[0])||tdate.getMonth()+1!=parseInt(dat[1])||tdate.getFullYear()!=parseInt(dat[2])){ errorMsg += "\n\tSidste overnatning \t- Ugyldig dato (DD/MM/ÅÅÅÅ)"; }else{ if(dato1>=tdate.getTime()) errorMsg += "\n\tSidste overnatning \t- Efter første overnatning!" }
}
Du sætter ovenstående ind som een blok i stedet for den validering du havde af datoerne !O]
- først at datoerne har det rigtige format og at der ikke er indlysende fejl i indtastningen (datoer='00' eller > '31', måneder = '00' eller >'12', år med 4 cifre) med regex ... - derefter om der i virkeligheden findes en dato der hedder sådan (væk med 31/11 samt 29/02/2003 ;O) - til sidst om slutdatoen er før startdatoen
-> roenving Du er bare en knag :-) Som du selv siger, så virker det - NÆSTEN. Der er et lille men. Datoen for "Sidste overnatning" må gerne være samme som "første overnatning" (hvis man kun har én overnatning). Kan du fikse det også?
Bestillingsfristen er rent faktisk to dag, så hvis det kunne fikses også, såååå....! :-) Her skal dog bemærkes, at der som "default" i begge dato-felter står aktuel dato. Det hjalp du mig med i går!
Jeg var nok lidt hurtig før, da jeg fortalte at det hele virkede. Der bliver IKKE tjekket for ugyldig dato - får kun denne fejlmeddelelse, hvis jeg skriver forkert format: "Indtast første nat" - Bør den ikke skrive "Ugyldig dato (DD/MM/ÅÅÅÅ)" ved fejl?
Får den heller ikke til at tjekke på 2-dages fristen :-(
//Check for firstinput dat = document.frmEnquiry.firstinput.value; if (dat == ""||!regex.test(dat)){ errorMsg += "\n\tFørste overnatning \t- Indtast første nat"; }else{ dat = dat.split("/"); var tdate = new Date(parseInt(dat[2]),parseInt(dat[1])-1,parseInt(dat[0])); if (tdate.getDate()!=parseInt(dat[0])||tdate.getMonth()+1!=parseInt(dat[1])||tdate.getFullYear()!=parseInt(dat[2])){ errorMsg += "\n\tFørste overnatning \t- Ugyldig dato (DD/MM/ÅÅÅÅ)"; }else{dato1=tdate.getTime(); var chdato = new Date()+ (48*60*60*1000); if (dato1>chdato) errorMsg += "\n\tFørste overnatning \t- Bestillingsfrist 2 dage" }; }
//Check for secondinput dat = document.frmEnquiry.firstinput.value; if (dat == ""||!regex.test(dat)){ errorMsg += "\n\tSidste overnatning \t- Indtast sidste nat"; }else{ dat = dat.split("/"); var tdate = new Date(parseInt(dat[2]),parseInt(dat[1])-1,parseInt(dat[0])); if (tdate.getDate()!=parseInt(dat[0])||tdate.getMonth()+1!=parseInt(dat[1])||tdate.getFullYear()!=parseInt(dat[2])){ errorMsg += "\n\tSidste overnatning \t- Ugyldig dato (DD/MM/ÅÅÅÅ)"; }else{ if(dato1>tdate.getTime()) errorMsg += "\n\tSidste overnatning \t- Dato kan ikke være tidligere end første nat" }
//Check for firstinput dat = document.minForm.minText1.value; if (dat == ""||!regex.test(dat)){ errorMsg += "\n\tFørste overnatning \t- Indtast første nat"; }else{ dat = dat.split("/"); var tdate = new Date(parseInt(dat[2]),parseInt(dat[1])-1,parseInt(dat[0])); if (tdate.getDate()!=parseInt(dat[0])||tdate.getMonth()+1!=parseInt(dat[1])||tdate.getFullYear()!=parseInt(dat[2])){ errorMsg += "\n\tFørste overnatning \t- Ugyldig dato (DD/MM/ÅÅÅÅ)"; }else{dato1=tdate.getTime(); var chdato = new Date().getTime()+ (48*60*60*1000); alert(dato1+"\n"+chdato); if (chdato>dato1) errorMsg += "\n\tFørste overnatning \t- Bestillingsfrist 2 dage" }; }
//Check for secondinput dat = document.minForm.minText2.value; // alert(dat); if (dat == ""||!regex.test(dat)){ errorMsg += "\n\tSidste overnatning \t- Indtast sidste nat"; }else{ dat = dat.split("/"); var tdate = new Date(parseInt(dat[2]),parseInt(dat[1])-1,parseInt(dat[0])); if (tdate.getDate()!=parseInt(dat[0])||tdate.getMonth()+1!=parseInt(dat[1])||tdate.getFullYear()!=parseInt(dat[2])){ errorMsg += "\n\tSidste overnatning \t- Ugyldig dato (DD/MM/ÅÅÅÅ)"; }else{ if(dato1>tdate.getTime()) errorMsg += "\n\tSidste overnatning \t- Dato kan ikke være tidligere end første nat" }
Nu har jeg en ny fejl: en advarselsboks dukker op (altså en ny boks) med disse informationer: quote 1055368800000 1055608446458 unquote
med tilhørende "OK"-knap - først derefter kommer den alm. valideringsadvarsel op. Jeg kan stadig ikke få advarsel "Ugyldig dato (DD/MM/ÅÅÅÅ)" frem på min alert-boks. Den giver ganske vist en advarsel for feltet, men advarsel lyder bare: "Indtast første nat", hvis jeg f.eks. skriver "1. jul 03".
Okay, jg har nu fået slettet "aktuel"-dato'en i "firstinput" og "secondinput", så der nu som default-value står"DD/MM/ÅÅÅÅ". Derefter virker det hele faktisk - dog med undtagelse af den lille første advarselsboks: quote 1055368800000 1055608446458 unquote
som desværre stadig dukker op, hver gang jeg trykker "Submit" ???
Rent faktisk er tallene i advarslen forskellige afhængig af hvilke dato'er jeg indtaster i felterne. Hvis jeg trykker "Submit" uden at have ændret default-valuen "DD/MM/ÅÅÅÅ" kommer denne lille alert-boks ikke op før "validerings"-alerten!
Jo, jeg har fået fjernet din alert-box, men kan stadig ikke hitte ud af hvorfor jeg ikke kan fremtvinge alert'en "Ugyldig dato (DD/MM/ÅÅÅÅ)" hvis jeg indtaster eks. "1. jul." i dato-felterne !!
Vi kan da godt lægge en anden fejlmeddelelse på, men lige nu bliver den dirigeret igennem fejlmeddelelsen 'Indtast første/anden nat' -- den kan sagtens laves anderledes ...
-- og du har arbejdet endnu videre ,-)
-- Jeg er forøvrigt positivt overrasket over det professionelle look dine fejlmeddelelser har, det'r zq rart at støde ind i den slags -- bare en gang imellem ;O)
For øvrigt var jeg involveret i et input-maske script for nogle uger siden -- det kunne være det kunne tilføje noget til funktionaliteten:
<html><head> <TITLE>Validering dd-mm-yyyy</TITLE> <META NAME="Generator" CONTENT="Stone's WebWriter 3.5"> <!-- Virker i IE6, men ikke i Stone's interne --> <script LANGUAGE="javascript" TYPE="text/javascript"> //Script til inputmaske for datofeltet. START var newVal=""; var dd=0; var mm=0; var repeatRemove=0;
function getCharCode(e){ return (e.which)?e.which:e.keyCode; }
function restoreVal(eC,fld){ if (eC==8||repeatRemove>0){ if (newVal.length>repeatRemove){ newVal=newVal.substring(0,newVal.length-repeatRemove) }else{ newVal=""; } } repeatRemove=0; fld.value=newVal; }
function inputDate(e,fld){ removeChar=false; newVal=fld.value; charCode = getCharCode(e); if ((fld.value.length==2 || fld.value.length==5) && charCode==45){newVal+="-";return true;} if (fld.value.length==10 || charCode>57 || charCode<48){ return false; }
newVal=fld.value+String.fromCharCode(charCode)
switch (fld.value.length){ case 0: if (+newVal>3){repeatRemove++;return false;} break; case 1: if (+newVal>31){repeatRemove++;return false;} if (+newVal==00){repeatRemove++;return false;} dd = +newVal; newVal+="-"; break; case 2: newVal=fld.value+"-"+String.fromCharCode(charCode) if (charCode>49){repeatRemove++;return false;} break; case 3: if (charCode>49){repeatRemove++;return false;} break; case 4: var mm = parseInt(newVal.substring(3),10); if (mm==2 && dd>29 || mm>12 || mm==00){repeatRemove++;return false;} if (dd==31 && (mm==4 || mm==6 || mm==9 || mm==11)){repeatRemove++;return false;} newVal+="-"; break; case 5: newVal=fld.value+"-"+String.fromCharCode(charCode) break; case 6: if (charCode<49 || charCode>50){repeatRemove++;return false;} //Tillader 1 og 2 som første tal i årstal break; case 7: var yy = parseInt(newVal.substring(6)); if (yy<19 || yy>20){repeatRemove++;return false;} //Tillader 19 og 20 som første to tal i årstal break; case 8: var yyy = parseInt(newVal.substring(6)); if (yyy>200){repeatRemove++;return false;} //Tillader kun 0 som trejde tal, hvis første to er 2 og 0. break; case 9: var yyyy = parseInt(newVal.substring(6)); var thisYear = new Date().getFullYear(); alert(thisYear); if (yyyy>thisYear){repeatRemove++;return false;} //Tillader højst i år som årstal. break; } return true; } //Script til inputmaske for datofelt. SLUT </SCRIPT> </HEAD> <BODY> <form> <INPUT type="text" name="date" value="" onkeydown="if(getCharCode(event)==8)repeatRemove++;" onkeypress="return inputDate(event,this);" onkeyup="restoreVal(getCharCode(event),this);this.focus();"> </FORM> </body> </HTML>
Input-masken ser bestemt spændende ud. Om jeg kan få den puttet ind i mit nuværende script, er straks mere tvivlsomt, at jeg kan finde ud af. Jeg kikker på det sent i aften - hvis ikke der er røget for mange øller indenbords...:-)
Kan du ikke lige smide et svar, så får du points for hjælpen - det hele virker jo egentlig helt perfekt. Det sidste input-maske script du lagde ud, vil nok blive lidt for kompliceret at sætte ind i mit nuværende script! Med mindre da du har en simpel løsning på en sammensmeltning af de to scripts???
Håber du stadig er med os, roenving! Jeg prøver lige at vende tilbage. Jeg har prøvet at få inputmasken til at virke sammen med de eksisterende funktioner i dato-felterne. Det lykkes dog ikke helt, da jeg tror "onkeyup" ikke kan figurere mere end én gang. Første dato-felt ser således ud (inden forsøg med input-masken):
Jeg skal nok kaste nogle flere pts. til fortsættelse af dette. //.^_^.\\
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.