首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

購物車前端邏輯修正:數量變更時總金額同步更新的正確實作

     編輯:程式設計綜合問答

原始程式碼問題

  • 總計算邏輯錯誤:`s` 變數未重置,導致累加錯誤
  • 價格解析未移除貨幣符號 `¥`,`parseFloat` 失效
  • 未處理多商品列迭代,僅計算單一項目
  • 刪除功能缺失

修正後完整程式碼


<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script>
$(function() {
    // 快取 DOM
    var $cartTable = $('#cartTable');
    var $totalEl = $('.Total');
    
    // 單價常數(實際應從 data-price 屬性讀取)
    var UNIT_PRICE = 150;
    
    function updateRowTotal($row) {
        var qty = parseInt($row.find('.text_box').val()) || 0;
        var priceText = $row.find('.price').text().replace('¥', '').replace(',', '');
        var price = parseFloat(priceText) || UNIT_PRICE;
        var rowTotal = qty * price;
        $row.find('.Money').text('¥' + rowTotal.toFixed(2));
        return rowTotal;
    }
    
    function recalcTotal() {
        var total = 0;
        $cartTable.find('tbody tr').each(function() {
            total += updateRowTotal($(this));
        });
        $totalEl.text('總計:¥ ' + total.toFixed(2));
    }
    
    // 數量加減按鈕事件委派
    $cartTable.on('click', '.add', function() {
        var $input = $(this).siblings('.text_box');
        $input.val(parseInt($input.val()) + 1);
        recalcTotal();
    });
    
    $cartTable.on('click', '.reduce', function() {
        var $input = $(this).siblings('.text_box');
        var newVal = Math.max(1, parseInt($input.val()) - 1);
        $input.val(newVal);
        recalcTotal();
    });
    
    // 直接輸入數量同步更新
    $cartTable.on('change', '.text_box', function() {
        var val = parseInt($(this).val());
        if (isNaN(val) || val < 1) $(this).val(1);
        recalcTotal();
    });
    
    // 刪除列
    $cartTable.on('click', '.delete', function() {
        $(this).closest('tr').remove();
        recalcTotal();
    });
    
    // 全選/反選
    $('#checkAll').change(function() {
        $('.checkOne').prop('checked', this.checked);
    });
    
    // 初始化
    recalcTotal();
});
</script>

關鍵修正點

  1. 事件委派:使用 `.on('click', '.selector', fn)` 處理動態新增列
  2. 價格解析健壯化:`.replace('¥', '').replace(',', '')` 移除貨幣格式
  3. 單列計算函數獨立:`updateRowTotal()` 可複用於新增/刪除/修改
  4. 輸入驗證:`Math.max(1, ...)` 確保最小值 1,`change` 事件處理手動輸入

資料屬性化建議(更佳架構)


<td class="price" data-price="150">¥150</td>
// JS 讀取
var price = parseFloat($row.find('.price').data('price'));
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved