Avatar billede i-mox Nybegynder
22. juli 2005 - 12:10 Der er 8 kommentarer og
1 løsning

Generisk validering

Hejsa.

Jeg har en formular med virkelig mange felter. Der er dog en række fællesnævnere for alle felterne, nemlig deres navngivning. Felterne er f.eks. navngivet med strXXXX eller intXXXX for henholdsvis strenge eller heltal.

Strenge må i alle tilfælde kun være 255 tegn lange, og heltal skal selvsagt være heltal.

Der er én undtagelse, nemlig et felt der hedder strKommentarer, som er et notatformat felt, og dette skal ikke valideres - det bliver gjort serverside senere. Selve formen, som felterne er i, har ikke et id nummer, men kan tilgåes med document.forms[0]

Jeg havde forestillet mig noget der minder om følgende mockcode:

For hver element i formularen gør følgende
  Find type på element

  Hvis type er str og ikke strKommentar
      Valider max 255 tegn
 
  Hvis type er int
      Valider heltal

Næste

Det ville i hvertfald, give god mening, men jeg er ikke så skide god til javascript. Er der nogen der har et eller andet på lager, der kan klare dette let og smertefrit?

Dbh.
Mads
Avatar billede softspot Forsker
22. juli 2005 - 13:00 #1
Det kunne være en funktion noget lign. denne her (der med sikkerhed kan laves mere fiks):

function validateForm()
{
  var bValid = true;
  for(var i = 0; i < document.forms[0].elements.length; i++)
  {
    if(document.forms[0].elements[i].name.substr(0,3) == "str")
    {
      if(document.forms[0].elements[i].name != "strKommentar")
      {
        bValid = bValid && document.forms[0].elements[i].value.length < 256;
      }
    }
    else if(document.forms[0].elements[i].name.substr(0,3) == "int")
    {
      // her bør der laves en regular expression for at teste om der er
      // andet end tal i feltet, men jeg klarer det lige med denne
      // fattigmandsmetode, hvor jeg sammenligner resultatet af parseInt
      // med indholdet af feltet (og isNaN)...
      var iVal = parseInt(document.forms[0].elements[i].value);
      bValid = bValid
            && !isNaN(iVal)
            && document.forms[0].elements[i].value != iVal;
    }
  }

  return bValid;
}
Avatar billede softspot Forsker
22. juli 2005 - 13:02 #2
CRAP! Sammenligningen for numeriske værdier skal naturligvis se således ud:

bValid = bValid
      && !isNaN(iVal)
      && document.forms[0].elements[i].value == iVal.toString();

altså lighed med feltets indhold for iVal og ikke ulighed som i første forsøg...
Avatar billede i-mox Nybegynder
22. juli 2005 - 13:09 #3
Super! Tjekker lige..
Avatar billede i-mox Nybegynder
22. juli 2005 - 13:11 #4
Det virker perfekt!

Tusind tak for hjælpen. Smider du et svar?
Avatar billede softspot Forsker
22. juli 2005 - 13:15 #5
Glad for at det funker :)
Avatar billede roenving Novice
22. juli 2005 - 13:15 #6
Med en monster-formular ville jeg nok sørge for at komme men en meddelelse, som fortalte hvor mange fejl, der var, og sætte fokus på det første felt, hvor der var en fejl, f.eks. således:

function valider(f){
  var flt = null, e = f.elements, msg = "";
  for(i=0;e.length>i;i++){
    if(e[i].name.indexOf('int')==0){
      if(!e[i].value.match(/^\d+$/){
        msg += "\t" + e[i].name + " må kun indeholde tal\n";
        if(!flt)flt = e[i]
      }
    }else if(e[i].name.indexOf('strK')==-1 && e[i].name.indexOf('str')==0){
      if(!e[i].value.match(/^.{1,255)$/){
        msg += "\t" + e[i].name + " skal indeholde 1 - 255 tegn\n";
        if(!flt)flt = e[i]
      }

    }
  }
  if(flt){
    alert('Der er fejl i formen, følgende felter indeholder fejl:\n'+msg);
    flt.focus();
    return false;
  }
  return true;
}
Avatar billede roenving Novice
22. juli 2005 - 13:16 #7
Kaldet skal så komme fra onsubmit på formen:

<form ... onsubmit="valider(this);">
Avatar billede i-mox Nybegynder
22. juli 2005 - 13:25 #8
Ja. Det er også det jeg arbejder på nu - Det ville klart være mest bruger venligt :-)

Du får også tusind tak for hjælpen!
Avatar billede roenving Novice
22. juli 2005 - 13:33 #9
-- og en bedre måde at teste tekst-inputs vil nok være at sige, at de skal starte med et bogstav eller tal:

      if(!e[i].value.match(/^[\wæøå].{0,254)$/i){
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