Avatar billede melieha Nybegynder
04. januar 2007 - 09:48 Der er 4 kommentarer og
1 løsning

Validere X inputfelter

Hejsa.

I forbindelse med noget dataindtastning på en hjemmeside vil jeg gerne validere inputtet FØR det bliver sendt videre (Og selvfølgelig også efter, men det har jeg styr på).
Jeg vil gøre det så "rigtigt" som muligt, da lignende validering sikkert skal bruges mange steder.

"Problemet" kommer så i at brugeren selv kan tilføje nye felter, så der kan være alt imellem 1 og x datofelter der skal valideres. Udover datofelter er der tekst og tal felter som jeg også godt kunne tænke mig at validere.
Hvordan får jeg scriptet til at løbe hver enkelt felt igennem, indenfor hver sin "kategori".

Datofelterne kommer til at hedde, "dato0", "dato1", "dato2".... og ligeledes vil de andre felter hedde "x0", "x1", "x2"....
Jeg fandt et lækkert dato-valideringsscript, som sørgede for at man hverken kunne skrive den 29. februar (Pånær de rigtige år), eller andre af de gængse fejl: http://www.smartwebby.com/DHTML/date_validation2.asp
Så vidt jeg kan se, BURDE man jo bare kunne lave en løkke i "ValidateForm" som løber input-felterne igennem og indsætter et tal bagefter "dato", men jeg har bare ikke selv kunnet finde frem til en løsning.

På forhånd tak :)
Avatar billede crazysnap Seniormester
04. januar 2007 - 10:20 #1
Hej melieha,

Du kan fint bare køre dato felterne igennem på følgende vis og kalde en valideringsmetode på dem for hvert felt:


function validateDatoer()
{
  var i;
  for(i = 0; i < AntalDatoer; i++)
  {
      //Hent et dato-felt
      var tempDatoFelt = document.getElementById("dato" + i);

      //Kald metoden som validerer et enkelt felt (returnerer true hvis
      //feltet er udfyldt korrekt og ellers false)
      if(!ValidateDatoFelt(tempDatoFelt))
      {
          //Feltet indeholdt en invalid streng
          //Indsæt kode til at håndtere dette

          alert("dato" + i + " feltet er ikke udfyldt korrekt");
      }
  }
}


- Snap
Avatar billede mclemens Nybegynder
04. januar 2007 - 13:01 #2
... Og hvis du ikke kender antal datoer [ "Problemet" kommer så i at brugeren selv kan tilføje nye felter, så der kan være alt imellem 1 og x datofelter der skal valideres ]

Kan du loope sådan her:

function valider(){
  f=document.formularnavn;
  for(i=1;f["dato"+i];i++){
    // scriptet til at validere indsættes her
  }
}

Eksempel:





<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="content-type" content="text/html; charset=iso-8859-1"><title>Ingen titel</title><meta name="robots" content="index, follow">

<script type="text/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 f=document.frmSample;
  for(var i=1;f["dato"+i];i++){

    if (isDate(f["dato"+i].value)==false){
      f["dato"+i].focus();
      return false
    }
 
  }
return true
}




</script>

</head><body>

<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="dato1" maxlength="10" size="15">
                  <input type="text" name="dato2" maxlength="10" size="15">
                  <input type="text" name="dato3" maxlength="10" size="15">
                  <input type="text" name="dato4" maxlength="10" size="15">
                  <input type="text" name="dato5" maxlength="10" size="15">
                </p>
                <p>
                  <input type="submit" name="Submit" value="Submit">
                </p>
              </form>

</body></html>
Avatar billede mclemens Nybegynder
04. januar 2007 - 13:06 #3
Og hvis datoer ikke er fortløbende nummerede kan du i ovenstående eksempel prøve at rette

function ValidateForm(){

  var f=document.frmSample;
  for(var i=1;f["dato"+i];i++){

    if (isDate(f["dato"+i].value)==false){
      f["dato"+i].focus();
      return false
    }

  }
return true
}




til:



function ValidateForm(){

  var f=document.frmSample;
  elms=f.getElementsByTagName("input");
  for(i=0;i<elms.length;i++){
    if(elms[i].name.indexOf("dato")==0){
    if (isDate(elms[i].value)==false){
      elms[i].focus();
      return false
    }
    }
  }
return true
}
Avatar billede melieha Nybegynder
04. januar 2007 - 13:29 #4
Wow, svarene er ikke blevet dårligere siden sidst jeg kiggede herinde.
mclemens løsning var jo bare 100% som jeg ønskede :) Så points til dig og en kæmpe tak! Jeg gir en øl i lufthavnen.

Tak til jer begge for indsatsen :)
Avatar billede mclemens Nybegynder
04. januar 2007 - 13:36 #5
Velbekom, 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