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

基于Laravel7+jQuery:动态表格新增行实现产品价格联动显示

解决Laravel动态表格产品选择联动价格问题

问题核心是动态新增的DOM元素没有绑定事件监听,初始代码只给页面加载时存在的第一个选择框绑定了change事件,后续新增的行无法触发联动逻辑。下面是具体修改方案:

1. 修改jQuery事件绑定方式(关键)

将直接绑定元素事件改为事件委托,把事件监听绑定到静态存在的父容器上(比如表格tbody),这样后续动态添加的子元素也能触发事件。

原错误代码示例(仅第一行有效)

// 仅绑定初始加载的第一个select元素
$('select.product').change(function() {
    let productId = $(this).val();
    let price = getProductPrice(productId);
    // 直接选中全局第一个input.price,导致所有行价格同步错误
    $('input.price').val(price);
});

修改后的正确代码

// 事件委托到静态父容器(比如表格tbody)
$('#dynamic-table tbody').on('change', 'select.product', function() {
    let $currentSelect = $(this);
    let productId = $currentSelect.val();
    
    // 方式一:从预加载的产品数据中获取价格(推荐,减少AJAX请求)
    // 提前在Blade模板中注入产品数据
    let price = products.find(item => item.id == productId)?.price || '';
    
    // 方式二:通过AJAX请求后端获取价格(按需使用)
    // $.get(`/products/${productId}/price`, function(data) {
    //     $currentSelect.closest('tr').find('input.price').val(data.price);
    // });
    
    // 定位到当前行的价格输入框,避免影响其他行
    $currentSelect.closest('tr').find('input.price').val(price);
});

2. 确保动态新增行的结构正确

新增行时要保证每行的select和input有对应的class(product和price),同时清空继承的选中状态和输入值:

// 新增行的示例逻辑
$('#add-row-btn').click(function() {
    let $newRow = $('#dynamic-table tbody tr:first').clone();
    // 清空新行的选择框和价格输入框
    $newRow.find('select.product').val('');
    $newRow.find('input.price').val('');
    // 添加到表格末尾
    $('#dynamic-table tbody').append($newRow);
});

3. Laravel后端数据注入优化

在Blade模板中预加载产品数据到前端,避免每次选择都发起AJAX请求:

<!-- 在页面脚本前注入产品数据 -->
<script>
    const products = {!! $products->select('id', 'name', 'price')->toJson() !!};
</script>

关键逻辑说明

  • 事件委托利用DOM事件冒泡机制,父容器能监听所有子元素的事件,包括动态新增的元素。
  • 使用closest('tr')精准定位当前选择框所在行,确保价格输入框的修改只作用于当前行,不会干扰其他行的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:01:12