login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Velden optellen met 'onbekende' veldnaam

Offline Dark_Paul - 07/02/2007 17:56
Avatar van Dark_PaulPHP ver gevorderde He mensen,
Ik heb een probleempje met mn Javascript.
Ik heb deze functie:
  1. <?php // kleurtjes
  2. function CheckBalance(form1, balance, maxid) {
  3. var total = 0;
  4. for (var i=1; i <= maxid; i++) {
  5. var elem_name = 'subtotal_'+i;
  6. var elementI = document.getElementById(elem_name);
  7. if (elementI != null) {
  8. var subtotal = elementI.innerHTML.substr(1);
  9. total += subtotal;
  10. }
  11. }
  12. total = number_format(total, 2, '.', ',');
  13. if (total > balance) {
  14. alert('You don\'t have enough money to buy all of this!');
  15. }
  16. else {
  17. document.getElementById('total').innerHTML = '<strong>Total</strong> $'+total;
  18. }
  19. }

Hij doet redelijk goed wat 'ie moet doen, maar zodra het aantal producten niet gelijk is aan het hoogste ID werkt het niet.
Hoe kan ik deze functie dus aanpassen dat 'ie alle divs waar van het id begint met 'subtotal_', ongeacht het getal dat er achter staat, bij elkaar opteld.
Ik geef nu het aantal producten mee, maar dat aantal hoeft niet per se te stroken met het hoogste getal dat er achter 'subtotal_' staat.
Dat er een '$' in de div staat maakt niet uit, die filter ik eruit.

Paul

4 antwoorden

Gesponsorde links
Offline Rik - 07/02/2007 18:18
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Nu gaat je script per id gokken of er een div bestaat!  

Deze snippet zou je moeten kunnen gebruiken:
  1. <? // Kleurtjes! :)
  2. elements = document.getElementsByTagName('div');
  3. for (i = 0; i < elements.length; i++) {
  4. if (elements[i].id.substr(0, 10) == 'subtotaal_') {
  5. alert('Div gevonden!\nId: "' + elements[i].id + '"\nInhoud: "' + elements[i].innerHTML + '"');
  6. }
  7. }
Offline Dark_Paul - 07/02/2007 19:57 (laatste wijziging 08/02/2007 09:26)
Avatar van Dark_Paul PHP ver gevorderde Prima, ik denk dat 't daar wel mee gaat lukken.
Hartstikke bedankt Boukefalos 
Ik heb nu geen tijd om 'm te proberen (moet gaan leren voor de proefwerkweek), maar morgenvroeg heb ik wel even tijd.

Het is dus niet gelukt.. Hij vindt het goede veld niet, zo ziet mijn functie er nu uit:
  1. <?
  2. function CheckBalance (div, balance, start, output) {
  3. elems = document.getElementById(div).getElementsByTagName('div');
  4. var total = 0;
  5. for (var i=0; i < elems.length; i++) {
  6. document.write(elems[i].id.substr(0,8));
  7. if (elems[i].id.substr(0,8) == start) {
  8. var subtotal = elems[i].innerHTML.substr(1);
  9. total += subtotal;
  10. }
  11. }
  12. /*document.getElementById(output).innerHTML = '<strong>Total</strong> $'+total; */
  13. }

Ik heb de laatste regel 'weggelaten', want die gaf nog een error.
Die 'document.write' staat er om te kijken wat 'ie vindt.
Daar gaat het ook fout, want met substr(0,8) vindt 'ie 'subtotal' zoals het moet, maar hij plankt er automatisch nog 'total' achter. Dus dan krijg je subtotaltotal. Doe ik substr(0,3), dan krijg ik subtot eruit.
Als ik de substr weglaat in de document.write, dan komt er subtotal5total uit (5 is hier het productid).
Met deze regel roep ik de functie aan:
CheckBalance('shop', '{money}', 'subtotal', 'total');
Offline Rik - 08/02/2007 16:12
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Dat is nogal raar, want je doet dan nog niets met output.

Ik zie nu dat je substr(0, 8) doet, dat kan makkelijker met substr(0, start.length), maar dat lost je probleem niet op.

Heb je hier ook een stukje html bij? Dan kan ik nog ff goed kijken!  
Offline Dark_Paul - 08/02/2007 21:50 (laatste wijziging 09/02/2007 11:14)
Avatar van Dark_Paul PHP ver gevorderde Dat met substr(0, start.length) had ik oorspronkelijk ook, maar dit was om te testen. Ik probeer mn functies zo universeel mogelijk te houden, zodat ik ze later kan 'hergebruiken'.
De geparste HTML van de shop:
  1. <div id="shop">
  2. <form method="post" action="shop.php?action=buy" onchange="javascript: CheckBalance('shop', '88008120.00', 'subtotal', 'total');">
  3. <div style="width: 150px;"><strong>Productname</strong></div>
  4. <div class="price"><strong>Price per</strong></div>
  5. <div class="price"><strong>Amount</strong></div>
  6. <div class="price"><strong>Subtotal</strong></div><br /><br />
  7.  
  8. <div class="name">Whiskey</div>
  9. <div class="price">$0.50</div>
  10. <div class="price">
  11. <input type="text" name="product[5]" value="0" onchange="Subtotal(this.value, 5, '0.50')" />
  12. </div>
  13. <div class="price" id="subtotal5">$0</div><br />
  14. <div class="spacer"><!-- --></div><br />
  15.  
  16. <div id="total"><strong>Total</strong> $0</div><br /><br />
  17. <input type="hidden" name="buy" />
  18. <input type="submit" value="Buy" />
  19. </form>
  20. </div>

Dit is uiteraard niet alle html, maar alleen het relevante deel.

Edit
Ik heb 't opgelost, heb 'm iets anders gedaan, aangezien 'onchange=' niet in het form-element mag staan volgens de xHTML regels.
Dit zijn mijn functies nu:
  1. <? // kleurtjes!! :D
  2. function ShopTotal() {
  3. elems = document.getElementById('shop').getElementsByTagName('div');
  4. var total = 0;
  5. for (var i=0; i < elems.length; i++) {
  6. if (elems[i].id.substr(0,8) == 'subtotal') {
  7. var subtotal = elems[i].innerHTML.substr(1);
  8. total += subtotal;
  9. }
  10. }
  11. total = number_format(total, 2, '.', ',');
  12. document.getElementById('total').innerHTML = '<strong>Total</strong> $'+total;
  13. }
  14. function Subtotal(amount, productid, price) {
  15. var subtotal = amount*price;
  16. subtotal = number_format(subtotal, 2, '.', ',');
  17. var div = 'subtotal'+productid;
  18. document.getElementById(div).innerHTML = "$"+subtotal;
  19. ShopTotal();
  20. }
  21. function CheckBalance (balance, div) {
  22. var content = document.getElementById(div).value;
  23. var cost = content.innerHTML.substr(23);
  24. var ret = true;
  25. if (cost > balance) {
  26. alert('You don\'t have enough money to buy all these stuff.');
  27. ret = false;
  28. }
  29. else {
  30. ret = true;
  31. }
  32. return ret;
  33. }


En de geparste HTML:
  1. <div id="shop">
  2. <form method="post" action="shop.php?action=buy" onsubmit="javascript: CheckBalance('88008120.00', 'total');">
  3. <div style="width: 150px;"><strong>Productname</strong></div>
  4. <div class="price"><strong>Price per</strong></div>
  5. <div class="price"><strong>Amount</strong></div>
  6. <div class="price"><strong>Subtotal</strong></div><br /><br />
  7.  
  8. <div class="name">Whiskey</div>
  9. <div class="price">$0.50</div>
  10. <div class="price">
  11. <input type="text" name="product[5]" value="0" onchange="Subtotal(this.value, 5, '0.50')" />
  12. </div>
  13. <div class="price" id="subtotal5">$0</div><br />
  14. <div class="spacer"><!-- --></div><br />
  15.  
  16. <div id="total"><strong>Total</strong> $0</div><br /><br />
  17. <input type="hidden" name="buy" />
  18. <input type="submit" value="Buy" />
  19. </form>
  20. </div>


Bedankt voor je hulp Boukefalos! 

Edit 2:
Trouwens, nog ff een vraagje, hoe kan je in JavaScript optionele parameters opgeven?
Ik heb een number_format functie, en daar wil ik standaard dat de 3e en 4e parameter op respectievelijk '.' en ',' staan. Als ik dit doe:
function number_format(int, decimals, dec_sep='.', thousand_sep=',') {}
krijg ik een error. Als ik er iets anders van maak (=0, =null) krijg ik ook een error.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.259s