当前位置:首页 > JavaScript

js实现级联菜单

2026-01-30 14:13:51JavaScript

使用纯JavaScript实现级联菜单

通过监听父级菜单的change事件动态加载子菜单数据

js实现级联菜单

// 获取DOM元素
const provinceSelect = document.getElementById('province');
const citySelect = document.getElementById('city');
const districtSelect = document.getElementById('district');

// 模拟数据
const data = {
  '江苏省': ['南京市', '苏州市', '无锡市'],
  '浙江省': ['杭州市', '宁波市', '温州市']
};

const cityData = {
  '南京市': ['玄武区', '秦淮区', '建邺区'],
  '苏州市': ['姑苏区', '虎丘区', '吴中区']
};

// 省份选择变化时触发
provinceSelect.addEventListener('change', function() {
  const selectedProvince = this.value;
  citySelect.innerHTML = '<option value="">请选择城市</option>';
  districtSelect.innerHTML = '<option value="">请选择区县</option>';

  if (selectedProvince) {
    data[selectedProvince].forEach(city => {
      const option = document.createElement('option');
      option.value = city;
      option.textContent = city;
      citySelect.appendChild(option);
    });
  }
});

// 城市选择变化时触发
citySelect.addEventListener('change', function() {
  const selectedCity = this.value;
  districtSelect.innerHTML = '<option value="">请选择区县</option>';

  if (selectedCity) {
    cityData[selectedCity].forEach(district => {
      const option = document.createElement('option');
      option.value = district;
      option.textContent = district;
      districtSelect.appendChild(option);
    });
  }
});

使用Fetch API动态获取数据

从后端API异步获取级联数据

js实现级联菜单

document.getElementById('category').addEventListener('change', async function() {
  const categoryId = this.value;
  const subcategorySelect = document.getElementById('subcategory');

  subcategorySelect.innerHTML = '<option value="">加载中...</option>';

  try {
    const response = await fetch(`/api/subcategories?categoryId=${categoryId}`);
    const subcategories = await response.json();

    subcategorySelect.innerHTML = '<option value="">请选择子分类</option>';
    subcategories.forEach(item => {
      const option = document.createElement('option');
      option.value = item.id;
      option.textContent = item.name;
      subcategorySelect.appendChild(option);
    });
  } catch (error) {
    console.error('获取数据失败:', error);
    subcategorySelect.innerHTML = '<option value="">加载失败</option>';
  }
});

使用事件委托优化性能

对多个级联菜单使用事件委托减少事件监听器数量

document.querySelector('.cascade-container').addEventListener('change', function(event) {
  if (event.target.classList.contains('level-1')) {
    const selectedValue = event.target.value;
    const level2Select = event.target.nextElementSibling;

    // 清除现有选项
    level2Select.innerHTML = '<option value="">请选择</option>';

    // 根据选择加载数据
    if (selectedValue) {
      // 这里添加数据加载逻辑
    }
  }

  if (event.target.classList.contains('level-2')) {
    // 处理第二级选择变化
  }
});

封装可复用级联组件

创建可复用的级联菜单构造函数

class CascadeMenu {
  constructor(options) {
    this.parentSelect = document.getElementById(options.parentId);
    this.childSelect = document.getElementById(options.childId);
    this.dataSource = options.dataSource;
    this.init();
  }

  init() {
    this.parentSelect.addEventListener('change', () => this.updateChildOptions());
  }

  async updateChildOptions() {
    const parentValue = this.parentSelect.value;
    this.childSelect.innerHTML = '<option value="">请选择</option>';

    if (!parentValue) return;

    let childData;
    if (typeof this.dataSource === 'function') {
      childData = await this.dataSource(parentValue);
    } else {
      childData = this.dataSource[parentValue] || [];
    }

    childData.forEach(item => {
      const option = new Option(item.text, item.value);
      this.childSelect.add(option);
    });
  }
}

// 使用示例
new CascadeMenu({
  parentId: 'country',
  childId: 'state',
  dataSource: {
    'US': [
      { value: 'CA', text: 'California' },
      { value: 'NY', text: 'New York' }
    ]
  }
});

标签: 菜单级联
分享给朋友:

相关文章

vue 实现级联

vue 实现级联

Vue 实现级联选择 级联选择(Cascader)是一种常见的前端交互组件,通常用于多层级数据的选择(如省市区选择)。以下是基于 Vue 2 和 Vue 3 的实现方法。 使用 Element UI…

纯css制作下拉菜单

纯css制作下拉菜单

使用纯CSS制作下拉菜单 HTML结构需要嵌套列表,外层为触发元素,内层为下拉内容。以下是一个基础结构示例: <div class="dropdown"> <button cl…

vue实现菜单切换

vue实现菜单切换

Vue 实现菜单切换的方法 在 Vue 中实现菜单切换通常涉及动态绑定类名、条件渲染或状态管理。以下是几种常见的方法: 动态绑定 class 实现高亮切换 通过 v-bind:class 动态绑定类…

vue实现菜单效果

vue实现菜单效果

Vue实现菜单效果的方法 基础菜单实现 使用Vue的v-for指令和v-show/v-if可以快速实现基础菜单。通过数据驱动的方式渲染菜单项,结合事件处理实现交互。 <template>…

vue  实现多级菜单

vue 实现多级菜单

实现多级菜单的基本思路 在Vue中实现多级菜单通常需要递归组件或动态渲染嵌套数据结构。核心是通过组件递归调用自身,或利用v-for遍历嵌套的菜单数据。 递归组件实现方式 定义菜单数据结构 数据格式…

vue实现垂直菜单

vue实现垂直菜单

实现垂直菜单的基本结构 在Vue中实现垂直菜单,通常需要使用<ul>和li>标签构建菜单项,结合Vue的v-for指令动态渲染菜单数据。以下是一个基础模板: <templat…