Avatar billede lsskaarup Nybegynder
28. januar 2010 - 11:24 Der er 19 kommentarer og
1 løsning

Dynamisk variabel i feltnavn

Kan man kombinere en dynamisk variabel med et html feltnavn?

Jeg har en række felter, hvor den enste navnmæssig forskel er et afsluttende nummer f.eks. "_1" og "_2" osv.

Problemet er at antallet af felter også er dynamisk, så jeg kan ikke hardcode deres navne i scriptet.

I nedenstående er antal lig med det antal felter som jeg har, men da jeg også bruge det navnmæssigt, vil jeg gerne kunne kombinere denne variabel i html feltnavnet, hvis det kan lade sig gøre.

function beregnprocent(antal) {
  if (antal == 2) {
    document.ds.projektmedlem_antal_procent = "100";
  }
}
Avatar billede majbom Novice
28. januar 2010 - 12:10 #1
hvordan generer du elementerne nu?

hvordan er det dynamisk?

hvad bestemmer hvor mange felter der skal være?
Avatar billede showsource Seniormester
28. januar 2010 - 12:12 #2
I head delen af doc:

function add_fields(antal) {

var basenavn = 'felt_';

    if(antal > 0) {

    var ialt = 0;

    var ref = document.getElementById("formfelter");

        while (ref.firstChild) {
        ref.removeChild(ref.firstChild);
        }


      while(ialt < antal) {

      newDiv=document.createElement("div");
      newDiv.style.padding = "2px";
      ref.appendChild(newDiv);

        try {

        newElement=document.createElement("<input type='text' name='"+basenavn+ialt+"'>");

        } catch (e) {

        newElement=document.createElement("input");
        newElement.setAttribute("name", basenavn+ialt);
        newElement.setAttribute("type", "text");

        }

      ref.appendChild(newElement);


      ialt++;
      }


  }

}
</script>

I body indefor din form /form:

<div id="formfelter">&nbsp;</div>

<script type="text/javascript">
add_fields(5);
</script>
Avatar billede lsskaarup Nybegynder
28. januar 2010 - 13:38 #3
Showsource -> Det er ikke lige det jeg er ude efter. Din kode generere elementerne i javsscript, ikke sandt? Jeg har dem allerede, og der skal laves alt for meget om, til at jeg vil bruge den løsning, som den første.

Kan se jeg også fik beskrevet det lidt forkert, men den grundlæggende ide er dog ens. Men jeg uddyber lige for god orden skyld.

Jeg har følgende html/php kode, hvor mine problematiske felter/elementer bliver lavet. Elementernes nummerering i navngivning er så ud fra rækkenummeret, i dette tilfælde, hvor mange projektmedlemmer jeg har på en specifik sag.:

            <table width="100%" border="1" cellspacing="1" cellpadding="1" align="right">
                <?php
               
                if (isset($_GET['id']) && $_GET['id']) {
                  $pm = "SELECT * FROM projektmedlemmer AS pm
                            LEFT JOIN stamdata ON pm.stamdataID = stamdata.unique_id
                            WHERE tilbudID = '".$_GET['id']."'";
                    $pmsql = mysql_query("$pm") or die(mysql_error());
                    $counter = 1;
                    $antalPl = mysql_num_rows($pmsql);
                    if ($antalPl) {
                        while ($pmr = mysql_fetch_array($pmsql)) {?>
                <tr>
                    <td><?php if ($counter == 1) { echo "Projektansvarlig:"; } else { echo "Deltager:"; }?>
                    </td>       
                    <td>
                        <!-- Skjult felt indeholdende id i projektmedlemstabellen -->
                        <input type="hidden" readonly class="inputsmall" name="projektmedlem_<?php echo $counter; ?>_id" value="<?php echo $pmr['id']; ?>">
                        <!-- Skjult felt indeholdende medarbejderens unikke id fra stamdata tabellen -->
                        <input type="hidden" class="inputsmall" name="projektmedlem_<?php echo $counter; ?>_stamdataID" value="<?php echo $pmr['stamdataID']; ?>">
                       
                        <select name="projektmedlem_<?php echo $counter; ?>_pl" size="1" class="listform">
                            <option value=""></option>
                            <?php
                            reset($ENTREPRISE);
                            while (list ($key, $val) = each ($ENTREPRISE)) {
                                echo $val['navn'];
                                $select = '';
                                if ($key == $pmr['employee']) $select = ' selected';
                            ?>
                                <option value="<?php echo $key; ?>"<?php echo $select; ?>><?php echo $val['navn']; ?></option>
                            <?php
                            }
                            ?>
                        </select>           
                    </td>
                    <td><input type="text" class="inputextrasmall" name="projektmedlem_<?php echo $counter; ?>_forv_start" value="<?php echo sqltoalmdatetom($pmr['forv_start']); ?>"></td>
                    <td><input type="text" class="inputextrasmall" name="projektmedlem_<?php echo $counter; ?>_forv_slut" value="<?php echo sqltoalmdatetom($pmr['forv_slut']); ?>"></td>
                    <td><input type="text" class="inputextrasmall" id="2" name="projektmedlem_<?php echo $counter; ?>_procent" value="<?php echo $pmr['procent']; ?>" onchange="beregnprocent(<?php echo $antalPl;?>)"> %</td>
                </tr>
             
                <?php        //}
                            $counter++;
                        }
                    }
                ?>
                <tr>
                    <td></td>
                    <td>
                        <select name="projektmedlem_<?php echo $counter; ?>_pl" size="1" class="listform">
                            <option value=""></option>
                            <?php
                            reset($ENTREPRISE);
                            while (list ($key, $val) = each ($ENTREPRISE)) {
                                echo $val['navn'];
                                $select = '';
                                //if ($key == $pmr['employee']) $select = ' selected';
                            ?>
                                <option value="<?php echo $key; ?>"<?php echo $select; ?>><?php echo $val['navn']; ?></option>
                            <?php
                            }
                            ?>
                        </select>       
                    </td>
                    <td><input type="text" class="inputextrasmall" name="projektmedlem_<?php echo $counter; ?>_forv_start" value=""></td>
                    <td><input type="text" class="inputextrasmall" name="projektmedlem_<?php echo $counter; ?>_forv_slut" value=""></td>
                    <td><input type="text" class="inputextrasmall" name="projektmedlem_<?php echo $counter; ?>_procent" value=""> %
                        <input type="hidden" readonly class="inputextrasmall" name="counter" value="<?php echo $counter;?>">
                    </td>
                </tr> 
           
                <tr>
                    <td colspan="5">
                        <input type="submit" name="gem" class="submit" id="gem" value="Gem"/>
                    </td>
                </tr>
                <?php
                }
                ?>
            </table>

Procent elementet vil jeg så have til ved onChange at beregne en procent fordeling, så hvis der indtastes 20 i projektmedlem_2_procent, bliver projektmedlem_1_procent udfyldt med 80.

Dertil ville jeg så bruge functionen

function beregnprocent(antal) {
    if (antal == 2) {
        var er = "document.ds.projektmedlem_"+antal+"_procent";
        //document.ds.projektmedlem_"+antal+"_procent = "100";
    }
}

Men mit er problem er at jeg ikke lige kan finde ud af at få antal parameteren med i documents.ds.projektmedlem.....
Avatar billede showsource Seniormester
28. januar 2010 - 13:55 #4
Jeg kan ikke lige overskue din phpkode, men når siden vises, og du så bruger "vis kilde" i din browser, er det så som det skal være ?
Altså værdien af $counter
Avatar billede lsskaarup Nybegynder
28. januar 2010 - 14:29 #5
Ja, alt html/php virker indtil videre, herunder også $counter

Det betyder at når der ikke er oprettet medlemmer på projektet, er der en række med felter til at vælge medlemmer og indtaste noget data.

Opdateres siden, viser den de tilknyttede medlemmer (i ovenstående tilfælde kun én) samt den "tomme" række, til indtastning af flere medlemmer.

Sådan fortsætter det i teorien med et uendeligt antal medlemmer, fordi man altid kan tilføje én mere.

Alle disse medlemmer skal så hver især tilføjes en procentsats, som samlet ikke må være over 100.

For at kunne beregne dette er min tænke, at jeg sender antallet af medlemmer over til javascriptet, der så skulle tage felt i hvert procent element, og lægge deres værdier sammen.

Mit problem er at jeg ikke kan fange elementerne da antallet jo kan være uendeligt. Jeg havde håber at jeg kunne noget lignede nedenstående.

function beregnprocent(antal) {
        //alert(antal);
    for(var i=1; i <= antal; i++) {
        //læg elementernes value sammen
        // a la document.ds.projektmedlem_'i'_procent + document.ds.projektmedlem_'i'_procent
        // = document.ds.projektmedlem_1_procent + document.ds.projektmedlem_2_procent
    }
}

Alerten skriver det rigtige antal ud, så jeg får værdien overført til scriptet, jeg kan bare ikke få den lagt ind i elementnavnet.
Avatar billede lsskaarup Nybegynder
28. januar 2010 - 14:35 #6
Hov skulle have været

unction beregnprocent(antal) {
        //alert(antal);
    for(var i=1; i <= antal; i++) {
        //læg elementernes value sammen
        // a la document.ds.projektmedlem_'i'_procent.value + document.ds.projektmedlem_'i'_procent.value
        // = document.ds.projektmedlem_1_procent.value + document.ds.projektmedlem_2_procent.value
    }
}
Avatar billede showsource Seniormester
28. januar 2010 - 14:38 #7
Stadig, uden at ha' styr på din kode, kan du jo bruge [] til navnet for at få et array til php ved post:

<input type="text" name="mitarray[]" value="showsource">
<input type="text" name="mitarray[]" value="lsskaarup">

Ved post kan du så f.eks. bruge en for-løkke til at håndtere $_POST["mitarray"]

Altså, uanset hvad, javascript kan være nyttigt på mange måder, men du skal ALTID også tjekke serverside !
Avatar billede lsskaarup Nybegynder
28. januar 2010 - 14:59 #8
Det forstår jeg ikke helt, tror vi taler forbi hinanden. Kan jeg fange $_POST["mitarray"] i javascript?

Det er reelt en ganske simpel beregning i javascript jeg skal lave, jeg kan bare ikke navngive elemeterne dynamisk i javascript så jeg kan fange dem.

Eks.:
Jeg har 3 input elementer, ved onChange skal deres værdier lægges sammen og tjekkes om de samlet overstiger 100.

Problem:
I en sag har jeg 1 element, i den næste 3, næste igen 100, næste igen 2, næste 21 osv. osv.

Fordi jeg ikke ved hvor mange elementer det drejer sig om, laver jeg dem dynamisk og navngiver dem dynamisk med et nummer. I javascript-funktionen som beregner skal jeg kunne tjekke alle felter. Hvordan gør jeg det?
Avatar billede majbom Novice
28. januar 2010 - 18:30 #9
hvad med at bruge getElementsByTagName ?

så kan du få alle dine input-elementer i et array og beregne samlede value på den måde?
Avatar billede lsskaarup Nybegynder
29. januar 2010 - 10:20 #10
Krævet det ikke at jeg ved hvad felterne hedder?

Jeg kender strukturen på feltnavnene (projektmedlem_'et nummer'_procent), men problemet er at jeg ikke ved hvad "et nummer" er. Det symbolisere hvor mange felter jeg har og der det kan spænde fra 0-&#8734;
Avatar billede lsskaarup Nybegynder
29. januar 2010 - 10:21 #11
Hmm, prøvede at indsætte tegnet for uendeligt, men det kunne E åbenbart ikke forstå, &#8734 er altså = uendeligt
Avatar billede lsskaarup Nybegynder
29. januar 2010 - 10:46 #12
Okay, kan se jeg misforstod hvordan getElementsByTagName virkede, det er på f.eks. <td> og ikke selve feltnavnet.

Men hvordan fanger jeg så nogle få bestemte input felter, og ikke alle?
Avatar billede majbom Novice
29. januar 2010 - 11:36 #13
hmm, de har ikke en bestemt class?

ellers kunne du tage navnet og substringe det, så du kan se om det starter med projektmedlem_
Avatar billede lsskaarup Nybegynder
29. januar 2010 - 13:34 #14
Bestemt class, jo, men ikke alene.

Kunne du/I ikke lave et eks. for jeg er efterhånden helt rundt på gulvet.
Avatar billede lsskaarup Nybegynder
29. januar 2010 - 14:23 #15
I bund og grund at mit spørgsmål, jo bare om og hvordan jeg kan få "i" i nedenstående html objektnavn til at være dynamisk, altså 1, 2, 3 osv.

for (i=1; i<maxAntal;i++) {
    document.ds.projektmedlem_i_procent.value = 100;
}
Avatar billede lsskaarup Nybegynder
29. januar 2010 - 15:02 #16
Så fik jeg hul igennem.

Den skal lige tilpasses de forskellige fejlmuligheder, men jeg tror den er der.

Løsningen bliver at jeg sender et max antal til javascript funktionen, denne værdi kan jeg så bruge til at fange felterne med. For at fange felterne gør jeg følgende:


function beregnprocent(obj) {
    var res = 0;
    for (var i=1; i<=obj; i++) {
        res = res + parseInt(document.ds['projektmedlem_'+i+'_procent'].value);
    }
    if (res > 100 || res < 100) {
        alert("Den samlede procentfordeling giver ikke 100%");
    }
}

Showsource -> Var det, det du mente med at bruge []?
Avatar billede lsskaarup Nybegynder
08. marts 2010 - 11:37 #17
Hmm, hvem vil have pointene her???
Avatar billede majbom Novice
09. marts 2010 - 11:26 #18
det var vel mere eller mindre dig selv der fandt løsningen?

du kan bare beholde dem for min skyld...
Avatar billede showsource Seniormester
09. marts 2010 - 13:29 #19
ditto her
Avatar billede lsskaarup Nybegynder
02. august 2010 - 14:52 #20
ok
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