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

为何Select下拉框设置disabled属性后选项仍处于启用状态?

解决下拉框选项禁用后仍可选择的问题

我明白你的困扰——直接修改原生<option>的disabled属性后,看起来DOM已经变了,但插件生成的下拉框还是能选对应的选项。这是因为你用了Bootstrap Select(从代码里的selectpicker方法能看出来)这类UI插件,它们会把原生<select>转换成自定义的交互层,原生DOM的变化不会自动同步到插件UI上。下面用原生JS给你一步步解决:


第一步:先修正代码里的小笔误

你在addToSelect函数里定义了var input1 = document.getElementById('unallowedInput');,但循环里却写了eingabe1.appendChild(opt1);,这会直接报错,先改成:

input1.appendChild(opt1);

第二步:实现正确的禁用逻辑(原生JS)

我们需要完成三件事:获取当前选中项、同步另一个下拉框的禁用状态、通知插件刷新UI。假设你的第二个下拉框ID是allowedInput(记得替换成你实际的ID),修改后的disableOption函数如下:

function disableOption() {
  // 获取当前触发事件的下拉框
  const currentSelect = document.getElementById('unallowedInput');
  // 获取另一个下拉框(替换成你的实际ID)
  const otherSelect = document.getElementById('allowedInput');

  // 拿到当前选中的所有选项的value(因为是多选,要处理多个选中项)
  const selectedValues = Array.from(currentSelect.selectedOptions).map(opt => opt.value);

  // 遍历另一个下拉框的所有选项,设置禁用/启用状态
  Array.from(otherSelect.options).forEach(opt => {
    opt.disabled = selectedValues.includes(opt.value);
  });

  // 关键:通知Bootstrap Select刷新UI,让禁用状态真正生效
  if (typeof currentSelect.selectpicker === 'function') {
    currentSelect.selectpicker('refresh');
    otherSelect.selectpicker('refresh');
  }
}

第三步:实现双向同步

别忘了给第二个下拉框也加上onchange事件,这样当你在第二个下拉框选选项时,第一个下拉框的对应选项也会被禁用:

<div class="select_box"> 
  <select id="allowedInput" onchange="disableOption()" class="select2 col-lg-12" multiple title="Auswählen" data-max-options="3" data-max-options-text="Es dürfen nur drei Elemente ausgewählt werden!"></select> 
</div>

为什么之前的操作没生效?

你修改原生<option>的disabled属性后,Bootstrap Select的交互层根本不知道这个变化——这类插件会在初始化时生成一套独立的DOM来展示下拉选项,必须调用它的refresh方法,让插件重新读取原生<select>的状态并更新UI,这样禁用的选项才会真正不能被选中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:33:12