Avatar billede stigc Nybegynder
14. november 2005 - 13:33 Der er 11 kommentarer og
1 løsning

Clientside datovalidering

Er der nogen her der besidder et rigtig godt datovalideringsscript. Formen er "dd-mm-yyyy" og der skal tages hensyn til skudår. Gerne et kort og præcist regulært udtryk.
Avatar billede milandt Nybegynder
14. november 2005 - 14:14 #1
client-side validering er helt fint, det sparer serveren for ressourcer, men husk at man kan slå javascript fra, og at server-side validering derfor altid skal findes - js validering eller ej.
Avatar billede milandt Nybegynder
14. november 2005 - 14:19 #2
måske kan du bruge dette:
http://www.smartwebby.com/DHTML/date_validation2.asp

======= JAVASCRIPT ========

<script language = "Javascript">
/**
* DHTML date validation script for dd/mm/yyyy. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
*/
// Declaring valid date character, minimum year and maximum year
var dtCh= "/";
var minYear=1900;
var maxYear=2100;

function isInteger(s){
    var i;
    for (i = 0; i < s.length; i++){ 
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag){
    var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){ 
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary (year){
    // February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
    for (var i = 1; i <= n; i++) {
        this[i] = 31
        if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
        if (i==2) {this[i] = 29}
  }
  return this
}

function isDate(dtStr){
    var daysInMonth = DaysArray(12)
    var pos1=dtStr.indexOf(dtCh)
    var pos2=dtStr.indexOf(dtCh,pos1+1)
    var strDay=dtStr.substring(0,pos1)
    var strMonth=dtStr.substring(pos1+1,pos2)
    var strYear=dtStr.substring(pos2+1)
    strYr=strYear
    if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
    if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
    for (var i = 1; i <= 3; i++) {
        if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
    }
    month=parseInt(strMonth)
    day=parseInt(strDay)
    year=parseInt(strYr)
    if (pos1==-1 || pos2==-1){
        alert("The date format should be : dd/mm/yyyy")
        return false
    }
    if (strMonth.length<1 || month<1 || month>12){
        alert("Please enter a valid month")
        return false
    }
    if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
        alert("Please enter a valid day")
        return false
    }
    if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
        alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
        return false
    }
    if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
        alert("Please enter a valid date")
        return false
    }
return true
}

function ValidateForm(){
    var dt=document.frmSample.txtDate
    if (isDate(dt.value)==false){
        dt.focus()
        return false
    }
    return true
}

</script>



======= HTML ========

<form name="frmSample" method="post" action="" onSubmit="return ValidateForm()">
                <p>Enter a Date <font color="#CC0000"><b>(mm/dd/yyyy)</b></font>
                  :
                  <input type="text" name="txtDate" maxlength="10" size="15">
                </p>
                <p>
                  <input type="submit" name="Submit" value="Submit">
                </p>
              </form>



======================

Formatet her er dd/mm/yyyy men du kan nok uden de større problemer rette det til dd-mm-yyyy. Jeg har testet det for skudår (29/02/2005 = invalid, 29/02/2004 = valid) men har ikke testet så meget..

Der er et lidt langt script dog..
Avatar billede skovenborg Nybegynder
14. november 2005 - 16:42 #3
roenving har lavet et rigtig smart et:
http://roenving.users.whitehat.dk/index.html?/WD3Input.html
Dette validerer datoen live, så man ikke kan indtaste andet en det valgte format
Avatar billede olebole Juniormester
14. november 2005 - 19:18 #4
<ole>

Man kan også sørge for, brugeren kun kan vælge ét format - og spare trafik samtidig:

<script type="text/JavaScript">
function getOption(val, txt) {
    var oTxt, oOpt = document.createElement("option");
    oTxt = document.createTextNode(txt);
    oOpt.setAttribute("value", val);
    oOpt.appendChild(oTxt);
    return oOpt;
}
window.onload = function() {
    var thisYear, oDato, oMnd, oYear, oOpt, oDate = new Date();
    thisYear = oDate.getFullYear();
    oDato = document.getElementById("dato");
    oMnd = document.getElementById("mnd");
    oYear = document.getElementById("aar");
   
    for (var i=1; i<32; i++) oDato.appendChild(getOption(i,i));
    for (var i=1; i<13; i++) oMnd.appendChild(getOption(i,i));
    for (var i=thisYear-80; i<=thisYear; i++) {
        oOpt = getOption(i,i);
        oYear.appendChild(oOpt);
        if (i==thisYear-20) oOpt.setAttribute("selected", "selected");
    }
}
</script>

<select id="dato">
    <option value="-1">Dag</option>
</select>
<select id="mnd">
    <option value="-1">Mnd</option>
</select>
<select id="aar" style="width:60px;">
    <option value="-1">År</option>
</select>

/mvh
</bole>
Avatar billede roenving Novice
14. november 2005 - 19:53 #5
-- og jeg har på en regexp-eksempelside set en regexp, som validerede en dato vha. en 300 tegn lang expression, så den korte og præcise skal du nok ikke regne med at finde ...

-- en standard javascript-validering konverterer datoen til et Date-objekt, hvor man så kontrollerer, at datoen stadig er den samme (for et js Date-object vil bare konvertere en ugyldig dato til den, der giver mening, f.eks. bliver 32/12-2005 til 1/1-2006 !-)

Så en funktion kunne se sådan ud:

function validDate(d){
  var dParts = d.split("-");
  var dato = new Date(+dParts[2], +dParts[1]-1, +dParts[0]);
  return dato.getFullYear() == +dParts[2] && dato.getMonth()+1 == +dParts[1] && dato.getDate() == +dParts[0];
}
Avatar billede stigc Nybegynder
19. december 2005 - 21:08 #6
Tak for svarene. Nogen der vil have point?
Avatar billede roenving Novice
20. december 2005 - 02:07 #7
Hvem ?-)
Avatar billede stigc Nybegynder
20. december 2005 - 17:47 #8
ja, fx syntes jeg dit indlæg var udemærket. Læg et svar.
Avatar billede roenving Novice
21. december 2005 - 12:51 #9
Oki, men måske skulle du også vente på de andre '-)
Avatar billede milandt Nybegynder
21. december 2005 - 16:38 #10
Det er ok, du søgte et "et kort og præcist regulært udtryk" så roenvings svar må siges at være det "rigtige/bedste/etc..".

Så længe du kom videre - det er det vigtigste.
Avatar billede roenving Novice
21. december 2005 - 16:42 #11
-- men der er jo rigeligt at dele ud af !-)
Avatar billede roenving Novice
24. maj 2006 - 14:13 #12
-- og tak for point ;~}
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