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

如何禁止下拉框重复选择产品、批次、存储的相同组合选项

实现方案

实现思路

  • 给所有下拉框绑定值变更监听,同时存储每个下拉框的上一次选中值,用于重复时回退
  • 每次变更发生后,分别读取两组下拉的三个选中值,拼接为唯一组合字符串(比如用|拼接三个值,形如1|1|1)
  • 对比两组的组合字符串,如果完全一致则判定为重复,将当前修改的下拉框回退到上一次的值,并给出提示

完整代码实现

你现有HTML结构格式化后如下:

<div class="row div-1">
    <div class="form-group">
        <select class="form-control product-id">
            <option value="" disabled selected>Select Product</option>
            <option value="1">Product One</option>
            <option value="2">Product Two</option>
        </select>
    </div>
    <div class="form-group">
        <select class="form-control product-batch">
            <option value="" disabled selected>Select Batch</option>
            <option value="1">Batch One</option>
            <option value="2">Batch Two</option>
        </select>
    </div>
    <div class="form-group">
        <select class="form-control product-storage">
            <option value="" disabled selected>Select Storage</option>
            <option value="1">Storage One</option>
            <option value="2">Storage Two</option>
        </select>
    </div>
</div>

<div class="row div-2">
    <div class="form-group">
        <select class="form-control product-id">
            <option value="" disabled selected>Select Product</option>
            <option value="1">Product One</option>
            <option value="2">Product Two</option>
        </select>
    </div>
    <div class="form-group">
        <select class="form-control product-batch">
            <option value="" disabled selected>Select Batch</option>
            <option value="1">Batch One</option>
            <option value="2">Batch Two</option>
        </select>
    </div>
    <div class="form-group">
        <select class="form-control product-storage">
            <option value="" disabled selected>Select Storage</option>
            <option value="1">Storage One</option>
            <option value="2">Storage Two</option>
        </select>
    </div>
</div>

以下为jQuery版本的校验逻辑,适配Bootstrap技术栈:

// 初始化存储每个下拉框的上一次选中值
$('select').each(function() {
    $(this).data('lastVal', $(this).val());
});

// 监听所有下拉框的变更事件
$('select').change(function() {
    // 读取第一组的三个选中值
    const group1 = [
        $('.div-1 .product-id').val(),
        $('.div-1 .product-batch').val(),
        $('.div-1 .product-storage').val()
    ];
    // 第一组未选全时不触发校验,直接更新缓存值
    if (group1.some(item => !item)) {
        $(this).data('lastVal', $(this).val());
        return;
    }
    const group1Key = group1.join('|');

    // 读取第二组的三个选中值
    const group2 = [
        $('.div-2 .product-id').val(),
        $('.div-2 .product-batch').val(),
        $('.div-2 .product-storage').val()
    ];
    // 第二组未选全时不触发校验,直接更新缓存值
    if (group2.some(item => !item)) {
        $(this).data('lastVal', $(this).val());
        return;
    }
    const group2Key = group2.join('|');

    // 组合完全重复时回退当前选择
    if (group1Key === group2Key) {
        $(this).val($(this).data('lastVal'));
        alert('该产品+批次+存储的组合已存在,请勿重复选择');
        return;
    }

    // 校验通过,更新缓存的上一次值
    $(this).data('lastVal', $(this).val());
});

如果需要原生JS版本,可参考以下实现:

// 初始化存储每个下拉框的上一次选中值
const allSelects = document.querySelectorAll('select');
allSelects.forEach(select => {
    select.dataset.lastVal = select.value;
});

// 绑定变更事件
allSelects.forEach(select => {
    select.addEventListener('change', function() {
        // 读取第一组值
        const g1Id = document.querySelector('.div-1 .product-id').value;
        const g1Batch = document.querySelector('.div-1 .product-batch').value;
        const g1Storage = document.querySelector('.div-1 .product-storage').value;
        if (!g1Id || !g1Batch || !g1Storage) {
            this.dataset.lastVal = this.value;
            return;
        }
        const g1Key = `${g1Id}|${g1Batch}|${g1Storage}`;

        // 读取第二组值
        const g2Id = document.querySelector('.div-2 .product-id').value;
        const g2Batch = document.querySelector('.div-2 .product-batch').value;
        const g2Storage = document.querySelector('.div-2 .product-storage').value;
        if (!g2Id || !g2Batch || !g2Storage) {
            this.dataset.lastVal = this.value;
            return;
        }
        const g2Key = `${g2Id}|${g2Batch}|${g2Storage}`;

        // 重复则回退
        if (g1Key === g2Key) {
            this.value = this.dataset.lastVal;
            alert('该产品+批次+存储的组合已存在,请勿重复选择');
            return;
        }

        this.dataset.lastVal = this.value;
    });
});

逻辑说明

  • 仅当两组的三个下拉框都全部选完之后才会触发重复校验,不会在用户中途选择时误拦截
  • 出现重复组合时仅回退当前正在修改的下拉框的值,不会清空第二组所有已选内容,操作更友好
  • 组合标识用三个值拼接生成,只要任意一个值不同,组合标识就不同,不会出现误判

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:54:04