当前位置:首页 > 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
分享给朋友:

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js防抖和节流实现

js防抖和节流实现

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

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js实现祖玛

js实现祖玛

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

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…