You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JQuery计算动态输入项的价格与数量 订餐Web应用开发问题

实现思路

核心逻辑是封装一个全局的总价计算函数,监听所有菜品行的单价变更和数量变更事件,每次触发时遍历所有菜品行计算累加总和即可,兼容你已有的动态新增行逻辑。


第一步:优化PHP接口(修复SQL注入风险)

你现有的PHP代码虽然用了prepare,但直接拼接SQL参数存在严重注入风险,修改为参数绑定写法:

<?php    
    require 'DBConnection.php';
    $code = '';
    if(isset($_POST["code"])){
        $id = $_POST["code"];
        // 改为参数绑定避免注入
        $get_c = $pdo->prepare("SELECT * FROM all_menu WHERE `item_name` = ?");
        $get_c->execute([$id]); 
        while ($row = $get_c->fetch()) {
            $code .= $row['price'];
        }
        echo $code.'.00';
    }
?>

第二步:替换原有jQuery逻辑

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>  
<script>
$(document).ready(function(){
    var nextRowID = 0;

    // 公共计算总价函数
    function calculateTotal() {
        let total = 0;
        // 遍历所有菜品行
        $('.getval').each(function() {
            let price = parseFloat($(this).find('.price').val()) || 0;
            let quantity = parseInt($(this).find('.quantity').val()) || 0;
            total += price * quantity;
        });
        // 保留两位小数赋值给总金额
        $('#total').val(total.toFixed(2));
    }

    // 新增行逻辑
    $('#add').click(function(e){
        e.preventDefault();
        var id = ++nextRowID;
        $('#append').append(`<div class="form-group"><label class="control-label col-lg-4"></label><div id ="diva" class="col-lg-4"><div class="box"><header><h5>تفاصيل الطلب</h5></header><div class="body getval"><div class="form-group"><label class="control-label col-lg-2">الصنف</label><div class="col-lg-10"><select id="itemname${id}" name="itemname[]" class="form-control"><option disabled selected>اختر الصنف</option><?php echo getValues($pdo); ?></select></div></div><div class="form-group"><label class="control-label col-lg-2">السعر</label><div class="col-lg-10"><input type="text" id="price${id}" name="price[]" placeholder="-" readonly class="form-control price"></div></div><div class="form-group"><label class="control-label col-lg-2">الكمية</label><div class="col-lg-10"><input class="form-control quantity" type="number" name="quantity[]" value="0" min="1"></div></div></div></div></div></div>`);
    });

    // 事件委托监听所有菜品选择变更(兼容静态+动态新增行)
    $(document).on('change', 'select[name^="itemname"]', function(){
        const $currentRow = $(this).closest('.getval');
        const $priceInput = $currentRow.find('.price');
        var code = $(this).val();  
        $.ajax({
            type: 'POST',
            url: 'pages/GetPrice.php',
            data:{code:code},
            success: function(data){
                $priceInput.val(data);
                // 单价更新后重新计算总价
                calculateTotal();
            },
            error: function (jqXHR, textStatus, errorThrown){
                alert(errorThrown);
            }
        });
    });

    // 事件委托监听所有数量输入变更
    $(document).on('input change', 'input[name^="quantity"]', function(){
        calculateTotal();
    });
});
</script>

方案说明

  • 用事件委托替代单独绑定事件,不需要为每个新增行重复写监听逻辑,代码更简洁易维护
  • 每次修改菜品、修改数量都会自动触发总价重算,自动累加所有行的单价*数量结果
  • 兼容你原有HTML结构和动态新增行的逻辑,不需要修改现有HTML代码

内容的提问来源于stack exchange,提问作者Hazem Behairy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:24:03