原始程式碼問題
- 總計算邏輯錯誤:`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>
關鍵修正點
- 事件委派:使用 `.on('click', '.selector', fn)` 處理動態新增列
- 價格解析健壯化:`.replace('¥', '').replace(',', '')` 移除貨幣格式
- 單列計算函數獨立:`updateRowTotal()` 可複用於新增/刪除/修改
- 輸入驗證:`Math.max(1, ...)` 確保最小值 1,`change` 事件處理手動輸入
資料屬性化建議(更佳架構)
<td class="price" data-price="150">¥150</td>
// JS 讀取
var price = parseFloat($row.find('.price').data('price'));