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

如何为multiselect-dropdown.js插件添加optgroup选项组展示功能

你需要对现有插件代码做3处修改,即可支持optgroup分组显示,且分组标签不带复选框:

步骤1:新增optgroup相关样式

找到JS代码中创建style标签的部分,在style.innerHTML的CSS末尾添加以下样式:

/* 分组标签样式 */
.multiselect-dropdown-optgroup {
  font-weight: bold;
  background-color: #f8f9fa;
  padding-left: 8px !important;
  cursor: default;
}
/* 禁用分组hover高亮 */
.multiselect-dropdown-optgroup:hover {
  background-color: #f8f9fa !important;
}
/* 分组下选项缩进,区分层级 */
.multiselect-dropdown-group-option {
  padding-left: 20px !important;
}
步骤2:修改选项渲染逻辑,支持optgroup解析

找到el.loadOptions函数中原来遍历Array.from(el.options).map(o=>{...})的代码段,整段替换为以下逻辑:

// 遍历select直接子节点,区分optgroup和普通option
Array.from(el.childNodes).forEach(node => {
  // 处理分组
  if(node.tagName === 'OPTGROUP'){
    // 渲染分组标签,无复选框
    const groupEl = newEl('div', {
      class: 'multiselect-dropdown-optgroup',
      text: node.label
    });
    list.appendChild(groupEl);
    // 遍历分组下的所有option
    Array.from(node.options).forEach(o => {
      const op = newEl('div', {
        class: [o.selected ? 'checked' : '', 'multiselect-dropdown-group-option'].filter(Boolean),
        optEl: o
      })
      const ic = newEl('input', {type: 'checkbox', checked: o.selected});
      op.appendChild(ic);
      op.appendChild(newEl('label', {text: o.text}));
      op.addEventListener('click', () => {
        op.classList.toggle('checked');
        op.querySelector("input").checked = !op.querySelector("input").checked;
        op.optEl.selected = !!!op.optEl.selected;
        el.dispatchEvent(new Event('change'));
      });
      ic.addEventListener('click', (ev) => {
        ic.checked = !ic.checked;
      });
      list.appendChild(op);
    })
  }
  // 处理无分组的普通option
  else if(node.tagName === 'OPTION'){
    const op = newEl('div', {
      class: node.selected ? 'checked' : '',
      optEl: node
    })
    const ic = newEl('input', {type: 'checkbox', checked: node.selected});
    op.appendChild(ic);
    op.appendChild(newEl('label', {text: node.text}));
    op.addEventListener('click', () => {
      op.classList.toggle('checked');
      op.querySelector("input").checked = !op.querySelector("input").checked;
      op.optEl.selected = !!!op.optEl.selected;
      el.dispatchEvent(new Event('change'));
    });
    ic.addEventListener('click', (ev) => {
      ic.checked = !ic.checked;
    });
    list.appendChild(op);
  }
})
步骤3:优化搜索逻辑,支持分组联动显示

找到搜索框的input事件监听代码,整段替换为以下逻辑,实现搜索时如果分组下有匹配选项,分组标签自动显示:

search.addEventListener('input', () => {
  const keyword = search.value.toUpperCase();
  let currentGroup = null;
  let groupHasMatch = false;
  list.querySelectorAll("div").forEach(d => {
    // 处理分组标签
    if(d.classList.contains('multiselect-dropdown-optgroup')){
      // 更新上一个分组的显示状态
      if(currentGroup){
        currentGroup.style.display = groupHasMatch ? 'block' : 'none';
      }
      currentGroup = d;
      groupHasMatch = false;
      d.style.display = 'none';
      return;
    }
    // 处理选项匹配
    const txt = d.querySelector("label").innerText.toUpperCase();
    const isMatch = txt.includes(keyword);
    d.style.display = isMatch ? 'block' : 'none';
    if(isMatch && currentGroup){
      groupHasMatch = true;
      currentGroup.style.display = 'block';
    }
  });
  // 更新最后一个分组的显示状态
  if(currentGroup){
    currentGroup.style.display = groupHasMatch ? 'block' : 'none';
  }
});

修改完成后即可实现需求:optgroup分组标签正常显示、无复选框、不可选中,分组下的选项自动缩进,搜索功能也可正常适配分组结构。

内容的提问来源于stack exchange,提问作者laurence keith albano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:15:05