当前位置:首页 > JavaScript

网页js实现筛选

2026-02-02 17:33:55JavaScript

使用原生JavaScript实现筛选功能

通过监听输入框事件或按钮点击触发筛选逻辑。以下示例基于数组数据筛选:

// 假设有以下数据
const items = [
  { id: 1, name: 'Apple', category: 'fruit' },
  { id: 2, name: 'Carrot', category: 'vegetable' },
  { id: 3, name: 'Banana', category: 'fruit' }
];

// 获取DOM元素
const searchInput = document.getElementById('search-input');
const filterButton = document.getElementById('filter-btn');
const resultsContainer = document.getElementById('results');

// 实现筛选函数
function filterItems() {
  const searchTerm = searchInput.value.toLowerCase();
  const filtered = items.filter(item => 
    item.name.toLowerCase().includes(searchTerm) || 
    item.category.toLowerCase().includes(searchTerm)
  );

  renderResults(filtered);
}

// 渲染结果函数
function renderResults(filteredItems) {
  resultsContainer.innerHTML = filteredItems.map(item => 
    `<div class="item">
      <h3>${item.name}</h3>
      <p>${item.category}</p>
    </div>`
  ).join('');
}

// 添加事件监听
searchInput.addEventListener('input', filterItems);
filterButton.addEventListener('click', filterItems);

// 初始渲染
renderResults(items);

使用事件委托优化性能

对于动态生成的列表项,使用事件委托处理筛选:

document.addEventListener('DOMContentLoaded', () => {
  const container = document.querySelector('.item-container');

  container.addEventListener('input', (e) => {
    if (e.target.matches('.filter-control')) {
      const filterValue = e.target.value.toLowerCase();
      const items = container.querySelectorAll('.item');

      items.forEach(item => {
        const text = item.textContent.toLowerCase();
        item.style.display = text.includes(filterValue) ? '' : 'none';
      });
    }
  });
});

多条件复合筛选

实现多个筛选条件的组合查询:

function advancedFilter() {
  const nameFilter = document.getElementById('name-filter').value;
  const categoryFilter = document.getElementById('category-filter').value;
  const minId = document.getElementById('min-id').value;

  const filtered = items.filter(item => {
    return (!nameFilter || item.name.includes(nameFilter)) &&
           (!categoryFilter || item.category === categoryFilter) &&
           (!minId || item.id >= parseInt(minId));
  });

  renderResults(filtered);
}

使用URL参数保持筛选状态

将筛选条件保存在URL中以便页面刷新后保持状态:

// 读取URL参数
const params = new URLSearchParams(window.location.search);
if (params.has('filter')) {
  searchInput.value = params.get('filter');
  filterItems();
}

// 更新URL参数
function updateURL() {
  const params = new URLSearchParams();
  params.set('filter', searchInput.value);
  window.history.replaceState({}, '', `${location.pathname}?${params}`);
}

searchInput.addEventListener('input', () => {
  filterItems();
  updateURL();
});

性能优化建议

对于大数据量场景考虑以下优化方案:

// 使用防抖减少频繁触发
let debounceTimer;
searchInput.addEventListener('input', () => {
  clearTimeout(debounceTimer);
  debounceTimer = setTimeout(filterItems, 300);
});

// 使用Web Worker处理复杂计算
if (window.Worker) {
  const filterWorker = new Worker('filter-worker.js');
  filterWorker.onmessage = function(e) {
    renderResults(e.data);
  };

  function useWorkerFilter() {
    filterWorker.postMessage({
      items: largeDataSet,
      filter: searchInput.value
    });
  }
}

可视化筛选组件实现

创建带交互效果的筛选UI组件:

class FilterComponent {
  constructor(selector, data) {
    this.container = document.querySelector(selector);
    this.data = data;
    this.filters = {};
    this.init();
  }

  init() {
    this.renderFilterControls();
    this.renderResults(this.data);
  }

  renderFilterControls() {
    // 生成基于数据特征的筛选控件
    const categories = [...new Set(this.data.map(d => d.category))];
    const filterHTML = categories.map(cat => `
      <label>
        <input type="checkbox" value="${cat}" checked> 
        ${cat}
      </label>
    `).join('');

    this.container.innerHTML = `
      <div class="filters">${filterHTML}</div>
      <div class="results-container"></div>
    `;

    this.container.querySelectorAll('input').forEach(input => {
      input.addEventListener('change', () => this.applyFilters());
    });
  }

  applyFilters() {
    const activeFilters = Array.from(
      this.container.querySelectorAll('input:checked')
    ).map(input => input.value);

    this.filters.categories = activeFilters;
    this.updateResults();
  }

  updateResults() {
    const filtered = this.data.filter(item => 
      this.filters.categories.includes(item.category)
    );
    this.renderResults(filtered);
  }

  renderResults(items) {
    const resultsContainer = this.container.querySelector('.results-container');
    resultsContainer.innerHTML = items.map(item => `
      <div class="item">${item.name}</div>
    `).join('');
  }
}

// 使用示例
new FilterComponent('#app', items);

网页js实现筛选

标签: 网页js
分享给朋友:

相关文章

vue网页实现

vue网页实现

Vue 网页实现指南 环境准备 安装 Node.js 和 npm/yarn,确保环境配置正确。使用 Vue CLI 或 Vite 创建项目框架,快速搭建开发环境。 npm install -g @…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('imag…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式…