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

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

在使用前端开发时,经常需要实现省市区三级的地址选择。传统的做法是引入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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。