Avatar billede andersasp Nybegynder
08. maj 2008 - 12:47 Der er 13 kommentarer og
1 løsning

Validere på dato

Hejsa,

Jeg har fundet dette rigtig gode script som validerer på dato, men nu vil jeg gerne have denne validering på 2 felter istedet for ét.. og det ved jeg ikke lige hvordan man går???

Pstartdate    ' virker nu
Penddate      ' virker ikke

<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=6000;

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.formforum.Pstartdate
    if (isDate(dt.value)==false){
        dt.focus()
        return false
    }
    return true
}

</script>
Avatar billede w13 Novice
08. maj 2008 - 12:52 #1
Du kan vel bruge denne i stedet. :)

<script type="text/javascript">
function validateDate(o){
    if(!o.value.match(/^(3[01]|[012]\d)[\-\/\.](1[012]|0\d)[\-\/\.]\d{1,4}$/gi)){
    o.focus();
    return false
    }
    return true
}

function ValidateForm(){
    var dt=document.formforum.Pstartdate;
    var dt2=document.formforum.Pstartdate2;
    if(validateDate(dt)&&validateDate(dt2)return false;
    return true
}
</script>

Her har jeg kaldt det andet felt document.formforum.Pstartdate2 men det kan du jo bare rette. Det ku' være, det hedder document.formforum.Pslutdate2
Avatar billede roenving Novice
08. maj 2008 - 12:57 #2
-- du kan da bare fordoble i validateForm-funktionen:

function ValidateForm(f){
    var dt=f.Pstartdate;
    if (isDate(dt.value)==false){
        dt.focus()
        return false
    }
    var dt=f.Penddate;
    if (isDate(dt.value)==false){
        dt.focus()
        return false
    }
    return true
}

</script>

-- bortset fra det, ser det ud til at være et oldgammelt script, det er meget nemmere at validere datoen via et Date-objekt:

function isDate(txt){
  if(!txt.match(/^\d\d[-\/.]\d\d[-\/.]\d{4}/))
    return false;//tillader kun to-cifrede dag og måned, men både -, / og . som deler
  var d = txt.split(/[-\/.]/);
  dato = new Date(d[2],d[1]-1,d[0]);
  return d[0] == dato.getDate() && d[1]-1 == dato.getMonths() && d[2] == dato.getFullYear();
}
Avatar billede roenving Novice
08. maj 2008 - 12:58 #3
>>w13

-- din regexp tillader også 00-00-2008 ?-)
Avatar billede w13 Novice
08. maj 2008 - 13:29 #4
Gør den? ^o) Nå, men det er jo også min yndlingsdato!
Avatar billede roenving Novice
08. maj 2008 - 13:33 #5
-- og sjovt nok også 00.00/0 !-)
Avatar billede roenving Novice
08. maj 2008 - 13:35 #6
-- og jeg havde en lille tavetosse, det hedder jo .getMonth() !o]
Avatar billede andersasp Nybegynder
08. maj 2008 - 14:16 #7
Hej Tusinde tak for jeres svar,

jeg vil da meget gerne bruge et bedre script, hvis muligt:)
Jeg kan ikke få W13´s til at virke og får denne fejl:

Error: Expected ')'

og hvis jeg prøver at indsætte:

<script type="text/javascript">
function isDate(txt){
  if(!txt.match(/^\d\d[-\/.]\d\d[-\/.]\d{4}/))
    return false;//tillader kun to-cifrede dag og måned, men både -, / og . som deler
  var d = txt.split(/[-\/.]/);
  dato = new Date(d[2],d[1]-1,d[0]);
  return d[0] == dato.getDate() && d[1]-1 == dato.getMonths() && d[2] == dato.getFullYear();
}
</script>

Hvor jeg så ændrer form til:  onSubmit="return isDate()"

Beklager hvis det lyder dumt, men er meget nybegynder i java
Avatar billede andersasp Nybegynder
08. maj 2008 - 14:17 #8
Ups ja hvis jeg indsætter:
<script type="text/javascript">
function isDate(txt){
  if(!txt.match(/^\d\d[-\/.]\d\d[-\/.]\d{4}/))
    return false;//tillader kun to-cifrede dag og måned, men både -, / og . som deler
  var d = txt.split(/[-\/.]/);
  dato = new Date(d[2],d[1]-1,d[0]);
  return d[0] == dato.getDate() && d[1]-1 == dato.getMonths() && d[2] == dato.getFullYear();
}
</script>

så sker der ikke noget, ligegyldigt hvad jeg smider ind i felterne! ???
Avatar billede roenving Novice
08. maj 2008 - 14:27 #9
<form ... onsubmit="return ValidateForm(this)">

<script type="text/javascript">
function ValidateForm(f){
    var dt=f.Pstartdate;
    if (!isDate(dt.value)){
        dt.focus()
        return false
    }
    var dt=f.Penddate;
    if (!isDate(dt.value)){
        dt.focus()
        return false
    }
    return true
}
function isDate(txt){
  if(!txt.match(/^\d\d[-\/.]\d\d[-\/.]\d{4}/))
    return false;//tillader kun to-cifrede dag og måned, men både -, / og . som deler
  var d = txt.split(/[-\/.]/);
  dato = new Date(d[2],d[1]-1,d[0]);
  return d[0] == dato.getDate() && d[1]-1 == dato.getMonths() && d[2] == dato.getFullYear();
}
</script>
Avatar billede roenving Novice
08. maj 2008 - 14:29 #10
Argh,

  return d[0] == dato.getDate() && d[1]-1 == dato.getMonth() && d[2] == dato.getFullYear();
}
</script>
Avatar billede andersasp Nybegynder
08. maj 2008 - 15:04 #11
den validerer stadig ikke?

<form name="formforum" method="post" action="insertnews.asp" onsubmit="return ValidateForm(this)">
Avatar billede roenving Novice
08. maj 2008 - 15:13 #12
Det virker ganske udmærket hos mig:

<form ... onsubmit="return ValidateForm(this)">

Startdato: <input type="text" name="Pstartdate"><br>
Slutdato: <input type="text" name="Penddate"><br>
<input type="submit" value="Valider datoer">
</form>

<script type="text/javascript">
function ValidateForm(f){
    var dt=f.Pstartdate;
    if (!isDate(dt.value)){
        alert("Startdatoen er i forkert format eller ikke eksisterende !-)");
        dt.focus();
        return false;
    }
    var dt=f.Penddate;
    if (!isDate(dt.value)){
        alert("Slutdatoen er i forkert format eller ikke eksisterende !-)");
        dt.focus();
        return false;
    }
    return true
}
function isDate(txt){
  if(!txt.match(/^\d\d[-\/.]\d\d[-\/.]\d{4}$/))
    return false;//tillader kun to-cifrede dag og måned, men både -, / og . som deler
  var d = txt.split(/[-\/.]/);
  dato = new Date(d[2],d[1]-1,d[0]);
  return d[0] == dato.getDate() && d[1]-1 == dato.getMonth() && d[2] == dato.getFullYear();
}
</script>
Avatar billede andersasp Nybegynder
08. maj 2008 - 15:40 #13
Sådan, det var mig der havde indsat der forkert.. beklager... jeg har brugt dit roenving, tusinde tak.. så du må lige smide et svar :)
Avatar billede roenving Novice
09. maj 2008 - 16:29 #14
Velbekomme '-)
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