Avatar billede ugotabe_kidding Nybegynder
23. februar 2004 - 12:16 Der 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.
Avatar billede mm12010 Nybegynder
23. februar 2004 - 12:22 #1
du kunne jo alternativt kontrollerer brugerens indtastninger med roenving's dato-fætter(nederst):
http://roenving.users.whitehat.dk/WD3Input.html
Avatar billede roenving Novice
23. februar 2004 - 13:13 #2
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 ...
Avatar billede ugotabe_kidding Nybegynder
23. februar 2004 - 13:20 #3
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/
Avatar billede ugotabe_kidding Nybegynder
23. februar 2004 - 13:26 #4
>> roenving: Har du ellers et sted man kan finde et forslag til en popup-kalender?
Avatar billede roenving Novice
23. februar 2004 - 13:36 #5
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 ...
Avatar billede ugotabe_kidding Nybegynder
23. februar 2004 - 13:52 #6
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.
Avatar billede ugotabe_kidding Nybegynder
23. februar 2004 - 13:58 #7
Sorry... det er selvfølgelig dd>31, der pt. tillades.. (hvad bruges det ekstra inputfelt til?)
Avatar billede roenving Novice
23. februar 2004 - 14:06 #8
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>
Avatar billede roenving Novice
23. februar 2004 - 14:06 #9
-- og velbekomme '-)
Avatar billede roenving Novice
23. februar 2004 - 14:06 #10
;O)
Avatar billede ugotabe_kidding Nybegynder
23. februar 2004 - 14:06 #11
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

Hvordan får jeg det ind i min input?
Avatar billede roenving Novice
23. februar 2004 - 14:15 #12
Sæt det ind, hvor der i inputten står value="mm/dd/åååå" (næstsidste linje i E*-gengivelsen !-)
Avatar billede ugotabe_kidding Nybegynder
23. februar 2004 - 14:22 #13
Argh! Så fejler den totalt... :o/
Ændring markeret med VERSALER:

<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=13 IF(DATEFROMDB<>"" THEN VALUE="<% = DateShow %>" ELSE value="mm/dd/åååå") name="dtmDate">
Avatar billede roenving Novice
23. februar 2004 - 14:32 #14
Du skal selvfølgelig lave det som rigtig asp(?)-script:

<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=13 <%IF DATEFROMDB<>"" THEN Response.Write "VALUE=""<% = DateShow %>""" ELSE Response.Write "value=""mm/dd/åååå""" name="dtmDate">
Avatar billede roenving Novice
23. februar 2004 - 14:32 #15
-- og tak for points ;~}
Avatar billede ugotabe_kidding Nybegynder
23. februar 2004 - 15:16 #16
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 %>">
Avatar billede roenving Novice
23. februar 2004 - 15:27 #17
Det skal vel være <>0 ...

-- men hvordan ser den færdigkompilerede tekst ud (Vis kilde i browseren !-)
Avatar billede ugotabe_kidding Nybegynder
23. februar 2004 - 15:31 #18
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/
Avatar billede roenving Novice
23. februar 2004 - 15:35 #19
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 ?-)
Avatar billede ugotabe_kidding Nybegynder
23. februar 2004 - 15:47 #20
Nej, det er DET, der er så mærkeligt!!!

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?

Nu er vi der næsten ;o)
Avatar billede roenving Novice
23. februar 2004 - 15:53 #21
-- det skulle være tilstrækkeligt at fjerne den sidste case 9, men jeg har i mine tests selv ændret den til case 10, og det generede ikke !-)
Avatar billede ugotabe_kidding Nybegynder
23. februar 2004 - 15:58 #22
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...
Avatar billede roenving Novice
23. februar 2004 - 16:56 #23
Har du checket case 3: i @14:06:17
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