Avatar billede oergaard Nybegynder
04. november 2007 - 12:45 Der er 24 kommentarer og
1 løsning

Dynamisk valideringsscript

Jeg er i gang med at lave et valideringsscript. Jeg har tidligere lavet statiske valideringsscripts, som jeg har tilrettet hver gang jeg har, skulle bruge dem.

Hvis jeg f.eks. har nedenstående form.

<form name='expTest' onsubmit='valider(this); return false;'>
  <label>Fornavn: <input type='text' name='fornavn'></label><br />
  <label>Efternavn: <input type='text' name='efternavn'></label><br />
  <label>Fødselsdag: <input type='text' name='fødselsdag'></label><br />
  <input type='submit' value='Send' />
</form>

Funktionen valider() skal så kunne validere alle felterne... også hvis jeg tilføje et nyt felt i morgen.

Det må derfor være nødvendigt, at jeg i min funktionskald fortælle noget mere om de enkelte felter?

Håber der er nogen der kan hjælpe, da jeg ikke helt er med på den dynamiske del. :-)
Avatar billede oergaard Nybegynder
04. november 2007 - 13:35 #1
Hvis der er nogen der kan hjælpe mig med hvordan jeg sender et ukendt antal argumenter med til min funktion tror jeg at det vil hjælpe mig godt på vej...
(dermed ikke sagt, at jeg ikke skal bruge yderligere hjælp)
Avatar billede nwn Nybegynder
04. november 2007 - 14:44 #2
Avatar billede soerenlyn Nybegynder
04. november 2007 - 15:02 #3
Du kan løbe alle elementer i formen igennem således:

function valider(form){
  for(i=0;i<a.elements.length;i++){
      if(Test noget her){break;}
  }
  return true
}
Avatar billede soes Nybegynder
04. november 2007 - 17:22 #4
Hvis det blot er at validere at feltet er udfyldt så kan du bruge 'soerenlyn's forslag med en lille tilretning.

Hvis du vil lave en validering på om et givenet felt og så er f.eks. et tal så er du nok nød til at lave det statisk på en eller anden måde, evt. ved brug at en property liste.

validateFields = {'firstname' : 'string', 'lastname' : 'birthday', 'date'};

når du så kalder din valider funktion kan den se lidt anderledes ud.

function valider(sender) {
  var t = null;
  for (k in validateFields) {
      t = sender.getElementsByName(k);
      if (t.length == 1) {
        t = t[0];
        if (validateFields[k] == "string") {
            // hvis det er en streng der skal findes
            if (t.value == "")
              return false; // tester om der er noget indhold - kan gøres meget bedre med reg.exp
        } else if (validateFields[k] == "date") {
            // hvis det er en dato du skal validere
        } else {
            // alle vores stavefejl og dårlig gennemtænk kode
        }

      }
  }
  return true;
}

Ikke helt dynamisk, men selve def. af felterne er samlet et sted, hvilket kan hjælpe lidt på overskueligheden.

/ S. Søndergård
Avatar billede soes Nybegynder
04. november 2007 - 17:24 #5
wops, en mindre fejl når man lige lave det ud fra hukommelsen :o)

var validateFields = {'firstname' : 'string', 'lastname' : 'string', 'birthday' : 'date'};
Avatar billede roenving Novice
05. november 2007 - 00:42 #6
Et eksempel fra 'gamle dage': http://www.eksperten.dk/spm/544411 ...

-- hvis det lige er datoer, skal du selvfølgelig tilføje en dato-tingest til scriptet ...

-- og DreamWeaver har en standard-plugin, som vist kan det meste efter samme metode som soes viser !-)
Avatar billede oergaard Nybegynder
05. november 2007 - 11:02 #7
nwn> Dit link til HTML.DK vise hvad validering er og hvordan man lave en statisk validering, hvilket er måde jeg allerede lave mine valideringer på. Men tak for inputtet. :-)
Avatar billede oergaard Nybegynder
05. november 2007 - 12:19 #8
roenving> Det er er noget i den stil. Gider du knytter nogle kommentarer til scriptet, så jeg også lærer noget af det? :-)
Avatar billede oergaard Nybegynder
05. november 2007 - 12:21 #9
soes> Der er tale om forskellige typer af validering, såsom "skal være udfyldt", "skal være et tal", "må kun indeholde tegnene fra a-z" osv.
Avatar billede oergaard Nybegynder
06. november 2007 - 18:59 #10
roenving> jeg synes ikke rigtig, at jeg kan få dit eksembel til at fungere.
Avatar billede roenving Novice
09. november 2007 - 01:20 #11
I eksemplet skrives valideringsreglerne i et ekstra skjult felt, som navngives med val foranstillet det felts navn, der skal valideres ...

Formatet for valideringsreglerne er så "hovedregel(evt. minimum, evt. maximum)Felt-navn til meddelelser" ...

-- i scriptet er der kun lavet et begrænset antal regler, men taget ud fra de typiske eksempler, jeg er stødt på ...

-- hvis der er et felt, bruges split til at adskille reglerne, så de kan bruges til test af værdien i feltet, så man får op til tre forskellige værdier (og evt. et sigende navn !-), der kan holdes op mod felt-værdien og lave en fejlmeddelelse ...

-- hvis du har mere specifikke spørgsmål til scriptet er du ganske velkommen ...

-- og du kunne måske vise det, du har prøvet (f.eks. et link ?-)
Avatar billede oergaard Nybegynder
09. november 2007 - 07:29 #12
Uanset om valideringen er ok eller ej bliver min form sendt, hvilket jeg ikke kan forstå. Jeg har lavet min egen kode ud fra dit eks.
Avatar billede oergaard Nybegynder
09. november 2007 - 07:50 #13
<%@Language = VBScript%>
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="da">
  <head>
    <title>Dynamisk validering</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <script language="javascript" type="text/javascript">
      function valider(form) {
        var objForm = form.elements;
        for(i=0;objForm.length>i;i++) {
          var arrVal = new Array();
          arrVal = objForm[i].validering.split(";");
          switch(objForm[i].type) {
            case "text":
              for(j=0;arrVal.length>j;j++) {
                switch(arrVal[j].substring(0,3)) {
                  case "min":
                    minLen = arrVal[j].substring(3,arrVal[j].length);
                    valueLen = objForm[i].value.length;
                    if(valueLen<minLen) {
                      alert(objForm[i].fejl);
                    } else {
                      error = 0;
                    }
                  break;
                }
              }
            }
          }
        if(error==0) {
          form.submit();
        }
      }
    </script>
  </head>
  <body>
    <form id="minForm" method="post" action="../validering/" onsubmit="valider(this); return false">
      <label>Test 1: <input id="test1" name="test1" type="text" validering="min3;max5" fejl="Feltet test 1 skal udfyldes med minimum 3 tegn." /></label><br />
      <label>Test 2: <input id="test2" name="test2" type="text" validering="min5;max8" fejl="Feltet test 2 skal udfyldes med minimum 5 tegn." /></label><br />
      <input id="submit" type="submit" value="Send" />
    </form>
  </body>
</html>
Avatar billede roenving Novice
09. november 2007 - 14:58 #14
Tjah, den type validering kan simpelthen ikke bruges under xhtml strict/1.1, hvis man skal følge specifikationerne ...

-- men det er der heldigvis ingen browsere, der gør, de tolker det alle som voldsomt fejlfyldt html3.2/4.01 !-)

-- og der er en række uhensigtsmæssigheder, som tyder på, at du har kigget mere i html.dks validering end i min ...

Hvis du skal have fat i attributter med xhtml kan du _kun_ bruge .getAttribute, og uanset at du kan sætte attributter på, vil det ikke kunne valideres af w3c, hvis de står hard-coded, derfor ideen med de skjulte felter, som sikrer en vis fremadkompatibilitet ...

-- i xhtml bør du også få fat i defaultværdien af value, hvilket betyder, at det simpelthen ikke kan lade sig gøre at aflæse en værdi dynamisk, hvis du benytter denne eksperimentelle mark-up ...

Prøv f.eks.

<%@Language = VBScript%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">

<html>
  <head>
    <title>Dynamisk validering</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <script language="javascript" type="text/javascript">
      function valider(form) {
        var objForm = form.elements;
        for(i=0,im=objForm.length;im>i;i++) {
          var arrVal = new Array();
          arrVal = objForm[i].validering.split(";");
          switch(objForm[i].type) {
            case "text":
              for(j=0,jm=arrVal.length;jm>j;j++) {
                switch(arrVal[j].replace(/\d/g,"")) {
                  case "min":
                    minLen = arrVal[j].match(/\d+/)[0];
                    valueLen = objForm[i].value.length;
                    if(minLen>valueLen) {
                      alert(objForm[i].fejl);
                      objForm[i].focus();
                      return false;
                    }
                }
            }
          }
        }
        return true;
      }
    </script>
  </head>
  <body>
    <form id="minForm" method="post" action="../validering/" onsubmit="return valider(this);">
      <label for="test1">Test 1:</label> <input id="test1" name="test1" type="text" validering="min3;max5" fejl="Feltet test 1 skal udfyldes med minimum 3 tegn."><br>
      <label for="test1">Test 2:</label> <input id="test2" name="test2" type="text" validering="min5;max8" fejl="Feltet test 2 skal udfyldes med minimum 5 tegn."><br>
      <input id="submit" type="submit" value="Send">
    </form>
  </body>
</html>
Avatar billede oergaard Nybegynder
09. november 2007 - 19:45 #15
Der er et par ting jeg ikke forstår i din tilretning.
  * Hvorfor har du tilføjet "im" i  for(i=0,im=objForm.length;im>i;i++)... ?
  * Forstår ikke denne del af koden "switch(arrVal[j].replace(/\d/g,""))... ?
Avatar billede oergaard Nybegynder
09. november 2007 - 20:17 #16
Ydermere vil jeg gerne at den samme alle fejl i indtastningen.

Min plan med min kode var at den skulle samle alle fejlmeddelelserne i én msgBox
Avatar billede oergaard Nybegynder
09. november 2007 - 20:25 #17
samme = samler :-)
Avatar billede roenving Novice
10. november 2007 - 13:17 #18
OK, så er en afart af den kode, du viser bedre ...

1. im er tilføjet for ikke en masse gange at tage fat i objektet og så optælle dets elementer hver gang !-)

2. Udtrykket inde i switch-tingen stripper simpelthen tallene ud af feltnavnet ...

<%@Language = VBScript%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">

<html>
  <head>
    <title>Dynamisk validering</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <script language="javascript" type="text/javascript">
      function valider(form) {
        var objForm = form.elements, fjl = null, txt = "";
        for(i=0,im=objForm.length;im>i;i++) {
          if(objForm[i].type == "submit")
            break;
          var arrVal = objForm[i].validering.split(";");
          switch(objForm[i].type) {
            case "text":
              for(j=0,jm=arrVal.length;jm>j;j++) {
                switch(arrVal[j].replace(/\d/g,"")) {
                  case "min":
                    minLen = arrVal[j].match(/\d+/)[0];
                    valueLen = objForm[i].value.length;
                    if(minLen>valueLen) {
                      txt += "  - " + objForm[i].fejl +"\n\n";
                      if(!fjl)
                        fjl = objForm[i];
                    }
                }
            }
          }
        }
        if(fjl){
          alert("Der blev fundet følgende fejl i formularen:\n\n" + txt + "Ret venligst fejlen(e) og prøv igen !-)");
          fjl.focus();
          return false;
        }
        return true;
      }
    </script>
  </head>
  <body>
    <form id="minForm" method="post" action="../validering/" onsubmit="return valider(this);">
      <label for="test1">Test 1:</label> <input id="test1" name="test1" type="text" validering="min3;max5" fejl="Feltet test 1 skal udfyldes med minimum 3 tegn."><br>
      <label for="test1">Test 2:</label> <input id="test2" name="test2" type="text" validering="min5;max8" fejl="Feltet test 2 skal udfyldes med minimum 5 tegn."><br>
      <input id="submitKnap" type="submit" value="Send">
    </form>
  </body>
</html>
Avatar billede oergaard Nybegynder
12. november 2007 - 11:01 #19
roenving> du skriver d. 09/11-2007 14:58:16:
...Hvis du skal have fat i attributter med xhtml kan du _kun_ bruge .getAttribute, og uanset at du kan sætte attributter på, vil det ikke kunne valideres af w3c, hvis de står hard-coded, derfor ideen med de skjulte felter, som sikrer en vis fremadkompatibilitet...

Jeg har ikke noget i mod at lave om på min kode, så jeg i stedet bruger "hidden" felter. At jeg ikke gjorde det fra starten skyldes, at jeg ikke kunne gennemskue hvordan dette gjordes.

Hvis jeg f.eks. har et "hidden" felt med navnet "valTest1" kan jeg sagtens trække værdien "test1" ud af denne. Mit problem med dette er så, at jeg ikke ved hvordan jeg skal bruge denne variable til at henvise til feltet med navnet "test1".
Avatar billede roenving Novice
12. november 2007 - 13:51 #20
Navnet eller id'et ?-)

feltnavn = valideringsfelt.name.split("val")[1];

-- eller

feltnavn = valideringsfelt.name.replace("val","");
Avatar billede oergaard Nybegynder
12. november 2007 - 14:11 #21
Hvis jeg har følgende:
  <input type="text" name="test1">
  <input type="hidden" name="valTest1" value="min6">

I mit script trækker jeg valideringsfeltnavnet ud med
  feltnavn = valideringsfelt.name.substring(3,valideringsfelt.length).toLowerCase();

Jeg kan godt se, at jeg skal have kigget lidt på replace :-)

Men uanset metode, har jeg nu et variable, "feltnavn" med værdien "test1".

Hvordan bruger jeg denne variable til at trække data ud fra feltet "test1"??
Avatar billede roenving Novice
12. november 2007 - 14:30 #22
form.elements[feltnavn].value/.noget !-)
Avatar billede oergaard Nybegynder
15. november 2007 - 06:13 #23
roenving> smider du ikke et svar så du kan få nogle velfortjente point, som tak for hjælpen :-)
Avatar billede roenving Novice
15. november 2007 - 14:27 #24
Velbekomme '-)
Avatar billede roenving Novice
19. november 2007 - 07:59 #25
-- 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