Avatar billede anderseiler Nybegynder
10. juni 2007 - 16:55 Der er 29 kommentarer og
1 løsning

Funktion i onchange dur ik så godt

Hey.

I min php variabel $_SESSION['cart'] har jeg et array med en indkøbskurv. Jeg vil gerne have javascript til at lægge alle tal sammen fra priserne på de enkelte vare i indkøbskurven "on the fly" (derfor javascript, da php skal refreshe siden :/ ). Men det fungerer ikke så godt. Jeg har følgende kode:

Funktionen som udfører sammenlægningen:
<script type="text/javascript">
    <!--
   
    function sumPrice()
    {
        var total;
        var array = <?php print $_SESSION['cat']; ?>;
       
        foreach(var key in array)
        {
            total = total + parseInt(document.getElementById('price'+key).value);
        }
       
        return total;
    }
   
    -->
    </script>


Min onchange ting:
<select name="wee" onchange="document.getElementById('total').value = sumPrice();"

/* indsæt selv resten af min select her (som fungerer :) /*


Længere nede har jeg så et textfelt med id="total". Men når jeg ændrer i min select, så gør den ingenting. Jeg har nogle flere javascriptfunktioner bag ovenstående i min onchange, som fungerer fint hvis ikke jeg kalder den funktion. Hvor går det galt? Hvis jeg prøver at lave en alert('') øverst i funktionen, for at teste, så kommer den heller ikke frem - altså kommer den (vist) ikke engang frem til funktionen?

Mvh
Anders
Avatar billede erikjacobsen Ekspert
10. juni 2007 - 16:58 #1
Får du Javascript fejl? Hvad er Javascript koden?
Avatar billede roenving Novice
10. juni 2007 - 17:00 #2
Hvordan ser din variabel array ud ?-)

-- og så er det dumt at benytte et reserveret ord til noget i javascript, så giv den et andet navn, f.eks. cats !-)
Avatar billede erikjacobsen Ekspert
10. juni 2007 - 17:06 #3
Ja, den der PHP kode kan give fejl. "array" er så ok lige her. Den anden er at der ikke er så meget der hedder foreach. Men man kan jo

  for (var key in array)
Avatar billede erikjacobsen Ekspert
10. juni 2007 - 17:07 #4
Men, det jeg egentlig ville sige: man finder først og fremmest ud af det ved at se på de fejl man får :)
Avatar billede erikjacobsen Ekspert
10. juni 2007 - 17:08 #5
Ja, nemlig. En lille test, der tilsyneladende virker som den skal:

        var array = [4,5,6];
        for (var key in array) alert("array[" + key + "] = " + array[key]);
Avatar billede anderseiler Nybegynder
10. juni 2007 - 17:24 #6
wow, det gik stærkt :)

Okay, jeg har lige ændret foreach til for i mit javascript (det første kodeeksempel jeg giver).

Nu kører den javascript fint igennem. Men value af total er nu "undefined", og ikke et tal/integer, som den egentlig burde være.

Any idears why? :)

erikjacobsen: hvilket reseveret ord snakker du om jeg bruger?? (er ik den store JS haj ;) hehe...
Avatar billede roenving Novice
10. juni 2007 - 17:28 #7
array er et reserveret ord, men som erik skriver, _burde_ det ikke i den sammenhæng give problemer, det er bare dumt alligevel !-)

-- pprøv at vise den kode. der rammer browseren, for der kan tænkes en hel del fejl, måske skal du:

        var total = 0;
        var cats = [<?php print implode($_SESSION['cat'],","); ?>];
        foreach(var key in cats){
            total += parseInt(document.getElementById('price'+key).value);
        }
       
        return total;
Avatar billede erikjacobsen Ekspert
10. juni 2007 - 17:31 #8
Hvad er Javascript koden?
Avatar billede anderseiler Nybegynder
10. juni 2007 - 17:33 #9
Når jeg skriver foreach så vil den absolut ingenting :) Men hvis jeg bruger for i stedet for foreach, så kører den (næsten). Den lægger i hvert fald nogle tal sammen og ændrer min total efter, hvad jeg ændrer i min select. Jeg kan bare ikke lige se logikken i det :p  :)

Jeg prøver lige at lege med det i to sekunder, så vender jeg lige tilbage :)

erikjacobsen - den ser sådan her ud nu:

    <script type="text/javascript">
    <!--
   
    function sumPrice()
    {
        var total = 0;
        var cats = [<?php print implode($_SESSION['cat'],","); ?>];
       
        for (var key in cats)
        {
            total += parseInt(document.getElementById('price'+key).value);
        }
       
        return total;
    }
   
    -->
    </script>
Avatar billede erikjacobsen Ekspert
10. juni 2007 - 17:34 #10
Jeg tror vi gerne vil se Javascript koden - ikke det der PHP.
Avatar billede anderseiler Nybegynder
10. juni 2007 - 17:38 #11
Så er jeg ikke med på, hvad du mener? Det jeg lige har postet er da min Javascript kode? Min JS funktion?!

Lige en tanke - hvis jeg udskriver min cats med document.write, så skriver den:

function Array() { [native code] } , function Array() { [native code] } , function Array() { [native code] }

Er det rigtigt?? :)
Avatar billede roenving Novice
10. juni 2007 - 17:38 #12
Undskyld, jeg ikke fik konsekvens-rettet, men som rik skriver, prøv at vise den kode, der rammer browseren (f.eks. Vis kode !-)
Avatar billede erikjacobsen Ekspert
10. juni 2007 - 17:39 #13
Hedder det ikke "vis kilde", eller "vis sidens kildekode".
Avatar billede anderseiler Nybegynder
10. juni 2007 - 17:43 #14
Arhh, super smart:) hehe.. Det er:

<script type="text/javascript">
    <!--
   
    function sumPrice()
    {
        var total = 0;
        var cats = [Array,Array,Array];
       
        for (var key in cats)
        {
            total += parseInt(document.getElementById('price'+key).value);
        }
       
        return total;
    }
   
    -->
    </script>


MEEEEEEEEN! (nu skal i grine af mig og tænke "hvor sødt"):

Som nævnt tidligere, så har jeg en del andre JS funktioner i min onchange. Bl.a. den, som opdaterer mit 'price'+key felt med den nyeste værdi. Hvis jeg sætter min sumPrice bagerst i min onchange, så opdaterer den total feltet EFTER, at jeg har givet alle mine price felter deres nye værdier - og så virker det :)

Så selvom, at der står [Array,Array,Array] (hvilket jeg slet ikke aner hvorfor eller om er rigtigt), så ser det faktisk ud til at virke ret godt nu! :) (crashtester det dog lige :))
Avatar billede erikjacobsen Ekspert
10. juni 2007 - 17:46 #15
Hvad hedder dine 'price'+key - felter?  Det der med Array er jo i hvert fald galt. Hvad skulle der have stået? Hvad indeholder Sessions-variablen?
Avatar billede roenving Novice
10. juni 2007 - 17:48 #16
Hrm, i ovenstående kode vil key få værdierne 0, 1 og 2 ...

-- men hvis det nu er varenumre, du skal flytte, så skal du nok trække dem ud og så:

        var cats = [15299784,786987,i856433];
       
        for (var key in cats)
        {
            total += parseInt(document.getElementById('price'+cats[key]).value);
        }
Avatar billede erikjacobsen Ekspert
10. juni 2007 - 17:52 #17
Proof of concept: http://n0p.com/782499.php
Avatar billede anderseiler Nybegynder
10. juni 2007 - 17:52 #18
Jeg har et antal price felter som er lig antallet af felter i mit array ($_SESSION['cat']. Hvis jeg har 5 af dem, så hedder de:

price1
price2
price3
price4
price5

på den måde kan jeg identificere dem via min key i mit array, da de tallet i price stemmer overens med key fra det enkelte instance af array.

et print_r($_SESSION['cat']) printer:

[0] => Array
        (
            [prod_id] => 1
            [prod_price] => 175
            [prod_slots] => 12
        )

der er sådan en for hvert element i mit array - og for hvert element i mit array, så er der et price felt. Pricefeltet for ovenstående vil så hedde price0 :)

Igen - dunno how or why, men det virker nu :) hehe...
Avatar billede anderseiler Nybegynder
10. juni 2007 - 17:53 #19
det er prod_price som jeg skal bruge, når jeg lægger tallene sammen. Og tilsyneladende kan den selv finde ud af det :) Ved ikke lige hvordan :)
Avatar billede erikjacobsen Ekspert
10. juni 2007 - 17:57 #20
Står prod_price i dine felter på siden "price0" ? Hvis det altid er 0,1,2,3,4 osv behøv's du jo ikke et array.  Måske vi kunne bruge lidt mere kode.
Avatar billede anderseiler Nybegynder
10. juni 2007 - 18:02 #21
ja, det er prod_price som står i mine price felter. Men det er ikke sikkert, at det er price0, price1, price2, price3 osv - altså at de er i den rækkefølge. Det kan godt være, at det er price2, price3, price5, price77 osv. Rækkefølgen er ikke sikker, desværre :/

Men du kan få hele afsnittet af kode som har været omtalt så. Så kan du også se, at jeg i min PHP bruger en foreach i stedet for en for, da keys i $_SESSION['cat'] ikke altid er 0, 1, 2, 3 osv., men godt kan variere.



    <script type="text/javascript">
    <!--
   
    function sumPrice()
    {
        var total = 0;
        var cats = [<?php print implode($_SESSION['cat'], ","); ?>];
       
        for (var key in cats)
        {
            total += parseInt(document.getElementById('price'+key).value);
        }
       
       
        return total;
    }
   
    -->
    </script>
   
    <?php
    //Viser indhold af kurv
    if(count($_SESSION['cat']) > 0)
    {
        foreach($_SESSION['cat'] AS $key => $cat)
        {   
            $q = mysql_query("SELECT prod_name, prod_time_standard, prod_time_min, prod_time_max, prod_price FROM sg_products WHERE prod_id='".$_SESSION['cat'][$key]['prod_id']."'") or die(mysql_error());
            $p = mysql_fetch_assoc($q);
           
            ?>
            <tr>
                <td class="content"><?php print $p['prod_name']; ?></td>
                <td class="content"><?php print $_SESSION['cat'][$key]['prod_slots']; ?> slots</td>
                <td class="content">
                    <select name="time<?php print $key; ?>" class="formSelect" onchange="if(this.value != 1) { document.getElementById('price<? print $key;?>').value = parseInt(1*<?php print $_SESSION['cat'][$key]['prod_price']; ?> * 1*this.value / 100 * (1*100 - (1*this.value))) } else { document.getElementById('price<? print $key;?>').value = parseInt(1*<?php print $_SESSION['cat'][$key]['prod_price']; ?> * 1*this.value) } document.getElementById('total').value = sumPrice(); " style="width: 200px;">
                        <?php
                        for($i = $p['prod_time_min']; $i <= $p['prod_time_max']; $i++)
                        {
                            ?>
                            <option value="<?php print $i; ?>" <?php if($i == $p['prod_time_standard']) { print "selected"; } ?>>
                                <?php print $i;  ?> mdr. (+<?php print intval((($i*$_SESSION['cat'][$key]['prod_price'])-$_SESSION['cat'][$key]['prod_price']) / 100 * (100 - ($i +1))); ?> | spar <?php print intval((($i*$_SESSION['cat'][$key]['prod_price'])-$_SESSION['cat'][$key]['prod_price']) / 100 * ($i +1)); ?> point)
                            </option>
                            <?php
                        }
                        ?>
                    </select>
                </td>
                <td class="content"><input type="text" id="price<? print $key;?>" name="product_price<?php print $key; ?>" readonly size="2" value="<?php print $_SESSION['cat'][$key]['prod_price']*$p['prod_time_standard']; ?>" class="formText" style="width: 35px;" /> point</td>
                <td class="content"><a href="#" onclick="if(confirm('<?php print TEXT_PRODUCT_LIST_REMOVEFROMCAT; ?>')) { document.location='index.php?p=cart&path=ucp&a=removefromcart&id=<?php print $key; ?>'; }"><img src="images/buttons/IMAGE_BUTTON_REMOVEFROMCART.gif" border="0" /></a></td>
            </tr>
            <?php
            $totalprice_std = $totalprice_std + $_SESSION['cat'][$key]['prod_price']*$p['prod_time_standard'];
           
        }
        ?>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td class="content" colspan="3"><?php print "<b>".count($_SESSION['cat']); print " ".TEXT_PRODUCT_LIST_PRODUCTS_IN_ALL."</b>"; ?></td>
            <td class="content"><input type="text" name="total" readonly id="total" class="formText" style="width: 35px; font-weight: bold;" value="<?php print $totalprice_std; ?>"/> point</td>
        </tr>
Avatar billede anderseiler Nybegynder
10. juni 2007 - 18:03 #22
Okay, ret uoverskueligt :/ sorry... :)
Avatar billede erikjacobsen Ekspert
10. juni 2007 - 18:31 #23
Så skal du vel have dit array til at indeholde

  var cats=[2,3,5,77];
Avatar billede anderseiler Nybegynder
10. juni 2007 - 19:12 #24
nej, det skal indeholde prod_price, da det er dem, som den lægger sammen, for at finde den totale pris på alle elementer i mit array :)

btw - da det virker... Smid et svar, I to, så kan I dele point :)  Med mindre en af jer har et bedre forslag :)
Avatar billede erikjacobsen Ekspert
10. juni 2007 - 19:13 #25
Jeg tror ikke på det virker ;)  (og jeg samler ikke på point, tak)
Avatar billede anderseiler Nybegynder
10. juni 2007 - 19:25 #26
Jamen skal vi vædde? :p hehe... Det virker super godt :) hehe... Hvis det pludselig crasher plager jeg jer bare med en tråd mere ;)

Kommer der ikke ngoet svar fra roenving inden for... En uge or so - så lukker jeg bare selv, siden du ikke samler på point :)
Avatar billede erikjacobsen Ekspert
10. juni 2007 - 19:41 #27
Jeg vædder ikke. Jeg holder mig til fakta. Det du siger stemmer ikke overens, men prøv dig frem!
Avatar billede anderseiler Nybegynder
10. juni 2007 - 21:15 #28
Det var nu mere ment med et smil, ikke så alvorligt :)

Jeg ved heller ikke lige hvorfor, for kan godt se din pointe i, at det ikke burde virke... Men det gør det tilsyneladene :)

Tak for hjælpen! :)
Avatar billede roenving Novice
13. juni 2007 - 01:07 #29
Oki '-)
Avatar billede roenving Novice
15. juni 2007 - 15:05 #30
-- og jeg takker 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