Autor Zpráva
Pleak
Profil *
Zdravím,

mám následující kód:
https://codepen.io/anon/pen/eLwaQg

A mám zde problém, kdy potřenuji na základě hodnoty v input#listku násobit s input#cena_listek, ale hodnotu z input#listku my to bere vždy tu předcházející před změnou pomocí + / -. Pokud hodnotu zadám do inputu přímo, přepočet funguje v pořádku.

Mohl bych poprosit o radu, kde je problém?

Děkuji moc
DarkMeni
Profil
Pomůže, když tam místo $('.qty-input').on('click', '.plus', function (e) //... bude jen $('.plus').on('click', function (e) //...

Ale správnější by asi bylo na konec těch funkcí dát $('#listku').trigger('change'); a z $(document).ready() odebrat to $(".plus, .minus").click(formChanged);

Jinak ještě jedna rada, místo vypisování pokaždý $(this).parent().siblings('input') by se to mohlo uložit do proměné, třeba s názvem input, a pak bude stačit psát jen to "input" místo celého toho selektoru.
Pleak
Profil *
Díky moc za pomoc, ještě řeším jednu drobnou věc, přidal jsem tam možnosti platby a v případě, že se platí hotově, tak by se měl zobrazit výběr pobočky:
codepen.io/anon/pen/gBgpXo

Což funguje bez problémů, ale v případě, že je zvolená platba "Hotově" a kliknu na "+" nebo "-", tak se tam zbytečně stále skrývá a znovu zobrazuje div#pobocky. Dá se to prosím nějak vyřešit? Snažil jsem se z části:
        $( "#pobocky" ).hide( "slow" );
        if(platba == 3)$( "#pobocky" ).show( "slow" );

Vytvořit samostatnou funkci a volat ji po "formchanged()" pouze v "$('#listku').trigger", ale to bohužel nezafungovalo.

Moc díky za radu
DarkMeni
Profil
Já bych to celkově upravil asi takto:
// Zmena poctu listku    
function zmenPocet() {
    
    var n = 1; // predpoklad: class="plus"
    if(this.classList.contains('minus')) n = -1; // class="minus"
    
    var input = $('#listku');
    var pocet = parseInt(input.val(), 10) + n;
    if(pocet < 1) pocet = 1;
    
    input.val(pocet);
    input.trigger('change'); // umele vyvolani eventu, jelikoz input.val() sam o sobe event nevyvola
    // tzn. ze se spusti jeste funkce formChanged, ktera je navazana na tento input pri "onchange" eventu
}

// formChanged()
function formChanged() {
    
    var listku = parseInt($("#listku").val(), 10);
    var cena_listek = $('#cena_listek').val();
    var platba = $("input[name='platba']:checked").val();
    var cena_celkem = 0;
    var poplatek = 0;
    
    poplatek = listku * 19;
    cena_celkem = (cena_listek * listku) + poplatek;
    
    
    if(platba == 3)
    {
        cena_celkem = cena_listek * listku;
        $( "#pobocky" ).show( "slow" );
    } 
    else $( "#pobocky" ).hide( "slow" );
    
    $( "#cena" ).text(Math.ceil(cena_celkem) + ' Kč');  
    $( ".price-tax" ).text(poplatek);  
}

// document Ready()
$(document).ready(function(){
    
    // Navazani eventu na tlacitka a inputy
    $('.qty-input button').on('click', zmenPocet);
    
    $('#listku, input[name="platba"]').on('change', formChanged);

    // $('#listku').trigger('change'); 
    
});

1) Na .plus, .minus stačí jedna funkce a v ní podmínka jestli je potřeba přičíst 1 nebo odečíst
2) Definice funkce uvnitř jiné funkce zde není potřeba, takže formChanged může být venku, ať je to přehlednější
3) $('#listku').trigger( ... ) neslouží k navazování funkcí které se mají provést, ale k vyvolání eventu (když už je funkce pro daný event navázaná přes $('#listku').on( ... ) )
4) Pokud má nějaký html element id, tak ho není třeba vybírat přes $('input#listku') ani $(this).parent().siblings('input'), stačí $('#listku'), protože id by mělo být unikátní - žádný jiný element na stránce by neměl mít stejné id (na to pak slouží class, to může mít stejné několik elementů)

Ale ke konkrétnímu dotazu:
    
    // ve funkci formChange() obalit $("#pobocky").show do podmínky
    if(platba == 3)
    {
        cena_celkem = cena_listek * listku;
        $( "#pobocky" ).show( "slow" );
    } 
    else $( "#pobocky" ).hide( "slow" );

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