当前位置:首页 > 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实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

Vue实现级联多选

Vue实现级联多选

Vue 实现级联多选的方法 使用 Element UI 的 Cascader 组件 Element UI 提供了 el-cascader 组件,支持多选功能。通过设置 props 的 multiple…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…

js分页实现

js分页实现

分页的基本原理 分页的核心是通过计算当前页码和数据偏移量,从服务器或本地数据中截取对应范围的数据进行展示。通常需要以下参数:当前页码(currentPage)、每页条数(pageSize)、总数据量(…