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

多选搜索框点击输入框时如何清空内容并显示全部选项?

问题解决:多选下拉框点击输入框后显示全量选项

问题根源

你每次筛选时都从当前DOM的this.dom.items中获取选项,但筛选后不符合条件的项会被移除出DOM,导致this.dom.items只剩之前筛选后的结果。当清空输入框再点击输入框时,filterOptions只能基于这些剩余项筛选,自然无法显示全量列表。

修复步骤

1. 初始化时保存全量选项列表

在组件的初始化逻辑(比如构造函数或init方法)中,把所有原始选项保存到实例变量,避免依赖DOM动态变化:

// 初始化阶段执行,比如构造函数里
this.allOptions = Array.from(this.dom.items);

2. 修改filterOptions函数,基于全量列表筛选

将原本从DOM取选项的逻辑替换为使用保存的全量列表,同时区分搜索高亮和选中状态的样式类(避免冲突):

filterOptions() {
    this.dom.select.classList.add('open');
    this.dom.select.classList.remove('closed');

    // 改用初始化时保存的全量选项列表
    const items = this.allOptions;
    const typedValue = this.dom.input.value.toLowerCase().trim();

    this.filteredOptions = items.filter(val => val.innerText.toLowerCase().indexOf(typedValue) > -1);

    if (this.filteredOptions.length) {
      this.dom.selectOptions.innerHTML = '';

      for (let i = 0; i < this.filteredOptions.length; i += 1) {
        // 用highlight类标记搜索匹配项,和选中状态的active类区分
        if (typedValue !== this.filteredOptions[i].innerText.trim().toLowerCase()) {
          this.filteredOptions[i].classList.remove('highlight');
        } else {
          this.filteredOptions[i].classList.add('highlight');
        }
        // 保留选中项的active类,不要覆盖
        this.dom.selectOptions.appendChild(this.filteredOptions[i]);
      }
    } else {
      this.dom.selectOptions.innerHTML = '<div class="no_results">No results found</div>';
    }
}

3. 选中项后立即触发全量筛选

在multiSelect函数清空输入框后,手动调用filterOptions,确保下拉框立即显示全量选项:

multiSelect(target) {
    const optionsArr = this.selectedOptions;
    const li = target.closest('.item');
    const input = li.querySelector('input');
    const itemValue = input.value;
    const typedValue = this.dom.input.value.toLowerCase().trim();

    if (target.tagName !== 'INPUT') {
      input.checked = !input.checked;
    }

    li.classList.toggle('active', input.checked);

    if (input.checked) {
      this.dom.input.value = '';
      // 清空输入框后立即调用筛选,展示全量选项
      this.filterOptions();
    } 

    if (optionsArr.indexOf(itemValue) === -1) {
      optionsArr.push(itemValue);
    } else {
      optionsArr.splice(optionsArr.indexOf(itemValue), 1);
    }
}

4. 绑定输入框点击事件(如果未绑定)

确保点击输入框时触发筛选逻辑,此时输入框为空,会自动显示全量选项:

// 初始化时绑定点击事件
this.dom.input.addEventListener('click', () => this.filterOptions());

效果说明

修改后,无论之前进行过多少次筛选操作,只要输入框为空(包括选中项后清空),点击输入框都会展示所有原始选项,不会受之前筛选的DOM变化影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:40:22