原生JavaScript实现省市区三级联动下拉框

许南星
许南星
发布时间:2026-10-13 | 2人浏览过
原创

在使用前端开发时,经常需要实现省市区三级的地址选择。传统的做法是引入jQuery以及大量的插件代码。其实利用原生JavaScript完全可以简洁地实现这一功能:只需将行政区数据定义为数组结构,配合DOM操作绑定Change事件即可完成联动,无需额外依赖。

HTML基础结构

首先准备三个下拉选框,分别对应省份、城市和区县。以下是一个基础的HTML结构:

<!-- 省级选择 -->
<select id="province"></select>

<!-- 市级选择 -->
<select id="city"></select>

<!-- 区县级选择 -->
<select id="district"></select>

核心JavaScript实现

要实现联动效果,核心在于初始化加载一级数据,并在选择变化时动态清空并填充下一级数据。

第1步:定义行政区划数据

需要将全国各省、市、区的层级关系以嵌套的数组形式存储。在实际项目中,建议从后端接口获取或通过外部 .json 文件异步加载,以保持页面整洁。以下展示了部分示例数据结构(实际使用请替换完整数据):

var areaData = [
  {
    name: '北京市',
    cities: [
      {
        name: '北京市',
        districts: ['东城区', '西城区', '朝阳区', '海淀区']
      }
    ]
  },
  {
    name: '广东省',
    cities: [
      {
        name: '广州市',
        districts: ['天河区', '越秀区', '海珠区']
      },
      {
        name: '深圳市',
        districts: ['福田区', '南山区', '宝安区']
      }
    ]
  }
];

第2步:编写初始化与联动函数

创建 `initSelect` 和 `updateDistricts` 函数来处理具体的 DOM 操作。以下是通用代码逻辑:

// 获取DOM元素
var provinceEl = document.getElementById("province");
var cityEl = document.getElementById("city");
var districtEl = document.getElementById("district");

// 1. 初始化省份列表
function loadProvince() {
  for (var i = 0; i < areaData.length; i++) {
    var option = new Option(areaData[i].name, areaData[i].name);
    provinceEl.add(option);
  }
}

// 2. 根据选中的省份加载城市列表
provinceEl.onchange = function() {
  cityEl.options.length = 0; // 清空城市
  districtEl.options.length = 0; // 清空区县
  
  if (!this.value) return;
  
  var provIndex = getIndex(this.value, areaData);
  var currentCities = areaData[provIndex].cities;
  
  for (var i = 0; i < currentCities.length; i++) {
    var option = new Option(currentCities[i].name, currentCities[i].name);
    cityEl.add(option);
  }
};

// 3. 根据选中的城市加载区县列表
cityEl.onchange = function() {
  districtEl.options.length = 0; // 清空区县
  
  if (!this.value) return;
  
  var provIndex = getIndex(provinceEl.value, areaData);
  var cities = areaData[provIndex].cities;
  var cityIndex = getIndex(this.value, cities);
  var currentDistricts = cities[cityIndex].districts;
  
  for (var i = 0; i < currentDistricts.length; i++) {
    var option = new Option(currentDistricts[i], currentDistricts[i]);
    districtEl.add(option);
  }
};

// 辅助函数:通过名称在对象数组中查找索引
function getIndex(name, array) {
  for (var i = 0; i < array.length; i++) {
    if (array[i].name === name) return i;
  }
  return -1;
}

// 启动执行
loadProvince();

注意事项与总结

上述代码提供了一个轻量级的解决方案。如果你需要处理完整的中国行政区划(包括港澳台数据),请注意以下几点:
1. 由于原始数据量较大,建议压缩传输或将数据存储在CDN上。
2. 如果项目本身已经使用了 JQuery,可以通过 $().change() 简化事件绑定过程。
3. 确保所有级联的 onchange 事件中都要先清空下一级的 options,否则会出现历史数据残留问题。

以上就是JavaScript实现省市区三级联动下拉框的详细内容,更多关于前端地址选择器优化的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表