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

如何禁用搜索输入框中已选中的下拉列表项?(点击触发、无提交按钮)

实现点击搜索框时禁用已选中的下拉列表项

没问题,我来帮你搞定这个需求!咱们一步步来实现,核心思路是跟踪已选中的列表项,在点击搜索框时同步这些项的禁用状态,同时处理数据加载和选中状态的交互:

1. 先搞定JSON数据加载与下拉列表渲染

首先我们需要加载JSON数据,把药品选项渲染到下拉列表里,同时用一个集合来记录已选中的药品ID(方便快速查找)。假设你的JSON文件名为medicines.json,结构类似[{"id": 1, "name": "阿司匹林"}, {"id": 2, "name": "布洛芬"}...]:

// 用Set存储已选中的药品ID,自动去重且查找高效
let selectedMedicines = new Set();
// 存储药品ID和对象的映射,方便后续快速获取药品信息
let medicineMap = new Map();

// 加载JSON数据并渲染下拉列表
async function loadMedicines() {
  try {
    const response = await fetch('medicines.json');
    const medicines = await response.json();
    const dropdown = document.getElementById('li-psearch');
    
    // 清空下拉列表,保留分隔线
    dropdown.innerHTML = '<li role="presentation" class="divider-search"></li>';
    
    medicines.forEach(medicine => {
      medicineMap.set(medicine.id, medicine);
      const li = document.createElement('li');
      li.setAttribute('role', 'presentation');
      li.dataset.id = medicine.id;
      li.innerHTML = `<a role="menuitem" tabindex="-1" href="#">${medicine.name}</a>`;
      
      // 点击下拉项时切换选中状态
      li.addEventListener('click', () => {
        if (selectedMedicines.has(medicine.id)) {
          // 取消选中
          selectedMedicines.delete(medicine.id);
          li.classList.remove('disabled');
        } else {
          // 标记为选中
          selectedMedicines.add(medicine.id);
          li.classList.add('disabled');
        }
        // 更新右侧的已选结果列表
        updateResultList();
      });
      
      dropdown.appendChild(li);
    });
  } catch (error) {
    console.error('加载药品数据失败:', error);
  }
}

// 更新已选结果列表(把选中的药品显示出来,支持移除)
function updateResultList() {
  const resultList = document.getElementById('result');
  resultList.innerHTML = '';
  
  selectedMedicines.forEach(id => {
    const medicine = medicineMap.get(id);
    const li = document.createElement('li');
    li.className = 'list-group-item';
    li.textContent = medicine.name;
    
    // 添加移除按钮,点击后取消选中
    const removeBtn = document.createElement('button');
    removeBtn.className = 'btn btn-sm btn-danger float-right';
    removeBtn.textContent = '移除';
    removeBtn.addEventListener('click', () => {
      selectedMedicines.delete(id);
      // 同步更新下拉列表的禁用状态
      const dropdownItem = document.querySelector(`#li-psearch li[data-id="${id}"]`);
      if (dropdownItem) dropdownItem.classList.remove('disabled');
      updateResultList();
    });
    
    li.appendChild(removeBtn);
    resultList.appendChild(li);
  });
}

2. 点击搜索框时禁用已选中项

接下来给搜索输入框绑定点击事件,每次点击时遍历下拉列表,把已选中的项设置为禁用状态(视觉上灰掉,且无法点击):

// 监听搜索框的点击事件,同步已选中项的禁用状态
document.getElementById('medicineSearchBar').addEventListener('click', () => {
  const dropdownItems = document.querySelectorAll('#li-psearch li:not(.divider-search)');
  dropdownItems.forEach(item => {
    const medicineId = parseInt(item.dataset.id);
    if (selectedMedicines.has(medicineId)) {
      // 标记为禁用
      item.classList.add('disabled');
      item.style.pointerEvents = 'none'; // 阻止点击
      item.style.opacity = '0.6'; // 视觉上灰化
    } else {
      // 恢复可用状态
      item.classList.remove('disabled');
      item.style.pointerEvents = 'auto';
      item.style.opacity = '1';
    }
  });
});

3. 页面初始化

最后在页面加载完成时调用数据加载函数,启动整个流程:

// 页面DOM加载完成后初始化
document.addEventListener('DOMContentLoaded', loadMedicines);

补充样式(可选)

你可以给禁用状态的列表项加个CSS样式,让视觉效果更明显:

#li-psearch li.disabled {
  cursor: not-allowed;
}
#li-psearch li.disabled a {
  color: #6c757d;
}

这样就完成啦!每次点击搜索框时,已选中的下拉项都会自动变成禁用状态,无法重复选择,同时已选列表支持移除操作,状态会自动同步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:16:41