Avatar billede desiree Nybegynder
07. april 2007 - 00:09 Der er 11 kommentarer og
1 løsning

javascript sum funktion

Hej folk derude (:

Jeg sidder og prøver at lave en indkøbs funktion, men jeg kan ikke helt finde ud af at lægge tingene sammen..
ideen er at varerne skal lægges sammen uden at jeg skal lave en unødvendig post, altså med javascript?
En banan koster 10,- og en pærer koster 7,-.. har man medlemskort bliver det 10% billigere

Kan man lave noget smart sådan den opdatere prisen bare når man ændre et felt?

på forhånd tusind tak!

<table border="0" width="100%">
  <tr>
  <td width="80%">Banan</td>
  <td width="20%" align="right"><input type="checkbox"></td>
  </tr>
  <tr>
  <td width="80%">Pærer</td>
  <td width="20%" align="right"><input type="checkbox"></td>
</tr>
  <tr>
  <td width="80%">Medlemskort</td>
  <td width="20%" align="right"><select size="1" name="medlem"><option selected value="0">Medlemskort: nej</option><option value="1">Medlemskort: ja</option></select></td>
</tr>
  <tr>
  <td width="80%">Total pris:</td>
  <td width="20%" align="right">$pris_her</td>
</tr>
</table>
Avatar billede roenving Novice
07. april 2007 - 12:26 #1
Det virker som et meget forsimplet eksempel, men det kan f.eks. laves sådan:

<form>
<table border="0" width="300">
  <tr>
  <td width="80%">Banan</td>
  <td width="20%" align="right"><input name="banan" type="checkbox" onclick="beregnTotal(this)"></td>
  </tr>
  <tr>
  <td width="80%">Pærer</td>
  <td width="20%" align="right"><input name="paere" type="checkbox" onclick="beregnTotal(this)"></td>
</tr>
  <tr>
  <td width="80%">Medlemskort</td>
  <td width="20%" align="right"><select size="1" name="medlem" onchange="beregnTotal(this)"><option selected value="0">Medlemskort: nej</option><option value="1">Medlemskort: ja</option></select></td>
</tr>
  <tr>
  <td width="80%">Total pris:</td>
  <td width="20%" align="right"><span id="totalPris">&nbsp;</span></td>
</tr>
</table>
</form>

<script type="text/javascript">
function beregnTotal(elm){
  var f = elm.form;
  var banana = f.banan.checked ? 10 : 0;
  var pear = f.paere.checked ? 7 : 0;
  var rabat = f.medlem.selectedIndex;
  var total = (banana + pear)* (rabat ? 0.9 : 1);
  document.getElementById('totalPris').firstChild.nodeValue = total;
}
</script>

-- men prøv f.eks. at kigge på den, der ligger i denne tråd: http://www.eksperten.dk/spm/625583 !-)
Avatar billede desiree Nybegynder
07. april 2007 - 14:33 #2
Hej roenving, tusind tak for dit svar! (:

Jeg har nok prøvet at forsimple det lidt, men jeg må ville prøve selv at regne resten af funktionen ud.. jeg er nemlig ikke så skarp til javascript c,")

Hvis jeg nu må være lidt besværlig og funktionen skulle være mere avanceret, hvordan gøres dette? (:

Jeg kunne godt tænke mig følgende elementer i koden:

Slibning af gulv: (koster 2000)(2 dage ekstra til forventet tid)
Lakering af gulv (koster 1500) (1 dag ekstra til forventet tid)
Montering af gulvlister (koster 700) (1 dag ekstra til forventet tid)
Hastighed lægning af nyt gulv (hvis hurtig tilføj 15% til pris for gulv og -10% i forventet tid)
Kvadratmeter (kvm) (for hver 5kvm skal det tage 1 dag til forventet tid, og for hver 10kvm der vælges skal der være -2% i pris for gulv) (kvm pris er 225,-)
Ekstra gulvbehandling valgt (tæl antal valgte ekstra muligheder (der er 3))
Forventet tid (beregn forventet tid for gulvlægningen og ekstra muligheder)
Pris for gulv (antal kvm + tilvalg af mulighed + hastigheden for lægningen af gulvet)
Total pris (pris for gulv + 2750,-)

<form>
<table border="0" width="300">
  <tr>
  <td width="80%">Slibning af gulv</td>
  <td width="20%" align="right"><input name="banan" type="checkbox" onclick="beregnTotal(this)"></td>
  </tr>
  <tr>
  <td width="80%">Lakering af gulv</td>
  <td width="20%" align="right"><input name="paere" type="checkbox" onclick="beregnTotal(this)"></td>
</tr>
  <tr>
  <td width="80%">Montering af gulvlister</td>
  <td width="20%" align="right"><input name="aebler" type="checkbox" onclick="beregnTotal(this)"></td>
</tr>
  <tr>
  <td width="80%">Hastighed lægning af nyt gulv</td>
  <td width="20%" align="right"><select size="1" name="udbringning" onchange="beregnTotal(this)"><option selected value="0">almindelig</option><option value="1">hurtig</option></select><span id="totalPris">&nbsp;</span></td>
</tr>
  <tr>
  <td width="80%">Kvadratmeter (kvm)</td>
  <td width="20%" align="right"><select size="1" name="kvm" onchange="beregnTotal(this)">
      <option value="0" selected>0</option>
      <option value="5">5</option>
      <option value="10">10</option>
      <option value="20">20</option>
      <option value="30">30</option>
      <option value="40">40</option>
      <option value="50">50</option>
      <option value="60">60</option>
      <option value="70">70</option>
    </select></td>
</tr>
  <tr>
  <td width="80%">Ekstra gulvbehandling valgt</td>
  <td width="20%" align="right">(0/3)</td>
</tr>
  <tr>
  <td width="80%">Forventet tid</td>
  <td width="20%" align="right"></td>
</tr>
  <tr>
  <td width="80%"><span id="pris">Pris for gulv</span></td>
  <td width="20%" align="right"></td>
</tr>
  <tr>
  <td width="80%"><span id="totalPris">Total pris</span></td>
  <td width="20%" align="right"></td>
</tr>
</table>
</form>

jeg håber virkelig ikke jeg er for bøvlet, jeg er bare ikke selv så god til javascript (:

tusind tak for hjælpen! jeg håber du kan hjælpe mig med udbyggelsen af min kode.. og smid et svar, så acceptere jeg lige.. tusind tusind tak (:
Avatar billede roenving Novice
07. april 2007 - 15:24 #3
Tjah, den er jo mere krøllet end normalt ...

-- een ting kunne jeg ikke gennemskue, nemlig om hastigheden virker både overfor selve gulvlægningen og tillægstingene, eller om det kun gælder selve gulvlægningen, så jeg har valgt at det er totaltiden, der spares på !-)

<form>
<table border="0" width="300">
  <tr>
  <td width="80%">Slibning af gulv</td>
  <td width="20%" align="right"><input name="tilvalg" type="checkbox" value="2000|2" onclick="beregnTotal(this)"></td>
  </tr>
  <tr>
  <td width="80%">Lakering af gulv</td>
  <td width="20%" align="right"><input name="tilvalg" type="checkbox" value="1500|1" onclick="beregnTotal(this)"></td>
</tr>
  <tr>
  <td width="80%">Montering af gulvlister</td>
  <td width="20%" align="right"><input name="tilvalg" type="checkbox" value="700|1" onclick="beregnTotal(this)"></td>
</tr>
  <tr>
  <td width="80%">Hastighed lægning af nyt gulv</td>
  <td width="20%" align="right"><select size="1" name="hastighed" onchange="beregnTotal(this)"><option selected value="0">almindelig</option><option value="1">hurtig</option></select></td>
</tr>
  <tr>
  <td width="80%">Kvadratmeter (kvm)</td>
  <td width="20%" align="right"><select size="1" name="kvm" onchange="beregnTotal(this)">
      <option value="0" selected>0</option>
      <option value="5">5</option>
      <option value="10">10</option>
      <option value="20">20</option>
      <option value="30">30</option>
      <option value="40">40</option>
      <option value="50">50</option>
      <option value="60">60</option>
      <option value="70">70</option>
    </select></td>
</tr>
  <tr>
  <td width="80%">Ekstra gulvbehandling valgt</td>
  <td width="20%" align="right"><span id="extra">(0/3)</span></td>
</tr>
  <tr>
  <td width="80%">Forventet tid</td>
  <td width="20%" align="right"><span id="expTime">0</span>&nbsp;dag(e)</td>
</tr>
  <tr>
  <td width="80%">Pris for gulv</td>
  <td width="20%" align="right">kr. <span id="price">0,00</span></td>
</tr>
  <tr>
  <td width="80%">Total pris</td>
  <td width="20%" align="right">kr. <span id="totPrice">0,00</span></td>
</tr>
</table>
</form>

<script type="text/javascript">
function beregnTotal(elm){
  var f = elm.form;
  var tilv = f.tilvalg;
  var hast = +f.hastighed.value;
  var m2 = +f.kvm.value;
  var pris = 0, tid = 0, extras = 0,val;
  for(i=0,im=tilv.length;im>i;i++){//Læs de tre tilvalg
    if(tilv[i].checked){//Tæl op i pris, tid og antal
      val = tilv[i].value.split("|");
      pris += +val[0];
      tid += +val[1];
      extras++;
    }
  }
  document.getElementById("extra").firstChild.nodeValue = "(" + extras + "/3)";
  tid += m2/5;//tillæg tid for gulvlægning
  pris += m2*225;//tillæg pris for gulvet
  var rabat = m2 > 5 ? 0.02*m2/10 : 0; //regístrer evt. rabat
  pris *= (1-rabat);//fratræk rabat
  pris *= hast ? 1.15 : 1;//tillæg, hvis hurtig lægning er valgt
  tid *= hast ? 0.9 : 1;//fratræk, hvis hurtig lægning er valgt
  document.getElementById("expTime").firstChild.nodeValue = formatNumDan(tid,1,false);
  document.getElementById("price").firstChild.nodeValue = formatNumDan(pris,2,true);
  document.getElementById("totPrice").firstChild.nodeValue = formatNumDan(pris+2750,2,true);
}
function formatNumDan(num,decimaler,valuta){
  num += "";
  if(!num.match(/^-?\d+([,\.]\d+)*$/)){
    alert("fejl");
    return "";
  }
  decs = decimaler ? (Math.pow(10,decimaler)+"").substring(1):"";
  if(num.indexOf(".")>num.indexOf(",") && num.indexOf(",")>-1 || num.indexOf(",")!=num.lastIndexOf(",")){
    num = num.replace(/,/g,"");
  }else if(num.indexOf(",")>-1 || num.indexOf(".")!=num.lastIndexOf(".")){
    num = num.replace(/\./g,"").replace(/,/g,".");
  }
  if(num.indexOf(".")==-1 && num.indexOf(",")==-1)
    return valuta?ins1000Sep(num + "," + decs):ins1000Sep(num);

  num = Math.round(+num*Math.pow(10,decimaler))/Math.pow(10,decimaler)+"";
  num += num.indexOf(".")>-1 ? decs : "." + decs;
  num = num.substring(0,num.indexOf(".") + decimaler + 1);
  return ins1000Sep(num.replace(/\./,","));
}
function ins1000Sep(val){
  val = val.split(",");
  val[0] = val[0].split("").reverse().join("");
  val[0] = val[0].replace(/(\d{3})/g,"$1.");
  val[0] = val[0].split("").reverse().join("");
  val[0] = val[0].replace(/^(-?)\./,"$1");
  return val.join(",");
}
</script>
Avatar billede desiree Nybegynder
07. april 2007 - 15:57 #4
hej igen roenving, og endnu engang tusind tak! (:

jeg har prøvet at ændre lidt i mine html, laver jeg et valg der hedder 1000kvm og vælger dette, så bliver den aktuelle pris -222.250,00

og er det muligt at jeg kan sætte mine priser og dage på mine tilvalg i scriptet? :)
Avatar billede desiree Nybegynder
07. april 2007 - 15:59 #5
document.getElementById("expTime").firstChild.nodeValue = formatNumDan(tid,1,false);
hvad hvis den skal tilføje en tekst dage bagefter tallet? (:

jeg har forøvrigt forhøjet pointsne! skal gerne give endnu mere for din behjælpsomhed (:
Avatar billede roenving Novice
07. april 2007 - 16:10 #6
Det er fordi rabatten forøges med de 2% pr. 10 m² !-)

-- priser og tider sætter du som value på checkboksene, det giver den nemmest overskuelige kode, og er _meget_ nemmere at vedligeholde (så skal der kun ændres i scriptet, hvis du tilføjer helt andre muligheder, f.eks. arbejde i weekenden, men flere ekstra-ting bare sættes ind som flere checkboxe, der har name="tilvalg" !-)

-- vi kan tilføje et maksimum for gulvpris-rabatten, så den f.eks. ikke kan blive mere end 20% ...

-- det med dagene kan sagtens laves, men jeg synes selv, det er bedst med den løsning, at det står udenfor det element, der editeres ...

+ " dag(e)"

-- velbekomme '-)
Avatar billede desiree Nybegynder
07. april 2007 - 16:14 #7
Et maximum på 20% ville være super (:
Avatar billede roenving Novice
07. april 2007 - 16:37 #8
Ændr den ene linje til:

  var rabat = m2 > 100 ? 0.2 : m2 > 5 ? 0.02*m2/10 : 0; //regístrer evt. rabat

-- find den på kommentaren !-)
Avatar billede roenving Novice
07. april 2007 - 16:38 #9
-- og tak for point ;~}
Avatar billede desiree Nybegynder
07. april 2007 - 17:03 #10
det er mig der tager 1000 gange (:

hvis jeg kan fristes til at spørge en sidste gang; hvordan fjerner jeg kommaet i tiden og prisen? sådan den kun skriver 12 dage selvom det måtte være 12,3 dage og det samme i pris
Avatar billede desiree Nybegynder
07. april 2007 - 17:03 #11
det er mig der takker 1000 gange*
Avatar billede roenving Novice
07. april 2007 - 23:36 #12
-- ændr 1- og 2-tallet i formatNumDan-kaldene til 0, og fjern valuta-tingen !-)

  document.getElementById("expTime").firstChild.nodeValue = formatNumDan(tid,0,false);
  document.getElementById("price").firstChild.nodeValue = formatNumDan(pris,0,false);
  document.getElementById("totPrice").firstChild.nodeValue = formatNumDan(pris+2750,0,false);
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