当前位置:首页 > JavaScript

js实现三级级联

2026-03-01 07:36:00JavaScript

三级级联实现方法

三级级联通常指三个层级的下拉菜单,后一级的选项内容根据前一级的选择动态变化。以下是使用JavaScript实现三级级联的完整方案。

数据结构准备

假设三级级联的数据结构如下,存储省、市、区的关系:

const regionData = {
  "江苏省": {
    "南京市": ["玄武区", "鼓楼区", "秦淮区"],
    "苏州市": ["姑苏区", "虎丘区", "吴中区"]
  },
  "浙江省": {
    "杭州市": ["上城区", "下城区", "江干区"],
    "宁波市": ["海曙区", "江北区", "镇海区"]
  }
};

HTML结构

创建三个select元素,分别对应省、市、区:

<select id="province"></select>
<select id="city"></select>
<select id="district"></select>

JavaScript实现

初始化省份下拉框:

const provinceSelect = document.getElementById('province');
const citySelect = document.getElementById('city');
const districtSelect = document.getElementById('district');

// 初始化省份选项
Object.keys(regionData).forEach(province => {
  const option = document.createElement('option');
  option.value = province;
  option.textContent = province;
  provinceSelect.appendChild(option);
});

省份变化时加载城市:

provinceSelect.addEventListener('change', function() {
  citySelect.innerHTML = '<option value="">请选择城市</option>';
  districtSelect.innerHTML = '<option value="">请选择区县</option>';

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

城市变化时加载区县:

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

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

完整代码示例

<!DOCTYPE html>
<html>
<head>
  <title>三级级联示例</title>
</head>
<body>
  <select id="province"></select>
  <select id="city"></select>
  <select id="district"></select>

  <script>
    const regionData = {
      "江苏省": {
        "南京市": ["玄武区", "鼓楼区", "秦淮区"],
        "苏州市": ["姑苏区", "虎丘区", "吴中区"]
      },
      "浙江省": {
        "杭州市": ["上城区", "下城区", "江干区"],
        "宁波市": ["海曙区", "江北区", "镇海区"]
      }
    };

    const provinceSelect = document.getElementById('province');
    const citySelect = document.getElementById('city');
    const districtSelect = document.getElementById('district');

    // 初始化省份
    provinceSelect.innerHTML = '<option value="">请选择省份</option>';
    Object.keys(regionData).forEach(province => {
      const option = document.createElement('option');
      option.value = province;
      option.textContent = province;
      provinceSelect.appendChild(option);
    });

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

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

    // 城市变化事件
    citySelect.addEventListener('change', function() {
      districtSelect.innerHTML = '<option value="">请选择区县</option>';

      const selectedProvince = provinceSelect.value;
      const selectedCity = this.value;
      if (selectedProvince && selectedCity) {
        regionData[selectedProvince][selectedCity].forEach(district => {
          const option = document.createElement('option');
          option.value = district;
          option.textContent = district;
          districtSelect.appendChild(option);
        });
      }
    });
  </script>
</body>
</html>

动态加载数据方案

如果需要从服务器动态获取数据,可以使用fetch API:

js实现三级级联

async function loadCities(province) {
  const response = await fetch(`/api/cities?province=${province}`);
  return await response.json();
}

provinceSelect.addEventListener('change', async function() {
  const cities = await loadCities(this.value);
  // 更新城市下拉框...
});

注意事项

  • 确保在用户选择前一级选项后,再加载下一级选项
  • 每次上级选项变化时,需要清空下级所有选项
  • 添加默认空选项提升用户体验
  • 考虑添加加载状态提示,特别是网络请求时

标签: 级联js
分享给朋友:

相关文章

js实现打印

js实现打印

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

js实现乘

js实现乘

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

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js实现文字滚动

js实现文字滚动

实现文字滚动的几种方法 使用CSS动画实现滚动 通过CSS的@keyframes和transform属性可以实现平滑的文字滚动效果。 <style> .scroll-text { w…

js实现搜索

js实现搜索

实现搜索功能的方法 在JavaScript中实现搜索功能可以通过多种方式完成,以下是几种常见的实现方法。 使用数组的filter方法 通过数组的filter方法可以筛选出符合条件的数据项。假设有一个…