29. maj 2003 - 09:16Der er
22 kommentarer og 1 løsning
Automatisk inputmaske
Hvordan kan jeg lave en inputmaske i et tekstfelt?
I det konkrete eksempel skal brugeren indtaste en dato i et tekstfelt efter syntaksen: DD-MM-YYYY
Jeg ønsker, at '-' indsættes automatisk efterhånden som brugeren taster datoen. Desuden bør scriptet ignorere en bindestreg fra brugeren, da det jo indsættes automatisk.
Den var lidt besværlig at greje, for eventen skygger processen, men med et skjult felt til at holde værdien, fik jeg den ihvertfald til at virke i min IE6, men den ville ikke virke i Stone's interne browser, men her er den:
<html><head> <META NAME="Generator" CONTENT="Stone's WebWriter 3.5"> <script> function inputDate(e,fld){ charCode = (e.which)?e.which:e.keyCode; if (charCode>57 || charCode<48){ return false; }
if (fld.value.length==1 || fld.value.length==4){ fld.form.date2.value=fld.value+String.fromCharCode(charCode)+"-"; }else{ fld.form.date2.value=fld.value+String.fromCharCode(charCode) } return true;
Scriptet virker i min IE 5.5, men med et par enkelte problemer:
- Det er muligt at tilføje flere karakterer end de tilladte (dd-mm-yyyy) - Det er ikke muligt at slette i det der allerede er skrevet. Jeg gætter på, at det er fordi scriptet kun tillader tal (charCode 48 til 57)?!
Er du i øvrigt leveringsdytig i en charcode oversigt? eller kan du henvise til en?
<html><head> <META NAME="Generator" CONTENT="Stone's WebWriter 3.5"> <!-- Virker i IE6, men ikke i Stone's interne --> <script LANGUAGE="javascript" TYPE="text/javascript"> var newVal="";
function inputDate(e,fld){ charCode = (e.which)?e.which:e.keyCode;
newVal=fld.value; if (fld.value.length==10 || charCode>57 || charCode<48){ return false; }
newVal=fld.value+String.fromCharCode(charCode) if (fld.value.length==1 || fld.value.length==4){ newVal=newVal+"-"; }
Og så den endelige udgave -- eneste ting, som vil/kan volde problemer, er, at man ikke kan slette bindestregerne med eet tasttryk (ellers ville de ikke være automatiske) -- den variant skal såmænd nok komme lidt senere:
<html><head> <META NAME="Generator" CONTENT="Stone's WebWriter 3.5"> <!-- Virker i IE6, men ikke i Stone's interne --> <script LANGUAGE="javascript" TYPE="text/javascript"> var newVal=""; var dd=0; var mm=0; var repeatRemove=0;
function restoreVal(eC,fld){ if (eC==8||repeatRemove>0){ if (newVal.length>repeatRemove){ newVal=newVal.substring(0,newVal.length-repeatRemove) }else{ newVal=""; } } if(newVal.length==2||newVal.length==5)newVal+="-"; repeatRemove=0; fld.value=newVal; }
function inputDate(e,fld){ removeChar=false; newVal=fld.value; charCode = (e.which)?e.which:e.keyCode; if (fld.value.length==10 || charCode>57 || charCode<48){ return false; }
switch (fld.value.length){ case 0: //alert(newVal); if (+newVal>3){repeatRemove++;return false;} break; case 1: //alert(newVal); if (+newVal>31){repeatRemove++;return false;} dd = +newVal; newVal=newVal+"-"; break; case 2: 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){repeatRemove++;return false;} //alert(mm); if (dd==31 && (mm==4 || mm==6 || mm==9 || mm==11)){repeatRemove++;return false;} newVal=newVal+"-"; break; case 9:
- godtager kun relevante tal på dag- og månedspladserne - sætter selv bindestreger ind efter dage og måneder - hvis man sletter en bindestreg sætter den bindestregen ind igen, hvis man ikke selv gør det - tester IKKE for skudår
- skulle virke NN4+ og IE4+, men IKKE Stone's -- har ikke testet andet end IE6, men har omhyggeligt brugt nødvendige cross-browser-metoder, hvis du kan teste på de ældre og andre vil jeg gerne vide det ...
mvh jes
<html><head> <META NAME="Generator" CONTENT="Stone's WebWriter 3.5"> <!-- Virker i IE6, men ikke i Stone's interne --> <script LANGUAGE="javascript" TYPE="text/javascript"> 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;} 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){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; } return true; } </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>
Testet og fundet i orden i IE 5.5. Jeg er imponeret over, at du gad køre den helt derud. But then again, det kunne jeg nok også selv have fundet på, når først jeg blev grebet af det.
For lige at være sikker på, at jeg har forstået flowet i scriptet; Har jeg ret i, at jeg ved at tilføje yderligere cases vil kunne mindske de tilladte årstal? Fx hvis jeg ikke ønsker datoer længere tilbage end 1900 eller senere end i år (fødselsdatoer)?
Pointene er absolut velfortjent, og måske nok en kende i underkanten.
Jeg har arbejdet lidt videre med din løsning og har lavet følgende justeringer: - Jeg har lukket for muligheden for at taste 00 som dato eller måned. - Jeg har kun tilladt årstal mellem 1900 og 2003, da det er det jeg skal bruge.
Jeg kunne dog godt tænke mig at slutårstallet (2003) tager udgangspunkt i det aktuelle årstal, så det bliver tilladt at taste 2004 den 1. januar 2004.
Mit tilpassede script er nedenfor.
<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)); if (yyyy>2003){repeatRemove++;return false;} //Tillader højst 2003 som årstal. break; } return true; } //Script til inputmaske for datofelt. SLUT </SCRIPT>
Så lykkedes det mig at få scriptet til at tage udgangspunkt i det aktuelle årstal. Jeg tror ikke at jeg kan komme på flere gode ideer mht. dette spørgsmål, så tak for hjælpen.
Scriptdelen af løsningen (input feltet som tidligere angivet af 'roenving'): -------------------------------------
<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) var curDate = new Date();
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: var y = parseInt(newVal.substring(6)); var cy = curDate.getFullYear().toString().substr(0,1); if (charCode<49 || y>cy){repeatRemove++;return false;} //Tillader 1 og 2 som første tal i årstal break; case 7: var yy = parseInt(newVal.substring(6)); var cyy = curDate.getFullYear().toString().substr(0,2); if (yy<19 || yy>cyy){repeatRemove++;return false;} //Sammenligner to først tal break; case 8: var yyy = parseInt(newVal.substring(6)); var cyyy = curDate.getFullYear().toString().substr(0,3); if (yyy>cyyy){repeatRemove++;return false;} //Sammenligner tre første tal break; case 9: var yyyy = parseInt(newVal.substring(6)); if (yyyy>curDate.getFullYear()){repeatRemove++;return false;} //Tillader højst 2003 som årstal. break; } return true; } //Script til inputmaske for datofelt. SLUT </SCRIPT>
case 9: var yyyy = parseInt(newVal.substring(6)); var thisYear = new Date().getFullYear(); if (yyyy>thisYear){repeatRemove++;return false;} //Tillader højst i år som årstal. }
du kunne jo også indføje en egentlig validering :-)
case 9: var yyyy = parseInt(newVal.substring(6)); var thisYear = new Date().getFullYear(); if (yyyy>thisYear){repeatRemove++;return false;} //Tillader højst 2003 som årstal. suppliedDate = new Date(yyyy,mm,dd); if (suppliedDate.getFullYear()!=yyyy||suppliedDate.getMonth()!=mm||suppliedDate.getDate()!=dd){repeatRemove++;return false;}//Egentlig dato-validering }
Jeg har justeret lidt i det tidligste tilladte årstal. Jeg indtaster årstallet, og klipper det op på samme måde som for det aktuelle årstal. Eneste forskel er at der skal sammenlignes den anden vej (ikke mindre end)
var y = parseInt(newVal.substring(6)); var cy = curDate.getFullYear().toString().substr(0,1); if (charCode<49 || y>cy){repeatRemove++;return false;} //Tillader 1 og 2 som første tal i årstal
var cy = curDate.getFullYear().toString().charAt(0); if (charCode<49 || (charCode-48)>cy){repeatRemove++;return false;} //Tillader 1 og 2 som første tal i årstal
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.