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

动态生成Select的显示隐藏问题:仅首个Select可切换

解决动态生成Select组件的独立显示/隐藏问题

你的问题核心是重复使用了相同的id属性——HTML规范里id必须是页面唯一的,所以你绑定的点击事件只会作用到第一个匹配#atb11的元素上,其他组件自然没反应。

下面是具体的修复方案,直接改代码就行:

1. 替换重复的id为class

生成HTML模板时,把原本的id="atb11"和id="atbb22"换成class,保证每个模块的元素能被独立定位:

linha += `<div class="col-3">
             <label class="toggle-select-label" style="margin-top: 5%;"><i class="pe-2x pe-va pe-7s-plus"></i> Ajudante</label>
             <div class="toggle-select-container" style="display:none;">
               <select class="js-states form-control ajuste singlet" name="auxiliar[]">
                 <option></option>
                 <option value="${data[x].Id}">${data[x].Id}</option>
               </select>
             </div>
           </div>`;

2. 用事件委托绑定点击事件,定位对应容器

因为是动态生成的元素,直接绑定事件会失效,需要用事件委托到静态父元素,然后通过DOM遍历找到当前点击标签对应的容器:

// 把原来的$('#atb11').on(...)删掉,换成下面的事件委托
$(document).on('click', '.toggle-select-label', function() {
  // 找到当前点击标签的兄弟容器(也就是对应的Select所在的div)
  $(this).next('.toggle-select-container').slideToggle('slow');
});

3. 优化代码性能

原来的循环里每次都执行$(".pagmfalta").html(linha)和Select2初始化,会重复操作DOM和初始化组件,把这些操作移到循环外面:

$(document).on('click', '.dad-pagamento', function() {
  var linha = ``;
  for (var x = 0; x < data.length; x++) {
    linha += `<div class="col-3">
                 <label class="toggle-select-label" style="margin-top: 5%;"><i class="pe-2x pe-va pe-7s-plus"></i> Ajudante</label>
                 <div class="toggle-select-container" style="display:none;">
                   <select class="js-states form-control ajuste singlet" name="auxiliar[]">
                     <option></option>
                     <option value="${data[x].Id}">${data[x].Id}</option>
                   </select>
                 </div>
               </div>`;
  }
  // 循环结束后再更新DOM,只操作一次
  $(".pagmfalta").html(linha);
  $('#minhaDiv1').show();
  
  // 一次性初始化所有新生成的Select2组件
  $(".singlet").select2({
    placeholder: "Selecione Ajudante",
    allowClear: true,
    width: '100%'
  });
});

完整修改后的代码

JavaScript部分

var data = [
   {Id: "1", },
   {Id: "2", },
   {Id: "3", },
   {Id: "4", },
   {Id: "5", },
   {Id: "6", },
];

$(document).on('click', '.dad-pagamento', function() {
  var linha = ``;
  for (var x = 0; x < data.length; x++) {
    linha += `<div class="col-3">
                 <label class="toggle-select-label" style="margin-top: 5%;"><i class="pe-2x pe-va pe-7s-plus"></i> Ajudante</label>
                 <div class="toggle-select-container" style="display:none;">
                   <select class="js-states form-control ajuste singlet" name="auxiliar[]">
                     <option></option>
                     <option value="${data[x].Id}">${data[x].Id}</option>
                   </select>
                 </div>
               </div>`;
  }
  $(".pagmfalta").html(linha);
  $('#minhaDiv1').show();
  
  $(".singlet").select2({
    placeholder: "Selecione Ajudante",
    allowClear: true,
    width: '100%'
  });
});

// 事件委托处理显示隐藏
$(document).on('click', '.toggle-select-label', function() {
  $(this).next('.toggle-select-container').slideToggle('slow');
});

HTML部分(无需修改)

<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/pixeden-stroke-7-icon@1.2.3/pe-icon-7-stroke/dist/pe-icon-7-stroke.min.css" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/select2.min.js"></script>

<button type="button" class="btn btn-info dad-pagamento" style="float: right; margin-right: 5%; margin-top: 4%;"><i class="metismenu-icon pe-7s-search"></i> Consultar </button>

<section id="s1">
  <div style="display:none" id="minhaDiv1">
        <div class="row pagmfalta">

        </div>
  </div>
</section>

这样修改后,每个标签点击只会切换自己对应的Select容器,不会影响其他组件,同时代码性能也更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:10:27