« 1 2 »
Autor Zpráva
juho123
Profil *
Ahojte,

potrebujem na zaklade zaskrtnutych checkboxov dynamicky vypisat cenu:

<input type="checkbox" name="suroviny[]" value="1"> Jedlo1
<input type="checkbox" name="suroviny[]" value="2"> Jedlo2
<input type="checkbox" name="suroviny[]" value="3"> Jedlo3
<input type="checkbox" name="suroviny[]" value="4"> Jedlo4
<div id=vysledok></div>


Prosim, ako to dosiahnut najefektivnejsie?
Tu cenu si mozem zadefinovat niekde do onclick a
potom to nejako cez jquery spocitat.

Dakujem za vase rady.
Kcko
Profil
Tak nejtriviálněji takto http://jquery.jslab.net/zkousecka/#318f57fc84a02f3277357ce58b2e7138


<input type="checkbox" name="suroviny[]" value="1" onclick="addPrice(100,this);"> Jedlo1
<input type="checkbox" name="suroviny[]" value="2" onclick="addPrice(200,this);"> Jedlo2
<input type="checkbox" name="suroviny[]" value="3" onclick="addPrice(300,this);"> Jedlo3
<input type="checkbox" name="suroviny[]" value="4" onclick="addPrice(400,this);"> Jedlo4
<div id=vysledok></div>


var totalPrice = 0;

function addPrice(price, obj)
{
  if (obj.checked)
  {
     totalPrice += price; 
  }
  else
  {
    totalPrice -= price;
  }
  

  $("#vysledok").text(totalPrice + " Kč");
}
Radek9
Profil
Kcko:
Máš nějaký zvláštní důvod tam cpát jQuery?
Witiko
Profil
<input type="checkbox" name="suroviny[]" data-cena="16" value="1"> Jedlo1 
<input type="checkbox" name="suroviny[]" data-cena="25" value="2"> Jedlo2 
<input type="checkbox" name="suroviny[]" data-cena="36" value="3"> Jedlo3 
<input type="checkbox" name="suroviny[]" data-cena="11" value="4"> Jedlo4 
<span id="výsledok">0</span>Kč

<script>
  (function(suroviny, výsledok, súčet) {
    var i = 0, j; while(j = suroviny[i++]) j.onclick = (function(cena) {return function() {
      if(this.checked) súčet += cena; else súčet -= cena;
      výsledok.nodeValue = súčet;
    }})(+j.getAttribute("data-cena"));
  })(document.getElementsByName("suroviny[]"), (this.výsledok || document.getElementById("výsledok")).firstChild, 0);
</script>
Bez jQuery a přesto krátké a kompaktní: http://pastehtml.com/view/bffca4zrv.html
Kcko
Profil
Radek9:
Tu cenu si mozem zadefinovat niekde do onclick a
potom to nejako cez jquery spocitat.


Pokud máš stejnou úchylku jako Chamurappi a jemu podobní (nenávist k jQuery), povídej si o tom s ním. Já na to ani na Tebe nejsem zvědavavý.
Witiko
Profil
Kcko:
jako Chamurappi a jemu podobní (nenávist k jQuery)
Myslíš jako třeba mě? :-) Když dám stranou věc osobní preference, tak je často kód, který tu lidé s jQuery splodí, poměrně nečitelný - asi díky jejich naprosté neznalosti podložního jazyka, technologií a technik algoritmizace. S Tvým kódem v tomto ohledu problém nemám - jedná se o velmi čitelný zápis činnosti scriptu. Nicméně stejně je tu framework příslovečným kanónem na vrabce.
Kcko
Profil
Witiko:
Třeba i Tebe, ale za poslední dobu jsi se uklidnil, stejně tak jako já, takže se o věčném tématu bavit nemusíme >:]. Zakladatel topicu dle toho co požaduje, už framework jQuery pravděpodobně použivá, takže na to není nutno brát ohled.

Je teda fakt, že toto

 $("#vysledok").text(totalPrice + " Kč");

šlo zapsat pomocí innerHtml a k jQuery bychom se vůbec nedostali. (Síla zvyku).

Můj kód byl napsán tak, aby byl pro tazatele co nejpochopitelnější (jeho neznalost lze snadno odhadnout dle tohoto topicu ...).
U tvého kódu s tím bude mít celkem problém, nemyslíš? ;-) (On, nikoliv Ty nebo tobě podobně zdatní ...)

Hezký večer.
Witiko
Profil
Kcko:
za poslední dobu jsi se uklidnil
To ani ne, jen se sem nedostanu tak často. :D

šlo zapsat pomocí innerHtml
Nebo pomocí přímé manipulace s DOM Textovými Uzly, viz. můj kód řádek 11. :-)

U tvého kódu s tím bude mít celkem problém, nemyslíš?
Je tomu tak, můj kód je zaměřen na maximální kompaktnost. Nicméně zasílající má vždy možnost dotázat se proč, co a jak, pokud má skutečně zájem. Já to tak dělal, když jsem tu začínal. :-) Občas připíšu do kódu i komentáře, nicméně těžko bez věštící koule odhadnout úroveň odesilatele a co ještě pochopí / nepochopí.
juho123
Profil *
Dakujem Vam velmi pekne.

Chcel by som pomoct este s jednou vecou a to:

<input type="checkbox" name="suroviny[]" value="1" onclick="addPrice(100,this);"> Jedlo1
<input type="checkbox" name="suroviny[]" value="2" onclick="addPrice(200,this);"> Jedlo2
<input type="checkbox" name="suroviny[]" value="3" onclick="addPrice(300,this);"> Jedlo3
<input type="checkbox" name="suroviny[]" value="4" onclick="addPrice(400,this);"> Jedlo4

<div id="sumarizacia">
  <ul>
  <li>Jedlo3 <a href="#">vymazat</a></li>
  ...
  </ul>
</div>

<div id=vysledok></div>


Jednoducho, ked si to jedlo zakliknem, tak sa mi dole vypisu vsetky zakliknute.
Viete mi prosim poradit?

Dakujem za Vase rady.
Kcko
Profil
Takto např.

http://jquery.jslab.net/zkousecka/#3de097d8070b7ca86f4463b019875194

$(document).ready(function(){
  
});

var totalPrice = 0;
var zakliknute = [];

function addPrice(price, obj)
{
  if (obj.checked)
  {
     totalPrice += price; 
  }
  else
  {
    totalPrice -= price;
  }
  
   zakliknute = []; // clear
   $(":checkbox:checked").each(function(){
   zakliknute.push(this.value);
});
    



  $("#vysledok").text(totalPrice + " Kč, zakliknuté jsou: " + zakliknute.toString()  );
}
juho123
Profil *
Dakujem velmi pekne!

a este ked tam mam select box, kde mam pocet kusov,
teda ked dam ze 5, tak este celu sumu vynasobi 5-timy.

Ako to prosim Vas spravit?

Velka vdaka!
Kcko
Profil
http://jquery.jslab.net/zkousecka/#7aebd6a72ca0d6610816464e2888278b
juho123
Profil *
Dakujem, si borec!

Este ked s niecim nebudem pohnut, dam vediet.

Este raz velka vdaka.
Chamurappi
Profil
Reaguji na Kcka:
Tvé skripty počítají s tím, že se při každém kliknutí změní stav zatržení. V Exploreru při druhém kliknutí během dvojkliku ke změně nedojde, ale ke kliknutí ano, takže se cena zvedá/snižuje dvakrát. Méně zkušení brouzdalové zbytečně dvojklikají docela často.
V Opeře šel dvojklikem (tuším) také vytvořit nějaký hůře patrný problém, ale ve stávající verzi se mi ho nepovedlo napodobit. Ovšem podařilo se mi v ní teď naopak změnit stav, aniž bych vyvolal událost kliknutí :-)


Reaguji na juha123:
potom to nejako cez jquery spocitat
Framework neřeší aritmetiku.

Hodil bych si onclick na obalující formulář a v něm projel všechny this["suroviny[]"], cenu bych si dal buď do atributů (jako Witiko) nebo do pole definovaného klidně přímo v tom onclicku, jehož indexy by odpovídaly pořadí zaškrtávátek.
Kcko
Profil
Chamurappi:
V Exploreru při druhém kliknutí během dvojkliku ke změně nedojde, ale ke kliknutí ano, takže se cena zvedá/snižuje dvakrát.


Vyzkouším si. Proč by měl někdo na checkbox klikat 2x? Klikneš jednou a je zakliknuto.

Edit: Je to tak, při madness klikání se uvedená "chyba" projeví, jak se to opraví?

juho123:
Večer Ti kód přepíši odznova. Tohle je strašnej bastl ;-)
_es
Profil
Kcko:
se uvedená "chyba" projeví, jak se to opraví?
Zmenou výpočtu celkovej sumy.
Napríklad tak, že sa stav checkboxu uloží do poľa, obsahujúceho stavy aj ostatných checkboxov a až z toho poľa sa vyráta celková cena.
Je to menej výpočtovo náročné, než prechádzanie všetkých checkboxov v cykle pri každom kliknutí ([#14] Chamurappi).
Kcko
Profil
_es:
Ok díky
Chamurappi
Profil
Reaguji na Kcka:
Proč by měl někdo na checkbox klikat 2x?
Protože v tajuplném světě počítačů dvojklik funguje na spoustě míst lépe než jeden klik — to je jedna z pouček, kterým dobře rozumějí jen začátečníci :-)
Ze stejného důvodu také určité procento lidí docela často dvojkliká na malé obrázkové odkazy (pokud jim dojde, že jde o odkazy).

Mimochodem Mozilla též umí na zaškrtávátku ignorovat druhou půlku dvojkliku — pokud se dvojkliká na přidružený <label>. Ale tam vzniká jen jedna událost onclick.

jak se to opraví?
Použiješ .change z jQuery, kde je exploreří chování nejspíš ošetřené :-)
Ale stejně mi to celé připadá tak nějak na vodě.
juho123
Profil *
Kcko:
juho123:
Večer Ti kód přepíši odznova. Tohle je strašnej bastl ;-)

Ok, pockam, dakujem velmi pekne!
Witiko
Profil
juho123:
<form name="formulár">
  <input type="checkbox" name="suroviny[]" data-cena="16" id="0" value="0"> <label for="0">Svíčková s brusinkami</label><br>
  <input type="checkbox" name="suroviny[]" data-cena="25" id="1" value="1"> <label for="1">Vepřové se zelím</label><br>
  <input type="checkbox" name="suroviny[]" data-cena="36" id="2" value="2"> <label for="2">Medvědí tlapa</label><br> 
  <input type="checkbox" name="suroviny[]" data-cena="11" id="3" value="3"> <label for="3">Snídaně čínského mnicha</label><hr>
  <span id="výsledok">0</span> Kč, Zatrhnuté <span id="seznam">nie je nič</span>
</form>

<script> 
  (function(formulár, labely, výsledok, seznam, súčet, súpis) { 
    formulár.onclick = function(e) {
      e = e || event;
      var cieľ = e.target || e.srcElement,
          cena = +cieľ.getAttribute("data-cena"),
          hodnota = labely[cieľ.id].firstChild.nodeValue,
          index = súpis.indexOf(hodnota);
      if(cieľ.checked) {
        súčet += cena;
        if(index === -1) súpis.push(hodnota);
      } else {
        súčet -= cena;
        if(index !== -1) súpis.splice(index, 1);
      } seznam.nodeValue = !súpis.length?"nie je nič":(
                            súpis.length === 1?"je: " + súpis[0]:
                                               "sú: " + súpis.join(", "));
        výsledok.nodeValue = súčet;
    };
  })(document.formulár, document.formulár.getElementsByTagName("label"),
    (this.výsledok || document.getElementById("výsledok")).firstChild,
    (this.seznam   || document.getElementById("seznam"))  .firstChild, 0, []);
  Array.prototype.indexOf = function(needle) {
    for(var i = 0, l = this.length; i !== l; i++)
      if(this[i] === needle) return i; return -1;
  };
</script>
http://pastehtml.com/view/bffca4zrv.html
Něco jsem také stvořil, aby tu neměl Kcko monopol. :D
Chamurappi
Profil
Reaguji na Witika:
aby tu neměl Kcko monopol
S tímhle kódem nejspíš nebudeš v očích juhoa123 moc konkurenceschopný :-)
Nebylo by lepší oddělit funkci od jejího volání a nehandrkovat se se zbytečnými optimalizacemi typu (this.výsledok || document.getElementById("výsledok")) a zapisováním do nodeValue? Snažíš se snad ukázat, jak je to bez frameworku komplikované?

var cieľ = (e || event).target
Na exploreřím eventu není target, ale srcElement.

formulár.onchange
Explorer vyvolává onchange na zaškrátávátkách, až když ztratí focus. Proto je lepší chytat kliknutí.
Kcko
Profil
Witiko:
Něco jsem také stvořil, aby tu neměl Kcko monopol. :D

A už se mi nic psát nechce, nebudeme se tu přeci predhánět kdo dodá líbivější či zoptimalizovanější kód ne? >:], jdu si radši zahrát mafii 2
Witiko
Profil
Chamurappi:
Odpovídáš moc dlouho, oboje jsem opravil ještě než ses ozval. :D Jinak jak jsem konkurenceschopný v očích juhoy123 mi nevadí, ten by nejraději, abych to psal v jQuery. :-) Na to, že je to bez frameworku mi přijde můj kód ještě docela krátký.
Kcko
Profil
Witiko:
Ještě mu doplň cenu * počet kusů ze selectboxu ;-), aby to bylo kompletní.
Witiko
Profil
Kcko:
Myslíš počet porcí. :-)
_es
Profil
Witiko:
Nie je tam toho kódu trochu priveľa?
Na čo bude informácia, čo sa zaškrtlo, to je predsa jasne vidieť už z tých zaškrtávadiel.
Asi by to stačilo nejako takto (ukážka):
<!doctype html>
<meta charset="utf-8">
<form name="formulár">
  <input type="checkbox" name="suroviny[]" data-cena="16" id="0" value="0"> <label for="0">Svíčková s brusinkami</label><br>
  <input type="checkbox" name="suroviny[]" data-cena="25" id="1" value="1"> <label for="1">Vepřové se zelím</label><br>
  <input type="checkbox" name="suroviny[]" data-cena="36" id="2" value="2"> <label for="2">Medvědí tlapa</label><br> 
  <input type="checkbox" name="suroviny[]" data-cena="11" id="3" value="3"> <label for="3">Snídaně čínského mnicha</label><hr>  <span id="vysledok">0</span> Kč
</form><script>
  var ch=[], cena=[], el=document.forms[0].elements, n=0, vystup=document.getElementById("vysledok");
  for(var i=0; i<el.length; i++){
    if(el[i].name=="suroviny[]"){
      ch[n]=el[i].checked=false; cena[n++]=Number(el[i].getAttribute("data-cena")); el[i].onclick=f;
    }
  }
  function f(){
    var vysledok=0;
    ch[this.id]=this.checked;
    for(var i=0; i<n; i++)vysledok+=ch[i]*cena[i];
    vystup.innerHTML=vysledok;
  }
</script>
Witiko
Profil
_es:
Ta informace by byla k ničemu, ale juho123 chce výpis zaškrtnutých jídel. Minimalistická verze je už zde.
_es
Profil
Witiko:
Minimalistická verze je už zde.
Trpí to neduhom, ktorý popísal Chamurappi. Rýchlym klikaním sa dá v IE8 vyrobiť záporný súčet alebo chybu v JS: 'labely[...].firstChild' is null or not an object.
Witiko
Profil
_es:
V odkazovaném kódu se proměnná labely nevyskytuje.
_es
Profil
Witiko:
V odkazovaném kódu se proměnná labely nevyskytuje.
Testoval som to v tom odkaze na pastehtml.com, tam je iný kód, no možnosť nezosúladenia celkovej ceny so zaškrtnutými checkboxami bude asi aj vo vloženom kóde v príspevku, pretože sa k celkovej sume priráta alebo odráta niečo po udalosti onclick, namiesto úpravy výpočtu celkovej sumy navrhnutej v [#16].
« 1 2 »

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0