当前位置:首页 > 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组件:

网页js实现筛选

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实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 const…

js实现上传文件

js实现上传文件

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。 <input type="file"…

js 实现全屏

js 实现全屏

使用 requestFullscreen 方法 通过调用元素的 requestFullscreen 方法可以实现全屏。该方法兼容现代浏览器,但不同浏览器可能需要前缀。 const element =…