当前位置:首页 > JavaScript

原生js实现类目选择器

2026-03-02 01:48:55JavaScript

实现思路

使用原生JavaScript创建一个类目选择器,涉及DOM操作、事件监听和数据绑定。核心功能包括动态渲染选项、处理用户交互(如点击、悬浮)以及返回选中值。

HTML结构

构建基础的HTML结构,包含一个触发按钮和下拉菜单容器:

<div class="category-selector">
  <button class="selector-btn">选择类目</button>
  <div class="dropdown-menu hidden">
    <ul class="category-list"></ul>
  </div>
</div>

CSS样式

添加基础样式控制布局和交互状态:

.category-selector {
  position: relative;
  display: inline-block;
}

.dropdown-menu {
  position: absolute;
  border: 1px solid #ddd;
  background: white;
  width: 200px;
  max-height: 300px;
  overflow-y: auto;
}

.hidden {
  display: none;
}

.category-list li {
  padding: 8px 12px;
  cursor: pointer;
}

.category-list li:hover {
  background-color: #f5f5f5;
}

JavaScript实现

完整逻辑分为数据加载、DOM渲染和事件处理三部分:

初始化选择器

class CategorySelector {
  constructor(containerId, options) {
    this.container = document.getElementById(containerId);
    this.categories = options.data || [];
    this.onSelect = options.onSelect || function() {};
    this.initDOM();
    this.bindEvents();
  }
}

渲染列表

initDOM() {
  this.container.innerHTML = `
    <button class="selector-btn">${this.placeholder || '选择类目'}</button>
    <div class="dropdown-menu hidden">
      <ul class="category-list"></ul>
    </div>
  `;

  const listContainer = this.container.querySelector('.category-list');
  this.categories.forEach(category => {
    const li = document.createElement('li');
    li.textContent = category.name;
    li.dataset.value = category.id;
    listContainer.appendChild(li);
  });
}

事件绑定

bindEvents() {
  const btn = this.container.querySelector('.selector-btn');
  const dropdown = this.container.querySelector('.dropdown-menu');

  btn.addEventListener('click', () => {
    dropdown.classList.toggle('hidden');
  });

  dropdown.querySelectorAll('li').forEach(item => {
    item.addEventListener('click', () => {
      btn.textContent = item.textContent;
      dropdown.classList.add('hidden');
      this.onSelect(item.dataset.value);
    });
  });
}

使用方法

实例化选择器并配置回调:

const categories = [
  { id: '1', name: '电子产品' },
  { id: '2', name: '家居用品' },
  { id: '3', name: '服装配饰' }
];

new CategorySelector('selector-container', {
  data: categories,
  onSelect: (selectedId) => {
    console.log('选中ID:', selectedId);
  }
});

功能扩展

支持多级嵌套分类:

原生js实现类目选择器

renderNestedCategories(categories, parentEl) {
  categories.forEach(category => {
    const li = document.createElement('li');
    li.innerHTML = `<span>${category.name}</span>`;

    if (category.children) {
      const ul = document.createElement('ul');
      this.renderNestedCategories(category.children, ul);
      li.appendChild(ul);
    }

    parentEl.appendChild(li);
  });
}

注意事项

  1. 动态加载数据时需调用重新渲染方法
  2. 点击外部区域应关闭下拉框,需添加全局点击监听
  3. 移动端需考虑触摸事件兼容性
  4. 大量数据时建议实现虚拟滚动优化性能

标签: 类目选择器
分享给朋友:

相关文章

制作css选择器

制作css选择器

CSS选择器基础语法 CSS选择器用于定位HTML文档中的元素,以便为其应用样式。常见的基础选择器包括: 元素选择器:直接使用HTML标签名(如p、div) 类选择器:以.开头(如.header)…

js实现选择器

js实现选择器

实现基础选择器 使用 document.querySelector 或 document.querySelectorAll 实现类似 CSS 的选择器功能。前者返回第一个匹配元素,后者返回所有匹配的…

js实现父选择器

js实现父选择器

在JavaScript中,没有直接的“父选择器”方法,但可以通过DOM操作或选择器组合实现类似功能。以下是几种常见方法: 通过parentNode属性获取父元素 使用parentNode属性可以获取…

jquery标签选择器

jquery标签选择器

jQuery 标签选择器 jQuery 标签选择器用于直接选取 HTML 元素,通过标签名(如 div、p、a 等)匹配 DOM 元素。语法简单高效,适合快速操作特定类型的元素。 语法格式 $("…

jquery子选择器

jquery子选择器

jQuery 子选择器 jQuery 的子选择器用于选择某个元素的直接子元素,语法为 parent > child。这种选择器只匹配直接嵌套在父元素内的子元素,而不会匹配更深层次的后代元素。…

jquery兄弟选择器

jquery兄弟选择器

jQuery 兄弟选择器 jQuery 提供了多种选择器用于选取兄弟元素(即与当前元素同级的其他元素)。以下是常见的兄弟选择器及其用法: 相邻兄弟选择器(+) 选取紧接在指定元素后的第一个兄弟元素:…