Avatar billede volstrup Nybegynder
18. marts 2000 - 17:08 Der er 29 kommentarer

Lave flere felter i form...

Hej,
jeg har brug for, uden at skulle reloade min side, at kunne tilføje flere
input-/text-felter i min form.
Disse ekstra input-felter fungerer efter en bestemt nummerering,
eksempelvis:

<input type="text" name="input01">
<input type="text" name="input02">
<input type="text" name="input03">
etc...

De skal alle indsættes efter hinanden på siden, og de eksisterende felter må
ikke miste deres indtastede værdier. Det kunne selvfølgelig gøres med
'submit' i en form, da jeg arbejder med php, men det ville jeg helst være
fri for!
Desværre er jeg ikke særlig god til denne slags javascript, jeg har mere
beskæftiget mig med at lave noget tidsbestemt, eller noget url-skiftning i
frames.
Avatar billede nielslbeck Nybegynder
19. marts 2000 - 00:36 #1
Følgende kode giver en side, som, så vidt jeg har forstået, opfylder dine betingelser:


<HTML>
<Head>
<Script Language=JavaScript>
<!--

// Max antal indtastningsfelter:
max = 5;

function showOrHide(nr) {
for (var x = 1; x <= max; x++) {
  if (x <= nr) {
  document.all["nr"+x].style.display="";
  }
  else {
  document.all["nr"+x].style.display="none";
  }
}
}

-->
</Script>
</Head>
<Body>

<Form Method=Post Action=dinfil.php>
<Table>
<!-- Lav en <Option Value=*tal*>*tal* for hvert indtastningsfelt -->
<TR><TD>Antal:<TD><Select onChange="showOrHide(this.value)"><Option Value=1>1<Option Value=2>2<Option Value=3>3<Option

Value=4>4<Option Value=5>5</Select>
<!-- Lav en linie som nedenstående for hver indtastningsfelt -->
<TR ID=nr1><TD>Nr1:<TD><Input Type=Text Name=input1>
<TR ID=nr2 Style="display: none"><TD>Nr2:<TD><Input Type=Text Name=input2>
<TR ID=nr3 Style="display: none"><TD>Nr3:<TD><Input Type=Text Name=input3>
<TR ID=nr4 Style="display: none"><TD>Nr4:<TD><Input Type=Text Name=input4>
<TR ID=nr5 Style="display: none"><TD>Nr5:<TD><Input Type=Text Name=input4>
<TR><TD><TD><Input Type=Submit Value=Submit>
</Table>
</Form>

</Body>
</HTML>


Jeg håber du kan bruge svaret. Ellers må du jo lige skrive!
Avatar billede volstrup Nybegynder
19. marts 2000 - 01:01 #2
Det ser delvist korrekt ud...
Men det virker ikke i Netscape (og jeg kan jo ikke bare regne med at folk som bruger netscape ikke går ind på siden), desuden skulle siden være forberedt på uendelig mange felter, man skal blot trykke på en knap, så kommer der et nyt felt!
Det du (nielslbeck ) har lavet, er lavet på en måde, så der SKAL indtastes et max, hvilket ikke er ønskværdigt...
Håber at jeg er til at forstå.

mvh Jacob Volstrup
Avatar billede volstrup Nybegynder
19. marts 2000 - 01:04 #3
...Desuden opstår der en masse javascript-fejl i netscape ('max not defined')...

mvh Jacob Volstrup
Avatar billede nielslbeck Nybegynder
19. marts 2000 - 01:54 #4
Det er helt korrekt at Netscape ikke helt forstår JavaScript på samme måde som Internet Explorer, og der derfor kommer en masse fejlmeddelelser. Jeg valgte dog at koncentrere mig om IE, da det helt klart er den mest benyttede browser i Danmark. Nu har jeg ikke lige lyst til at skulle teste siden i Netscape (ikke installeret), men det skulle ikke være særlig svært at gøre den "Netscape-kompatibel".

Det er rigtigt at der ikke kan oprettes "uendelig" mange felter, men det kan jeg heller ikke på nogen måde se muligt, hvis det skal være sådan, at indtastede værdier skal huskes når der ændres på antallet af felter. Jeg tror desværre ikke du kan gøre det på andre måder.

Undskyld jeg spørger, men hvad skal du benytte siden til (det ville måske hjælpe lidt på mine ideer)? Må der slet ikke være en max.grænse?
Avatar billede volstrup Nybegynder
19. marts 2000 - 12:13 #5
...tænke tænke...

Det skal bruges på en side med snydekoder... Dvs. at folk skal kunne tilføje så mange koder som muligt, og dette kan variere fra 3 - 80 stks.!

Men jeg mener stadig at det andet bør være muligt! Ved blot ikke hvordan

mvh Jacob Volstrup
Avatar billede nielslbeck Nybegynder
19. marts 2000 - 13:21 #6
Hvis ikke du kan bruge den metode jeg har brugt i eksemplet, så tror jeg desværre ikke der er nogen der kan hjælpe dig. Du kan jo ikke bare oprette et antal inputbokse midt i det hele. På de sider jeg kender, hvor der er mulighed for flere inputbokse, skal man vælge et antal inputfelter og trykke submit. Så er det her da smartere! Jeg ved faktisk slet ikke om det kan lade sig gøre, at lave det samme trick i Netscape, men det kunne jeg ikke forestille mig. Sorry...
Avatar billede volstrup Nybegynder
19. marts 2000 - 13:27 #7
HVis man nu kædede det sammen med nogle cookies... men det kan vel kun skrives/læses ved reload, så...

mvh Jacob Volstrup
Avatar billede nielslbeck Nybegynder
19. marts 2000 - 13:50 #8
Nej, cookies kan også læses af et JavaScript! Men hvad skulle det hjælpe?
Avatar billede volstrup Nybegynder
19. marts 2000 - 13:56 #9
aner det ikke, jeg har endnu ikke arbejdet specielt meget med cookies

Jeg har tidligere sat en indkøbskurv op, som netop brugte javascript og cookies. Den laver en fast procedure for hver ny vare...

mvh Jacob Volstrup
Avatar billede hatecaps Nybegynder
20. marts 2000 - 00:11 #10
hva siger du til at bruge frames ? så kan du gemme allerede udfyldte felter samt antal felter i frames siden, og reloade den enkelte side, og derved bygge den op med endnu et felt hver gang
Avatar billede volstrup Nybegynder
20. marts 2000 - 00:25 #11
det er vist egentlig sådan den side jeg administrerer med indkøbskurv, fungerer... jeg ville blot så gerne kunne gøre det uden at skulle bruge frames

Er det helt umuligt?

mvh Jacob Volstrup
Avatar billede hatecaps Nybegynder
20. marts 2000 - 11:26 #12
du kan også bruge perl/CGI, hvis du har mulighed for det på din server..
Avatar billede nielslbeck Nybegynder
20. marts 2000 - 11:57 #13
hatecaps>> Ja okay, men så skal man jo også trykke submit...
Avatar billede hatecaps Nybegynder
20. marts 2000 - 17:02 #14
ikke nødvendigvis, nielsbeck, man kan checke i onblur på de forskellige inpuit-felter om det er nødvendigt at reloade siden automatisk ;-)
Avatar billede nielslbeck Nybegynder
21. marts 2000 - 06:43 #15
hatecaps>> ja ja, men det er da det samme! Det vigtige er vel, at brugeren er fri for, at hente data fra serveren!
Avatar billede volstrup Nybegynder
21. marts 2000 - 18:21 #16
NETOP!!!

den side hvor jeg søger det til, har jeg mulighed for at lave det ved hjælp af frames, men jeg har også gang i en anden side, hvor jeg regner med at kunne bruge det, men dén side bruger IKKE frames, så...

mvh Jacob Volstrup
Avatar billede hatecaps Nybegynder
21. marts 2000 - 21:39 #17
umm, siger du NETOP til en frames løsning eller en >CGI løsning eller hva ? ,-)
Avatar billede volstrup Nybegynder
21. marts 2000 - 23:41 #18
Jeg siger at det skal kunne virke på en side UDEN frames, og uden at siden skal reloades!

Men jeg fornemmer at det ikke rigtig kan lade sig gøre.

mvh Jacob Volstrup
Avatar billede hatecaps Nybegynder
22. marts 2000 - 23:34 #19
hehe, blæse og have eml i munden , hvem vil ikke gerne kunne det ;-)
Avatar billede olebole Juniormester
23. marts 2000 - 02:43 #20
<ole>
hatecaps >> Som gammel didgeridoo-spiller ved jeg, man i hvert fald kan blæse og trække vejret samtidigt ;-)

Prøv denne mother-fucker:

<html>
<head>
<script language="javascript">
<!--

var n = document.layers;
var ie = document.all;

if (n) {
    visible='show';
    hidden='hide';
}else if (ie) {
    visible='visible';
    hidden='hidden';
}

var check = 0;
function chTex(){
    if (ie) {
        if (check==0) {
            lag1.innerHTML=mycont;
            document.all("lag1").style.visibility=visible; document.all("lag0").style.visibility=hidden;
            document.lag1.document.forms[1].elements[document.lag1.document.forms[1].length-3].focus();
            check = 1;
        }else{
            lag0.innerHTML=mycont;
            document.all("lag0").style.visibility=visible; document.all("lag1").style.visibility=hidden;
            document.lag0.document.forms[1].elements[document.lag0.document.forms[1].length-3].focus();
            check = 0;
        }
    }else if (n) {
        if (check==0) {
            document.lag1.document.write(mycont);
            document.lag1.document.close();
            document.layers["lag1"].visibility=visible; document.layers["lag0"].visibility=hidden;
            document.lag1.document.forms[0].elements[document.lag1.document.forms[0].length-3].focus();
            check = 1;
        }else{
            document.lag0.document.write(mycont);
            document.lag0.document.close();
            document.layers["lag0"].visibility=visible; document.layers["lag1"].visibility=hidden;
            document.lag0.document.forms[0].elements[document.lag0.document.forms[0].length-3].focus();
            check = 0;
        }
    }
}

var myValues = new Array();
var mycont = "";
var num = 0;
function makeCont(myNumber) {
        if (check==0) {
            lagId = 'lag0';   
        }else{
            lagId = 'lag1';
        }
    with (document[lagId].document.forms[num]) {
        for (i=0; i<length; i++){
            myValues[i] = elements[i].value;
        }
    }
    mycont = "<form name='minForm'>";
    for (j=0; j<myValues.length; j++) {
        k = j+1;
        if (k<10) {
            k = "0"+k;
        }
        mycont += "<input type='text' name='input"+k+"' value='"+myValues[j]+"'><br>";
    }
    k++;
    for (l=k; l<(parseInt(k)+parseInt(myNumber)); l++) {
        if (l<10) {
            l = "0"+l;
        }
        mycont += "<input type='text' name='input"+l+"'><br>";
    }
    mycont += "</form><br>";
    chTex();
    if (ie) {
        num = 1;
    }
}

//-->
</script>

<style type="text/css">
.lag      {position:absolute;
      left: 210;
          top: 10px;
          width: 180px;
          color: #000000;
          font-family: verdana, arial, helvetica;
          font-size: 10px;
          }

</style>
</head>

<body>
<p><a href="#" onclick="makeCont('3');">Lav 3 nye boxe her...</a></p>

<div id="lag0" style="z-index:0; visibility: visible" class="lag">
<br><form name="minForm">
<input type="text" name="input01"><br>
<input type="text" name="input02"><br>
<input type="text" name="input03"><br>
<input type="text" name="input04"><br>
</form>
</div>
<div id="lag1" style="z-index:0; visibility: hidden" class="lag">
</div>

</body>
</html>

Den fungerer X-browser. Jeg har testet på MacG3 med NS4.08 og IE4.5.
Der er ingen, der siger, det hele ikke kunne skrives lidt mere sexy, men her er det altså lige fra tegnebordet - mere for at vise, det KAN lade sig gøre ;-)
Der er en del mærkværdigheder i browsernes måde at fortolke forms i lag på (opdagede jeg...!), derfor vil den øvede JavaScripter nok undre sig over nogle af de ting, jeg skriver - men det er åbenbart nødvendigt!?!

Hovedideen er at lave to lag. Det ene indeholder en form med fire felter (det kunne være et hvilket som helst antal). Værdien af disse felter bankes ind i et array. Det andet lag er 'hidden'.
I det andet lag skrives en form med det antal elementer array'et indeholder - og med disse elementer som værdier. Formen kopieres med andre ord blot over i det andet lag. Inden den afsluttes med '</form>', skrives et antal nye felter - bestemt i funktions-kaldet. Til aller sidst gøres det første lag usynligt og det andet synligt.
Det samme kan så gentages den anden vej - over til det første lag, osv i én uendelighed.
Kunsten er bl.a. at kalde formen rigtigt...puha, den trak tænder ud...!
Man er åbenbart også nødt til at jonglere mellem to lag, da man øjensynligt ikke kan trække værdierne ud, gemme dem i et array og så skrive dem ind i samme lag i ét hug. Der sker mærkelige ting med hukommelsen...???

Du skal ændre visse steder i 'for' løkkerne, når du indsætter submitbutton eller andre form elementer. Hvis du ikke selv kan finde ud af det, må du gerne maile mig på:
oc@adr.dk

/VH
</bole>
Avatar billede volstrup Nybegynder
23. marts 2000 - 15:26 #21
Det virker næsten i netscape, men ikke i IE.
Og i netscape 'glemmes' indholdet i felterne også når der kommer nye felter til...
Jeg ser efter om jeg selv kan finde fejlen(e)

mvh Jacob Volstrup
Avatar billede olebole Juniormester
24. marts 2000 - 01:38 #22
Ehhh...På PC?
Hos mig (Mac) er det sådan, at du i IE kan kalde en 'forms[0]' og en 'forms[1]'. 'forms[1]' holder opdateringen, mens 'forms[0]' holder de gamle værdier. NS synes bare vi skal holde os til 'forms[0]'. Her kan der sikkert også gemme sig nogle mærkværdigheder i forhold til PC.
Så, hvis du kan finde ud af at få det til at funke på PC, må vi kunne skrive dem sammen.
Opgaven er under alle omstændigheder sjov, og løsningen kan bruges en masse andre steder - i lidt andre forklædninger.
Avatar billede olebole Juniormester
24. marts 2000 - 01:42 #23
PS: Det med, at jeg fokuserer den første af de tre nye boxe, skyldes bare, at IE ellers sætter curseren et weird sted på siden ;-)
Avatar billede olebole Juniormester
04. april 2000 - 09:33 #24
volstrup >> er du der...???
Avatar billede volstrup Nybegynder
04. april 2000 - 10:14 #25
ja ja...
...men jeg har ikke fået det til at virke :{

mvh Jacob Volstrup
Avatar billede olebole Juniormester
04. april 2000 - 11:10 #26
Hmmm...jeg prøver én af mine gamle studiekammerater fra SpaceInvaders...jeg vender stædigt tilbage ;-)
Avatar billede volstrup Nybegynder
04. april 2000 - 16:58 #27
Lyder godt!

Hvis det kommer til at virke helt som jeg gerne vil have det til, så tre-dobler jeg point'ene!

mvh Jacob Volstrup
UIN 4356912
Avatar billede nielslbeck Nybegynder
09. maj 2000 - 16:48 #28
Det ville nok være en god idé at afvise eller acceptere hvis du har fået svar på dit spørgsmål!
Avatar billede volstrup Nybegynder
10. maj 2000 - 16:22 #29
Det vil jeg gøre, og så igen vente på at der kommer nogle forslag... :(

mvh Jacob Volstrup
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