当前位置:首页 > JavaScript

js实现三级级联

2026-01-30 16:32:20JavaScript

实现三级级联的基本思路

三级级联通常指三个下拉菜单之间的联动选择,例如省、市、区三级联动。核心逻辑是通过前一级的选择动态加载下一级的数据。

数据结构准备

使用嵌套对象或数组存储级联数据。例如:

const data = {
  '广东省': {
    '广州市': ['天河区', '越秀区', '海珠区'],
    '深圳市': ['福田区', '南山区', '罗湖区']
  },
  '江苏省': {
    '南京市': ['玄武区', '秦淮区', '建邺区'],
    '苏州市': ['姑苏区', '虎丘区', '吴中区']
  }
};

HTML结构

创建三个select元素并设置id:

js实现三级级联

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

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

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

初始化省份数据

页面加载时填充第一级选项:

const provinceSelect = document.getElementById('province');
Object.keys(data).forEach(province => {
  const option = document.createElement('option');
  option.value = province;
  option.textContent = province;
  provinceSelect.appendChild(option);
});

城市级联逻辑

监听省份变化事件,动态加载城市数据:

js实现三级级联

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

  const districtSelect = document.getElementById('district');
  districtSelect.innerHTML = '<option value="">请选择区县</option>';

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

区县级联逻辑

监听城市变化事件,动态加载区县数据:

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

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

完整代码示例

将所有部分组合:

document.addEventListener('DOMContentLoaded', function() {
  const data = {
    '广东省': {
      '广州市': ['天河区', '越秀区', '海珠区'],
      '深圳市': ['福田区', '南山区', '罗湖区']
    },
    '江苏省': {
      '南京市': ['玄武区', '秦淮区', '建邺区'],
      '苏州市': ['姑苏区', '虎丘区', '吴中区']
    }
  };

  const provinceSelect = document.getElementById('province');
  Object.keys(data).forEach(province => {
    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 districtSelect = document.getElementById('district');
    districtSelect.innerHTML = '<option value="">请选择区县</option>';

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

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

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

使用AJAX动态加载数据

对于大数据量场景,建议从后端API获取数据:

// 获取省份
fetch('/api/provinces')
  .then(response => response.json())
  .then(provinces => {
    // 填充省份select
  });

// 城市选择事件
provinceSelect.addEventListener('change', function() {
  fetch(`/api/cities?province=${this.value}`)
    .then(response => response.json())
    .then(cities => {
      // 填充城市select
    });
});

注意事项

  1. 添加默认空选项提升用户体验
  2. 清除下级选项时保留默认选项
  3. 考虑添加加载状态提示
  4. 对异步操作进行错误处理
  5. 移动端需考虑触摸事件兼容性

性能优化建议

  1. 使用文档片段减少DOM操作
  2. 对频繁操作进行防抖处理
  3. 考虑前端缓存已加载的数据
  4. 大数据量时使用虚拟滚动技术

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

相关文章

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现全选

js实现全选

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

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现论坛

js实现论坛

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

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…