当前位置:首页 > JavaScript

js实现级联菜单

2026-03-01 05:18:09JavaScript

实现级联菜单的方法

使用JavaScript实现级联菜单可以通过动态操作DOM元素和事件监听来完成。以下是常见的实现方式:

基础HTML结构

<select id="province">
  <option value="">请选择省份</option>
</select>

<select id="city">
  <option value="">请选择城市</option>
</select>

<select id="district">
  <option value="">请选择区县</option>
</select>

数据准备

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

初始化省份菜单

js实现级联菜单

const provinceSelect = document.getElementById('province');
for (const province in data) {
  const option = document.createElement('option');
  option.value = province;
  option.textContent = province;
  provinceSelect.appendChild(option);
}

城市菜单联动

provinceSelect.addEventListener('change', function() {
  const citySelect = document.getElementById('city');
  citySelect.innerHTML = '<option value="">请选择城市</option>';

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

区县菜单联动

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

const citySelect = document.getElementById('city');
citySelect.addEventListener('change', function() {
  const districtSelect = document.getElementById('district');
  districtSelect.innerHTML = '<option value="">请选择区县</option>';

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

使用jQuery简化实现

如果项目中已引入jQuery,可以使用更简洁的语法:

js实现级联菜单

$(function() {
  // 省份变化时更新城市
  $('#province').change(function() {
    $('#city').html('<option value="">请选择城市</option>');
    const province = $(this).val();

    if (province && data[province]) {
      $.each(data[province], function(i, city) {
        $('#city').append($('<option>').val(city).text(city));
      });
    }
  });

  // 城市变化时更新区县
  $('#city').change(function() {
    $('#district').html('<option value="">请选择区县</option>');
    const city = $(this).val();

    if (city && districtData[city]) {
      $.each(districtData[city], function(i, district) {
        $('#district').append($('<option>').val(district).text(district));
      });
    }
  });
});

使用现代前端框架实现

在Vue中实现级联菜单:

new Vue({
  el: '#app',
  data: {
    provinces: Object.keys(data),
    cities: [],
    districts: [],
    selectedProvince: '',
    selectedCity: '',
    selectedDistrict: ''
  },
  watch: {
    selectedProvince(newVal) {
      this.cities = newVal ? data[newVal] : [];
      this.selectedCity = '';
      this.districts = [];
    },
    selectedCity(newVal) {
      this.districts = newVal ? districtData[newVal] : [];
      this.selectedDistrict = '';
    }
  }
});

对应的HTML模板:

<div id="app">
  <select v-model="selectedProvince">
    <option value="">请选择省份</option>
    <option v-for="province in provinces" :value="province">
      {{ province }}
    </option>
  </select>

  <select v-model="selectedCity">
    <option value="">请选择城市</option>
    <option v-for="city in cities" :value="city">
      {{ city }}
    </option>
  </select>

  <select v-model="selectedDistrict">
    <option value="">请选择区县</option>
    <option v-for="district in districts" :value="district">
      {{ district }}
    </option>
  </select>
</div>

性能优化建议

对于大型数据集,可以考虑以下优化措施:

  • 使用虚拟滚动技术处理大量选项
  • 实现懒加载,只在需要时请求下级数据
  • 添加防抖处理频繁的选择变化
  • 缓存已加载的数据减少重复请求

注意事项

  • 确保菜单的初始状态正确
  • 处理边界情况如空选择
  • 考虑添加默认选项和重置功能
  • 保持UI一致性,如禁用下级菜单直到上级被选择

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

相关文章

vue实现左右菜单联动实现

vue实现左右菜单联动实现

Vue 实现左右菜单联动 数据绑定与状态管理 在 Vue 中实现左右菜单联动,核心是通过共享状态或事件通信实现数据同步。可以通过 Vuex 或组件间的 props/emit 机制管理联动状态。 //…

vue实现左右菜单

vue实现左右菜单

实现左右菜单的基本思路 使用Vue实现左右菜单通常需要两个主要组件:左侧的导航菜单和右侧的内容区域。左侧菜单负责导航功能,右侧区域根据菜单选择动态展示对应内容。 创建基本组件结构 在Vue项目中创建…

vue菜单tab实现

vue菜单tab实现

Vue 菜单 Tab 实现方法 使用动态组件切换内容 通过 Vue 的 component 动态组件结合 v-for 渲染菜单项,点击时切换显示内容: <template> <…

纯css制作tab菜单

纯css制作tab菜单

纯CSS制作Tab菜单的方法 使用radio input控制Tab切换 通过<input type="radio">和<label>元素配合:checked伪类实现Tab切换效…

vue 实现多级菜单

vue 实现多级菜单

Vue 实现多级菜单的方法 递归组件实现 递归组件是处理多级菜单的常见方式,通过组件调用自身实现无限层级嵌套。 <template> <ul> <li v-…

vue实现菜单缩放

vue实现菜单缩放

实现思路 通过 Vue 的响应式数据和 CSS 过渡效果,结合动态绑定 class 或 style 来实现菜单的缩放功能。核心是利用 v-bind:class 或 v-bind:style 控制菜单宽…