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

如何从<li>元素中获取值?多筛选模块取值实现

问题描述

我搭建了三个不同的筛选模块及一个筛选按钮,计划基于这些模块实现筛选功能,现咨询如何获取各模块内<ul>下<li>元素中的值。

对应的HTML结构:

<div id="new-items" class="dropdown">
<a href="#" class="btn-selector nolink">New Items</a>
<ul class="">
  <li><span>New bestsellers</span></li>
  <li><span>New releases</span></li>
</ul>
</div>
<div id="buy" class="dropdown">
  <a href="#" class="btn-selector nolink">Buy Now</a>
  <ul class="">
    <li><span>Wallet</span></li>
    <li><span>Website</span></li>
  </ul>
</div>
<div id="sort-by" class="dropdown">
  <a href="#" class="btn-selector nolink">Sort By</a>
  <ul class="">
    <li><span>Low To High Price</span></li>
    <li><span>High To Low Price</span></li>
    <li><span>View</span></li>
    <li><span>View</span></li>
    <li><span>Rating</span></li>
    <li><span>Sale</span></li>
    <li><span>Date</span></li>
  </ul>
</div>

<button class="sc-button style letter style-2 filter"><span>Filter</span> </button>
解决方案

要实现这个需求,核心是先给每个筛选模块的选项添加选中交互,再通过筛选按钮收集各模块的选中值,下面是具体实现方式:

一、原生JavaScript实现

1. 给选项添加选中交互

绑定点击事件,让用户点击<li>时标记选中状态,同时更新模块按钮的显示文本:

// 获取所有筛选模块下的li元素
const filterItems = document.querySelectorAll('.dropdown ul li');

filterItems.forEach(item => {
  item.addEventListener('click', function() {
    // 清除当前模块内所有li的选中状态
    const parentUl = this.closest('ul');
    parentUl.querySelectorAll('li').forEach(li => li.classList.remove('selected'));
    // 标记当前点击的li为选中
    this.classList.add('selected');
    // 更新模块按钮的显示文本
    const dropdownBtn = this.closest('.dropdown').querySelector('.btn-selector');
    dropdownBtn.textContent = this.querySelector('span').textContent;
  });
});

2. 点击筛选按钮收集选中值

给按钮绑定点击事件,遍历每个模块获取选中的选项值:

const filterBtn = document.querySelector('.filter');

filterBtn.addEventListener('click', function() {
  const filterParams = {};

  // 遍历每个筛选模块
  document.querySelectorAll('.dropdown').forEach(dropdown => {
    const moduleId = dropdown.id;
    // 获取当前模块选中的文本,无选中时设为空字符串
    const selectedText = dropdown.querySelector('li.selected span')?.textContent.trim() || '';
    filterParams[moduleId] = selectedText;
  });

  // 这里替换成你的筛选逻辑,比如发起请求或处理数据
  console.log('当前筛选参数:', filterParams);
  // 示例输出:{ "new-items": "New bestsellers", "buy": "Wallet", "sort-by": "Low To High Price" }
});

3. 可选:添加选中样式(CSS)

给选中的<li>加样式,让用户能直观看到选中状态:

.dropdown ul li {
  cursor: pointer;
  padding: 8px 12px;
}
.dropdown ul li.selected {
  background-color: #f5f5f5;
  color: #2d3748;
  font-weight: 500;
}

二、jQuery实现(项目已引入jQuery时使用)

1. 绑定选中交互

$('.dropdown ul li').click(function() {
  // 清除同模块其他li的选中状态
  $(this).siblings().removeClass('selected');
  // 标记当前li为选中
  $(this).addClass('selected');
  // 更新模块按钮文本
  $(this).closest('.dropdown').find('.btn-selector').text($(this).find('span').text());
});

2. 点击按钮收集筛选值

$('.filter').click(function() {
  const filterParams = {};
  $('.dropdown').each(function() {
    const moduleId = $(this).attr('id');
    const selectedText = $(this).find('li.selected span').text().trim() || '';
    filterParams[moduleId] = selectedText;
  });
  console.log('当前筛选参数:', filterParams);
  // 执行你的筛选逻辑
});

额外需求处理

如果不需要选中状态,只是想获取所有<li>的文本值,可以直接遍历收集:

// 获取所有选项的文本数组
const allOptionTexts = Array.from(document.querySelectorAll('.dropdown ul li span')).map(span => span.textContent.trim());
console.log(allOptionTexts);

如果需要按模块分组获取所有选项:

const allModuleOptions = {};
document.querySelectorAll('.dropdown').forEach(dropdown => {
  const moduleId = dropdown.id;
  allModuleOptions[moduleId] = Array.from(dropdown.querySelectorAll('ul li span')).map(span => span.textContent.trim());
});
console.log(allModuleOptions);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:05:26