当前位置:首页 > JavaScript

js实现三级级联

2026-03-01 07:36:00JavaScript

三级级联实现方法

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

数据结构准备

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

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

HTML结构

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

js实现三级级联

<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);
});

省份变化时加载城市:

js实现三级级联

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:

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中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Pa…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置…