Общая сумма одной отображаемой строки - PullRequest
0 голосов
/ 24 апреля 2020

Я вычислил сумму каждой строки и попытался вычислить сумму каждой строки, но отображается только строка, количество которой изменилось. Как рассчитать общее количество каждой строки? Jquery версия 2.2.4.

<tr class="cartoon">
    <td class="col-sm-1 col-md-1 quantity"  style="text-align: center">
        <input type="number" class="form-control fname"   value="1" min="1" label="">
    </td>
    <td class="col-sm-1 col-md-1 text-center pr-01 price" ><strong></strong>
        <input type="hidden" class="form-control artprice"  value="1" label="">
    </td>
    <td class="col-sm-1 col-md-1 text-center pr-01 total" ><strong></strong>
        <input type="hidden" class="form-control total" name = "cart" value="" label="">
    </td>
    <td class="col-sm-1 col-md-1">
        <div class="product" data-id = "key" >
        <button type="button" class="btn btn-danger remove-from-cart" >
            Remove
        </button>
        </div>
    </td>
</tr>

<tr>
    <td></td>
    <td > <h3  style="color: white;" id="cart-total">Total</h3></td>
    <td></td>
    <td>  <div class="text-right final" ><strong>14.5$ </strong></div></td>
    <td></td>
</tr>

Javascript:

jQuery($ => {
    $('.fname').on('change', function() {
        let total = 0;
        let final = 0;
        let $row = $(this).closest('tr');
        let price = $row.find(".artprice").val();
        $row.find('.total strong').text( (this.value * price).toFixed(2)+ '$' );
        $('tr').each(function(){
            total = total + parseFloat($('.artprice').val())*parseFloat($('.fname').val());
        });
        $('.final strong').text(total + '$');
    });
});

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Вы пропустили табличный тег, так что ближайший не работает.

Во-вторых, вы получите artprice без необходимости изменения контекста на $(item).find('.artprice').val()

Вы можете использовать функцию уменьшения для вычисления общего числа, как показано ниже

total = [...document.getElementsByTagName("tr")].reduce((acc, item)=>{
 if($(item).find('.artprice').val() != undefined){
 let subtotal = parseFloat($(item).find('.artprice').val()) * parseFloat($(item).find('.fname').val());
 acc += subtotal;
}
 return acc;
}, 0);

jQuery($ => {
    $('.fname').on('change', function() {
        let total = 0;
        let final = 0;
        
        let $row = $(this).closest('tr');
        let price = $row.find(".artprice").val();
       
        $row.find('.total strong').text( (this.value * price).toFixed(2)+ '$' );
        <!-- $('tr').each(function(){ -->
            <!-- total = total + parseFloat($('.artprice').val())*parseFloat($('.fname').val()); -->
        <!-- }); -->
		total = [...document.getElementsByTagName("tr")].reduce((acc, item)=>{
			if($(item).find('.artprice').val() != undefined){
			let subtotal = parseFloat($(item).find('.artprice').val()) * parseFloat($(item).find('.fname').val());
			acc += subtotal;
			}
			return acc;
		}, 0);
        $('.final strong').text(total + '$');
    });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<table>
<tr class="cartoon">
    <td class="col-sm-1 col-md-1 quantity"  style="text-align: center">
        <input type="number" class="form-control fname"   value="1" min="1" label="">
    </td>
    <td class="col-sm-1 col-md-1 text-center pr-01 price" ><strong></strong>
        <input type="hidden" class="form-control artprice"  value="1" label="">
    </td>
    <td class="col-sm-1 col-md-1 text-center pr-01 total" ><strong></strong>
        <input type="hidden" class="form-control total" name = "cart" value="" label="">
    </td>
    <td class="col-sm-1 col-md-1">
        <div class="product" data-id = "key" >
        <button type="button" class="btn btn-danger remove-from-cart" >
            Remove
        </button>
        </div>
    </td>
</tr>
<tr class="cartoon">
    <td class="col-sm-1 col-md-1 quantity"  style="text-align: center">
        <input type="number" class="form-control fname"   value="1" min="1" label="">
    </td>
    <td class="col-sm-1 col-md-1 text-center pr-01 price" ><strong></strong>
        <input type="hidden" class="form-control artprice"  value="1" label="">
    </td>
    <td class="col-sm-1 col-md-1 text-center pr-01 total" ><strong></strong>
        <input type="hidden" class="form-control total" name = "cart" value="" label="">
    </td>
    <td class="col-sm-1 col-md-1">
        <div class="product" data-id = "key" >
        <button type="button" class="btn btn-danger remove-from-cart" >
            Remove
        </button>
        </div>
    </td>
</tr>
<tr>
    <td></td>
    <td > <h3  style="color: white;" id="cart-total">Total</h3></td>
    <td></td>
    <td>  <div class="text-right final" ><strong>14.5$ </strong></div></td>
    <td></td>
</tr>
</table>
0 голосов
/ 25 апреля 2020

Вот рабочий JSfIddle , основанный на вашем коде.

Вот еще один JSFiddle лучшего подхода , с меньшим, более чистым и простым кодом - описание ниже .

Проблема в том, что в последнем разделе JS, где вы суммируете final общее количество тележек:

$('tr').each(function(){
    // ...

Вы используете селектор $('.artprice'). Но их несколько, и этот селектор будет соответствовать всем им. Возможно, вы ожидали, что $('.artprice').val() на самом деле даст вам все значения или сумму, но это не так, просто вы получите значение самого первого значения на странице.

Та же проблема для $('.fname').val() - она ​​просто даст вам значение первого, а не всего, а не суммы.

Так что вам нужно применить тот же тип логики обхода c к этому последнему разделу суммирования, как вы делали в первом разделе, вычисляя цену измененной строки:

// Use .cartoon so we only match product rows, not the cart-total row
$('tr.cartoon').each(function(){
    $row = $(this);
    price = parseFloat($row.find('.artprice').val());
    quantity = parseFloat($row.find('.fname').val());
    total = total + price * quantity;
    console.log('price', price, 'quantity', quantity, 'total', total);
});
$('.final strong').text(total + '$');

Но , если вы сделаете шаг назад, эта final cart- Итоговая секция фактически делает то же самое, что и секция, которая вычисляет цену для измененной строки. Он рассчитывает цену для каждой строки и суммирует их для итоговой суммы. Таким образом, вы можете удалить первую часть и просто использовать второй финал l oop, чтобы сделать все. Второй JSFiddle , который я связал выше, делает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...