Avatar billede farmer Nybegynder
16. januar 2003 - 23:24 Der er 11 kommentarer

teste vilkårligt antal inputfelter

Jeg har lige kastet mig over javascript, og har fundet mange gode svar her på eksperten til at komme godt i gang. Nu har jeg så løbet panden mod muren.

Jeg har en form, som kan have et vilkårligt antal input-felter. Felterne genereres dynamisk baseret på variablen 'number', et eks. med 'number=3' er som følger:

<input type='text' name='init1' value='en'>
<input type='text' name='init2' value='to'>
<input type='text' name='init3' value='tre'>


Når jeg submitter formen kører jeg dette script:

function validate_assignment(number)
{ x=document.addAssignment; //set path
  nbr=0; //set counter
  while(nbr<number)
  { nbr++;
    countInit='init'+nbr;
    alert(countInit);//test, virker
    y=x.countInit;
    alert(y);//fejler, er ikke et objekt!
    alert(y.value);//test, fejler
  }
}

Det er altså ved forsøget på at lave sætte countInit ind pathen kaldet 'y' at det fejler. Jeg ender med en path, som ikke peger på et objekt.

Nogle idéer??...
Avatar billede erikjacobsen Ekspert
16. januar 2003 - 23:29 #1
Prøv først at erstatte

    y=x.countInit;

med

    y=eval("x."+countInit);

Det er ikke den bedste løsning, men den der i første omgang er
bedst at blive klog af :)
Avatar billede farmer Nybegynder
17. januar 2003 - 00:00 #2
Smukt :-)

Det virker igen. Post et svar, så du kan få nogle point. Det er kun en del af et script, som jeg er ved at lave... med andre ord, jeg kommer nok tilbage igen snart.

G'nat
Avatar billede farmer Nybegynder
17. januar 2003 - 00:01 #3
Forresten. Kan du ikke forklare hvorfor det er sådan? Altså at 'eval' kan lave en korrekt peger til et objekt, hvor '+' bare giver en alm. streng?
Avatar billede erikjacobsen Ekspert
17. januar 2003 - 00:02 #4
Rolig nu. Vi er slet ikke færdige:

1) Kan du se hvad ideen i løsningen er?
2) Du skal have den "rigtige" måde at gøre det på. Men
  den får du først hvis vi lige klarer punkt 1 først.
Avatar billede erikjacobsen Ekspert
17. januar 2003 - 00:03 #5
Ok - prøv at erstatte

  y=eval("x."+countInit);

med

  z="x."+countInit,
  alert(z);
  y=eval(z);

og se hvad den udskriver. Eval er bare en funktion
der kan udregne en stump JavaScript den får med som
en streng
Avatar billede farmer Nybegynder
17. januar 2003 - 00:09 #6
Ja, jeg prøvede lige.

z er en steng som kun ligner en path til en objekt.
y er en path til et objekt

Sjovt, atdet er nødvendigt at udregne.
Avatar billede farmer Nybegynder
17. januar 2003 - 10:56 #7
Sådan. Så blev funktionen færdig.

Ved tjek på et vilkårligt antal input felter med name, hvor nr er fortløbende for det antal tripletter af inputfelter der er valgt (ass_init+nr, ass_title+nr, ass_expire+nr).

js-funktion:
function validate_assignment(number)
{ x=document.addAssignment; // set path
  nbr=0;
  while(nbr<number)
  { nbr++;
    init=eval('x.ass_init'+nbr);
    title=eval('x.ass_title'+nbr);
    expire=eval('x.ass_expire'+nbr);
    if((init.value!=""&&title.value=="")||(init.value==""&&title.value!=""))
    { alert('Enten ass_init eller ass_titel mangler.');
      return false;
    }
    if(init.value!=""&&title.value!=""&&expire.value=="Choose date  >>")
    // "Choose date  >>" er default, hvis dato ikke er valgt
    { alert('ass_expire mangler for assignment.');
      return false;
    }
  }
}

Jeg vil tjekke for, at både init og titel er udfyldt. Hvis de er tomme skal de overses. Hvis begge er fyldte skal der vælges en dato.

Det virker. Tak for hjælpen. Post et svar, og du skal få dine point.
Avatar billede farmer Nybegynder
17. januar 2003 - 11:02 #8
...forresten, du skrev, at det ikke var den bedste løsning med 'eval'. Er der en mere fornuftig måde, at gøre det samme på?
Avatar billede Slettet bruger
17. januar 2003 - 15:07 #9
Ja, brug:

init = x.elements["ass_init" + nbr];

osv. i stedet for eval.
Avatar billede farmer Nybegynder
17. januar 2003 - 15:20 #10
Kidoki.

Jeg skal holde det i mente. Det er godt at få at vide nu inden(!) jeg laver formvalidering for hele systemet.
Avatar billede erikjacobsen Ekspert
17. januar 2003 - 20:30 #11
Ja, det er nemlig den rigtige måde at gøre det på.
Eval er for langsom og "underlig".

Men du kan godt se at med

  y=x.countInit;

skal der være et felt der hedder countInit. Det er der jo ikke.
Men indeholder variablem countInit fx "feltnavn" vil

  "x."+countInit

blive til "x.feltnavn", og med en eval blive til det rigtige.
Men som sagt: en lidt snusket omvej,
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