23. februar 2004 - 12:16Der er
22 kommentarer og 1 løsning
Validering af dato inden submitting form
Jeg ønsker at sikre at alle datoangivelser, postet af en bruger, registreres og vises som mm/dd/yyyy. Mit problem er, at hvis en bruger skrlver f.eks. 23/02/2004 omskrives det automatisk til 02/23/2004, men hvis brugeren skriver 13/13/2004 returnerer siden en fejl 500. Hvorledes laver jeg en semi-avanceret validering, så brugeren får en "pæn" fejlmeddelelse, hvis indtastningen er ugyldig.
Den absolut mest suveræne løsning, jeg har set, er at input i datofelter kun sker fra popup-kalendere, smartest smidt ind i en div, som popper op der hvor feltet er ved klik på feltet ...
Næstbedst er omtalte 'dato-fætter' og ellers kan man med de indtastede oplysninger lave et dato-objekt og derudfra teste, om datoen er valid ...
Jeg sidder nu og forsøger at redigere i din (roenving) kode, så jeg kan få mm/dd/yyyy i stedet. Er der et sted jeg kan se en oversigt over charcodes eller kan du hurtigt hjælpe mig med denne omskrivning? Det er nemlig IKKE bare at kopiere case 0+1 ned efter case 4 og rette numrene til... :o/
Har ikke selv kigget efter dem, så jeg ved kun, at de gange, jeg har lavet en google-søgning efter 'javascript calendar' har jeg fået mange hits !-)
-- og en omskrevet udgave af inputmasken (ikke stress-testet !-)
<script type="text/javascript"> //Script til inputmaske for datofeltet. START var newVal=""; var fdate = null; 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==47){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 (charCode>49){repeatRemove++;return false;} break; case 1: if (+newVal>12){repeatRemove++;return false;} if (+newVal==00){repeatRemove++;return false;} mm = +newVal; newVal+="/"; break; case 2: newVal=fld.value+"/"+String.fromCharCode(charCode) if (charCode>51){repeatRemove++;return false;} break; case 3: if (+newVal>3){repeatRemove++;return false;} break; case 4: dd = 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<50 || charCode>50){repeatRemove++;return false;} //Tillader 2 som første tal i årstal break; case 7: var yy = parseInt(newVal.substring(6)); if (yy<20 || yy>20){repeatRemove++;return false;} //Tillader 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)); if (mm == 2 && dd == 29 && yyyy%4 !=0){repeatRemove+=8;return false;}
case 9: var yyyy = parseInt(newVal.substring(6)); if (mm == 2 && dd == 29 && yyyy%4 !=0){repeatRemove+=8;return false;} if(fld.name=='firstinput'){ fdate = new Date(newVal.substring(6),parseInt(newVal.substring(3,5),10)-1,parseInt(newVal.substring(0,2),10)); }else{ sdate = new Date(newVal.substring(6),parseInt(newVal.substring(3,5),10)-1,parseInt(newVal.substring(0,2),10)); var forsk = Math.round((sdate-fdate)/(24*60*60*1000)); fld.form.forskel.value = forsk + 1; } } return true; } //Script til inputmaske for datofelt. SLUT </script> Den skal så aktiveres med et input-felt, som ser sådan ud: <form> <INPUT class=FormInput onkeypress="return inputDate(event,this);" onkeydown=if(getCharCode(event)==8)repeatRemove++; onblur="if(this.value=='')this.value=this.defaultValue;" onkeyup=restoreVal(getCharCode(event),this);this.focus(); onfocus="if(this.value==this.defaultValue)this.value='';" tabIndex=11 maxLength=10 size=25 value="mm/dd/åååå" name="secondinput"> <br><input disabled name="forskel"> </form>
-- den indeholder noget forskels-noget, som du lige kan luge ud ...
Ohhh... Sweet...Det virker bare (næsten)... Et eller andet sted verificerer den ikke måneden (mm>31 tillades) Kan du hjælpe med det og samtidig kaste et svar i min retning? Mvh U.K.
Det var en kode jeg havde liggende, så der var en tælle-ting, som skulle vise en forskel mellem to datoer, men uden skal du bare
(først rettelsen !-)
case 3: if (charCode>51){repeatRemove++;return false;} break;
-- og så det sidste:
break; case 10: var yyyy = parseInt(newVal.substring(6)); if (mm == 2 && dd == 29 && yyyy%4 !=0){repeatRemove+=8;return false;} } } return true; } //Script til inputmaske for datofelt. SLUT </script> Den skal så aktiveres med et input-felt, som ser sådan ud: <form> <INPUT class=FormInput onkeypress="return inputDate(event,this);" onkeydown=if(getCharCode(event)==8)repeatRemove++; onblur="if(this.value=='')this.value=this.defaultValue;" onkeyup=restoreVal(getCharCode(event),this);this.focus(); onfocus="if(this.value==this.defaultValue)this.value='';" tabIndex=11 maxLength=10 size=25 value="mm/dd/åååå" name="secondinput"> </form>
Der er faktisk lige 1 ting yderligere.. Når datoen skrives til DB og gemmes, skal den naturligvis præsenteres: if DateFromDB<>"" Then value=""<% = DateShow %>" Else value="mm/dd/åååå" End If
Det mener jeg er gjort nu - MEN NU ER VALIDERINGEN PIST BORTE!! Feltet er nu frit til vilkårlig indtastning!! Overskriver ASP-koden javascriptet eller hva f***** foregår der? Har du stadig tålmodighed til at give mig en hånd?
<INPUT class=FormInput onkeypress="return inputDate(event,this);" onkeydown=if(getCharCode(event)==8)repeatRemove++; onblur="if(this.value=='')this.value=this.defaultValue;" onkeyup=restoreVal(getCharCode(event),this);this.focus(); onfocus="if(this.value==this.defaultValue)this.value='';" maxLength=10 size=13 <%If len(rsShare("dtmDate"))<>"0" THEN Response.Write "VALUE='"& DateShow &"'" ELSE Response.Write "value='mm/dd/åååå'" End If%> name="dtmDate<%= x %>">
Dette er input-koden taget fra View Source: <INPUT class=FormInput onkeypress="return inputDate(event,this);" onkeydown=if(getCharCode(event)==8)repeatRemove++; onblur="if(this.value=='')this.value=this.defaultValue;" onkeyup=restoreVal(getCharCode(event),this);this.focus(); onfocus="if(this.value==this.defaultValue)this.value='';" maxLength=10 size=13 VALUE='10/13/2004' name="dtmDate1"> -- Hvis jeg sætter curseren i feltet, fjernes datoen og jeg kan taste alle karakterer - ingen validering :o/
Du kan fjerne onblur- og onfocus-koden, hvis du ikke vil have, at den tømmes, men jeg forstår ikke, at den ikke validerer, for der er jo ikke ændret noget i script-koden ?-)
Der er sket et eller andet i scriptet - nu har jeg indsat dit eksempel igen (og det virker)... Men der er 2 x case 9... Skal jeg bare fjerne nr. 2 og lade være med at indsætte case 10?
Det er såååå tæt på nu - en gammel fejl er genopstået - dd>31? Jeg synes ellers at jeg har tilføjet dine ekstra rettelser, men dd er stadig gal - ellers funker resten 150% ;o) Tak for din overbærenhed. Hvis du kan hjælpe mig med det, så skal jeg nok lade være med at forstyrre yderligere...
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.