[Javascript] Ricalcolo Totale jQuery

giumazzi

Utente Attivo
16 Feb 2017
27
2
3
provincia PESARO
Sono nuovo a jQuery quindi vado per tentativi e chiedo a chi è più esperto un aiuto.

Questa è la parte di codice incriminata
Codice:
 click: function () { //Click event
  if (this.status() == 'available') { //optional seat
   var maxSeats = 3;
   var ms = sc.find('selected').length;
   //alert(ms);
   if (ms < maxSeats) {
   
                price = this.settings.data.price;
                
                /*
                    $('<option selected>R'+(this.settings.row+1)+' S'+this.settings.label+'</option>')
                    .attr('id', 'cart-item-'+this.settings.id)
                    .attr('value', (this.settings.row+1)+'_'+this.settings.label)
                    .data('seatId', this.settings.id)
                    .appendTo($cart);
                */
                    
                    $('<option selected>R'+(this.settings.row+1)+' S'+this.settings.label+'</option>')
                    .attr('id', 'cart-item-'+this.settings.id)
                    .attr('value', this.settings.id)
                    .attr('alt', price)
                    .data('seatId', this.settings.id)
                    .appendTo($cart);

                $counter.text(sc.find('selected').length+1);
                $counter.attr('value', sc.find('selected').length+1);

                $total.text(recalculateTotal(sc));
                $total.attr('value', recalculateTotal(sc));

                return 'selected';
            }
                alert('You can only choose '+ maxSeats + ' seats.');
                return 'available';

        } else if (this.status() == 'selected') { //Checked

                //Update Number
                $counter.text(sc.find('selected').length-1);
                $counter.attr('value', sc.find('selected').length-1);
                //update totalnum
                $total.text(recalculateTotal(sc));
                $total.attr('value', recalculateTotal(sc));

                //Delete reservation
                $('#cart-item-'+this.settings.id).remove();
                //optional
                return 'available';

        } else if (this.status() == 'unavailable') { //sold
            return 'unavailable';

        } else {
            return this.style();
        }
    }
});

Il problema in particolare è nella parte relativa a al ricalcolo del totale
Codice:
                $total.text(recalculateTotal(sc));
                $total.attr('value', recalculateTotal(sc));
in pratica questa funzione calcola il totale del prezzo ad ogni click su una mappa e lo ricalcola quando viene cliccato nuovamente l'elemento (deselezionandolo).
Quando clicco per selezionare la funzione calcola il totale correttamente, mentre quando riclicco un elemento per deselezionarlo, alla prima deselezione (o riclick), l'importo non viene sottratto.

Per essere più concreto faccio un esempio:
se seleziono tre elementi al prezzo di 10 euro ciascuno, ad ogni click il totale viene aggiornato correttamente (10+10+10=30);
quando deseleziono i tre elementi, al primo click il totale non viene aggiornato mentre mentre nei successivi riclick il totale viene sì aggiornato ma non ritorna =0 bensì 10.

Cioè mi trovo che non essendo selezionato alcun elemento, il totale mi riporta 10!

Ho provato ad inserire questa variazione ma il calcolo viene completamente errato

Codice:
...........
...........
                $total.text(recalculateTotal(sc)+this.settings.data.price);
                $total.attr('value', recalculateTotal(sc)+this.settings.data.price);
                return 'selected';

            }

                alert('You can only choose '+ maxSeats + ' seats.');
                return 'available';

        } else if (this.status() == 'selected') { //Checked
......
......
                //update totalnum
                $total.text(recalculateTotal(sc)-this.settings.data.price);
                $total.attr('value', recalculateTotal(sc)-this.settings.data.price);

Qualche suggerimento?

Grazie
 
Ciao, non che ci abbia capito molto ma forse devi prima eliminare l'elemento ( .remove() ) e poi ricalcolare il totale.
Eventualmente posta anche la funzione recalculateTotal();
 
  • Like
Reactions: giumazzi
QUI il video che dimostra il problema
nei primi 11 secondi, quando seleziono i posti (E10, E9, E8) il totale viene calcolato!
dal 12 secondo alla fine, cioè quando deseleziono E8 , E9, E10, il totale viene ricalcolato solo da E9 e da E10!
 
perchè fai il ricalcolo prima di aver tolto l'elemento. Hai provato ad invertire come ti ho suggerito ?
 
  • Like
Reactions: giumazzi
Codice:
                //Delete reservation
                $('#cart-item-'+this.settings.id).remove();
                //optional
                return 'available';

Dove lo piazzeresti?
Prima di
Codice:
                //Update Number
                $counter.text(sc.find('selected').length-1);
                $counter.attr('value', sc.find('selected').length-1);
                //update totalnum
                $total.text(recalculateTotal(sc));
                $total.attr('value', recalculateTotal(sc));
?
 
RISOLTO!!! @criric
ecco il listato funzionante
Codice:
 click: function () { //Click event
  if (this.status() == 'available') { //optional seat
   var maxSeats = 3;
   var ms = sc.find('selected').length;
   //alert(ms);
   if (ms < maxSeats) {
  
                price = this.settings.data.price;
                
                /*
                    $('<option selected>R'+(this.settings.row+1)+' S'+this.settings.label+'</option>')
                    .attr('id', 'cart-item-'+this.settings.id)
                    .attr('value', (this.settings.row+1)+'_'+this.settings.label)
                    .data('seatId', this.settings.id)
                    .appendTo($cart);
                */
                    
                    $('<option selected>R'+(this.settings.row+1)+' S'+this.settings.label+'</option>')
                    .attr('id', 'cart-item-'+this.settings.id)
                    .attr('value', this.settings.id)
                    .attr('alt', price)
                    .data('seatId', this.settings.id)
                    .appendTo($cart);

                $counter.text(sc.find('selected').length+1);
                $counter.attr('value', sc.find('selected').length+1);

                $total.text(recalculateTotal(sc));
                $total.attr('value', recalculateTotal(sc));

                return 'selected';
            }
                alert('You can only choose '+ maxSeats + ' seats.');
                return 'available';

        } else if (this.status() == 'selected') { //Checked

                //Update Number
                $counter.text(sc.find('selected').length-1);
                $counter.attr('value', sc.find('selected').length-1);

                //Delete reservation
                $('#cart-item-'+this.settings.id).remove();

                //update totalnum
                $total.text(recalculateTotal(sc));
                $total.attr('value', recalculateTotal(sc));


                //optional
                return 'available';

        } else if (this.status() == 'unavailable') { //sold
            return 'unavailable';

        } else {
            return this.style();
        }
    }
});
 
  • Like
Reactions: criric

Discussioni simili