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

Laravel 5.6动态输入框ID递增及求和校验问题

解决方案

我来帮你搞定这个动态输入框的问题,下面是完整的实现方案,涵盖动态ID递增、实时总和计算和提交校验:

1. 完善Blade模板(支持动态增删输入框)

先把你的表单补充完整,既支持初始输入框渲染,也能动态添加/删除输入框:

<form method="post" id="customExamForm" action="{{ route('exams.custom') }}">
    {{ csrf_field() }}
    <h3 class="page-title">Сэдэв</h3>
    <div class="panel panel-default">
        <div class="panel-heading"> Сэдэв сонголт </div>
        <div class="panel-body">
            <!-- 输入框容器 -->
            <div id="scoreInputsContainer">
                <!-- 渲染初始输入框 -->
                @foreach ($duplicates as $index => $item)
                    <div class="input-group mb-3">
                        <input type="number" 
                               class="form-control score-input" 
                               id="score_{{ $index + 1 }}" 
                               name="scores[]" 
                               value="{{ old('scores.' . $index, 0) }}"
                               min="0"
                               step="1">
                        <button type="button" class="btn btn-danger remove-input">Устгах</button>
                    </div>
                @endforeach
                <!-- 如果没有初始数据,默认生成一个输入框 -->
                @empty($duplicates)
                    <div class="input-group mb-3">
                        <input type="number" 
                               class="form-control score-input" 
                               id="score_1" 
                               name="scores[]" 
                               value="0"
                               min="0"
                               step="1">
                        <button type="button" class="btn btn-danger remove-input">Устгах</button>
                    </div>
                @endempty
            </div>
            <!-- 添加输入框按钮 -->
            <button type="button" id="addScoreInput" class="btn btn-primary">Нэмэх</button>
            <!-- 总和显示区域 -->
            <div class="mt-3">
                <strong>Нийт дүн: </strong><span id="totalScore">0</span>
            </div>
            <!-- 表单提交按钮 -->
            <button type="submit" class="btn btn-success mt-3">Илгээх</button>
        </div>
    </div>
</form>

2. JavaScript实现核心功能

把这段脚本放在模板底部或者外部JS文件中,实现动态ID生成、总和计算和提交校验:

document.addEventListener('DOMContentLoaded', function() {
    const container = document.getElementById('scoreInputsContainer');
    const addButton = document.getElementById('addScoreInput');
    const totalSpan = document.getElementById('totalScore');
    const form = document.getElementById('customExamForm');

    // 计算所有输入框的数值总和
    function calculateTotal() {
        const inputs = document.querySelectorAll('.score-input');
        let total = 0;
        inputs.forEach(input => {
            const value = parseInt(input.value) || 0;
            total += value;
        });
        totalSpan.textContent = total;
        return total;
    }

    // 生成下一个递增的输入框ID
    function getNextInputId() {
        const inputs = document.querySelectorAll('.score-input');
        let maxIdNum = 0;
        inputs.forEach(input => {
            const idNum = parseInt(input.id.split('_')[1]);
            if (idNum > maxIdNum) maxIdNum = idNum;
        });
        return `score_${maxIdNum + 1}`;
    }

    // 绑定添加输入框事件
    addButton.addEventListener('click', function() {
        const newId = getNextInputId();
        const inputGroup = document.createElement('div');
        inputGroup.className = 'input-group mb-3';
        inputGroup.innerHTML = `
            <input type="number" 
                   class="form-control score-input" 
                   id="${newId}" 
                   name="scores[]" 
                   value="0"
                   min="0"
                   step="1">
            <button type="button" class="btn btn-danger remove-input">Устгах</button>
        `;
        container.appendChild(inputGroup);

        // 给新输入框绑定输入事件
        inputGroup.querySelector('.score-input').addEventListener('input', calculateTotal);
        // 给新删除按钮绑定事件
        inputGroup.querySelector('.remove-input').addEventListener('click', function() {
            // 至少保留一个输入框
            if (document.querySelectorAll('.score-input').length > 1) {
                inputGroup.remove();
                calculateTotal();
            } else {
                alert("Хамгийн багадаа нэг оруулах талбай байх ёстой!");
            }
        });
    });

    // 绑定初始删除按钮事件
    document.querySelectorAll('.remove-input').forEach(button => {
        button.addEventListener('click', function() {
            if (document.querySelectorAll('.score-input').length > 1) {
                this.parentElement.remove();
                calculateTotal();
            } else {
                alert("Хамгийн багадаа нэг оруулах талбай байх ёстой!");
            }
        });
    });

    // 绑定初始输入框的输入事件
    document.querySelectorAll('.score-input').forEach(input => {
        input.addEventListener('input', calculateTotal);
    });

    // 表单提交前的校验
    form.addEventListener('submit', function(e) {
        const total = calculateTotal();
        if (total >= 50) {
            e.preventDefault();
            alert("Нийт дүн 50-с их байна! Илгээх боломжгүй.");
        }
        // 总和小于50时,表单正常提交
    });

    // 页面加载时先计算一次总和
    calculateTotal();
});

关键细节说明

  • 动态ID递增:通过getNextInputId函数遍历现有输入框,提取ID中的数字部分,取最大值加1生成新ID,确保ID唯一且连续递增。
  • 实时总和计算:监听每个输入框的input事件,每次输入变化时自动重新计算总和并更新显示。
  • 提交校验:在表单提交时触发总和计算,若总和≥50则阻止提交并弹出提示,否则允许表单正常提交。
  • 输入框保护:限制用户删除所有输入框,避免表单出现异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:42:00