如何用JS实现三级联动功能

简介: 如何用JS实现三级联动功能

功能需求:
  • 未选择省级时市级和区级无法选择
  • 未选择市级时无法选择区级
  • 选择相应的省级时市级会出现相对应省级的市
  • 选择相应的市级时区级会出现相对应市级的区
  • 省市区全部选择完之后再重新选择省时要把区级的清空

这其实是个挺简单的功能,就是我刚开始写的时候思路没有捋清楚,导致写的时候很困难。写代码前一定要先捋清思路,先写伪代码。下面请看代码(有注释很清晰了)。主要就是功能,所以我就没有写样式,如果有需要请大家自己添加把。

HTML代码:
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>三级联动功能</title>
    <link href="./css/three.css" />
  </head>
  <body>
    <form id="menu">
      <!-- 省份选择 -->
      <select id="one" onchange="province()">
        <option value="">请选择省</option>
      </select>
      <!-- 城市选择 -->
      <select id="two" onchange="wardenry()">
        <option value="">请选择市</option>
      </select>
      <!-- 区选择 -->
      <select id="three">
        <option value="">请选择区</option>
      </select>
    </form>
    <script src="./js/three.js"></script>
  </body>
</html>
JSON数据:
[{
  "province": "河南省",
  "city": [{
    "town": "新乡市",
    "area": ["卫滨区","红旗区","高新区","牧野区"]
  },{
    "town": "郑州市",
    "area": ["中原区","二七区","金水区","新密区"]
  },{
    "town": "洛阳市",
    "area": ["老城区","洛龙区","孟津区"]
  }]
}, {
  "province": "山东省",
  "city": [{
    "town": "临沂市",
    "area": ["兰山区","河东区","沂水区","费县"]
  },{
    "town": "青岛市",
    "area": ["市北区","市南区","黄岛区","城阳区"]
  },{
    "town": "淄博市",
    "area": ["淄川区","博山区","周村区","张店区"]
  }]
}, {
  "province": "黑龙江省",
  "city": [{
    "town": "哈尔滨市",
    "area": ["香坊区","松北区","呼兰区","道里区"]
  },{
    "town": "齐齐哈尔市",
    "area": ["建华区","龙沙区","铁锋区","泰来县"]
  },{
    "town": "鸡西市",
    "area": ["鸡冠区","恒山区","梨树区","麻山区"]
  }]
}]
JS代码:
// 在html中创建三个下拉选择框
// 后分别获取这三个下拉选择框
// 省
let one = document.getElementById('one');
// 市
let two = document.getElementById('two');
// 区
let three = document.getElementById('three');
// 写JSON数据
// 通过请求获取JSON的数据(要给一个变量使它变成全局的)
let data = []; //全局
let xml = new XMLHttpRequest();
xml.open('get', './js/three.json');
xml.send();
xml.onreadystatechange = function() {
  if (xml.readyState == 4 && xml.status == 200) {
    let text = xml.responseText;
    // 请求到的数据(data已经是全局的了)
    data = JSON.parse(text);
    // 请求到值过后可以直接渲染(写到if判断后无法判断它是否获取到数据)
    let str = "<option>请选择省</option>";
    // let ones = document.getElementById('one').value
    for (let i = 0; i < data.length; i++) {
      // 找数组下标的省级
      str += `<option value="${i}">${data[i].province}</option>`
    }
    // 渲染好的字符串拼接写到省份里
    one.innerHTML = str;
  }
}
// 添加到省级下拉框
let ones;
// 给省级下拉框绑定onchange事件
function province() {
  let str = "";
  // 获取的是省份下拉选择框的值
  ones = document.getElementById('one').value
  // console.log(ones);
  // 遍历城市数组(循环查找相对应的索引)
  // for循环获取省份的值的市的长度(one是省的下拉选框,ones是获取的值)
  for (let i = 0; i < data[ones].city.length; i++) {
    // 字符串拼接value值要变,市要变。数组的省值的城市的下标town(寻找城市)
    str += `<option value="${i}">${data[ones].city[i].town}</option>`
  }
  // 拼接写到城市two里
  two.innerHTML = str;
  three.innerHTML = '<option value="">请选择区</option>';
}
function wardenry() {
  let str = "";
  // 获取的是城市下拉选择框的值
  let twos = document.getElementById('two').value;
  console.log(twos);
  // 遍历区数组(循环查找相对应的索引)一步一步找,省值市值区长度
  for (let i = 0; i < data[ones].city[twos].area.length; i++) {
    // 字符串拼接value值要变,市要变。数组的值的城市的名字town
    str += `<option value="${i}">${data[ones].city[twos].area[i]}</option>`
  }
  three.innerHTML = str;
}

总结:

1需要先获取三个下拉框

2let一个全局的数据为空

3请求数据 请求过后直接渲染循环拼接字符串

4给省级下拉框绑定onchange事件

5循环数组省级下拉框的值的市级的长度

6拼接省级下拉框的值的市级的下标

7给区下拉框绑定onchange事件

8循环数组省级下拉框的值的市级的值的区的长度

9省级下拉框的值的市级的值的区的下标

注意:

1.刚开始let的一个字符串为空所以渲染的数据直接就是河南

可是下拉框选项页面上的默认值应该是“请选择省/市/区”

所以给为空的字符串添加默认的option

2.省市区全部选择完毕后,我们重新选择省的时候,区是不会变的

我们给绑定的省级使书写到区级的内容为空,让其重新选择就好了。

我写的注释可能会啰嗦,我是按照自己的理解来写的,以上就是我用JS实现的三级联动功能,会有很多不足的地方,请多多指教!

目录
相关文章
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
778 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
JavaScript 前端开发
JavaScript分页功能
JavaScript分页功能
|
JavaScript 前端开发 API
|
前端开发 JavaScript
【Javascript系列】Terser除了压缩代码之外,还有优化代码的功能
Terser 是一款广泛应用于前端开发的 JavaScript 解析器和压缩工具,常被视为 Uglify-es 的替代品。它不仅能高效压缩代码体积,还能优化代码逻辑,提升可靠性。例如,在调试中发现,Terser 压缩后的代码对删除功能确认框逻辑进行了优化。常用参数包括 `compress`(启用压缩)、`mangle`(变量名混淆)和 `output`(输出配置)。更多高级用法可参考官方文档。
1067 11
|
JavaScript 前端开发 安全
盘点原生JS中目前最没用的几个功能API
在JavaScript的发展历程中,许多功能与API曾风光无限,但随着技术进步和语言演化,部分功能逐渐被淘汰或被更高效的替代方案取代。例如,`with`语句使代码作用域复杂、可读性差;`void`操作符功能冗余且影响可读性;`eval`函数存在严重安全风险和性能问题;`unescape`和`escape`函数已被`decodeURIComponent`和`encodeURIComponent`取代;`arguments`对象则被ES6的剩余参数语法替代。这些变化体现了JavaScript不断优化的趋势,开发者应紧跟技术步伐,学习新技能,适应新技术环境。
342 10
|
JavaScript 容器
带方向感知功能的js图片遮罩层插件
带方向感知功能的js图片遮罩层插件
|
JavaScript 前端开发
【Vue.js】监听器功能(EventListener)的实际应用【合集】
而此次问题的核心就在于,Vue实例化的时机过早,在其所依赖的DOM结构尚未完整构建完成时就已启动挂载流程,从而导致无法找到对应的DOM元素,最终致使计算器功能出现异常,输出框错误地显示“{{current}}”,并且按钮的交互功能也完全丧失响应。为了让代码结构更为清晰,便于后续的维护与管理工作,我打算把HTML文件中标签内的JavaScript代码迁移到外部的JS文件里,随后在HTML文件中对其进行引用。
318 8
|
JavaScript 前端开发 容器
jQuery多功能滑块插件r-slider.js
r-slider.js是一款jQuery多功能滑块插件。使用该插件,可以制作出滑块、开关按钮、进度条、向导步骤等多种效果。
289 5
|
JavaScript
js实现简洁实用的网页计算器功能源码
这是一款使用js实现简洁实用的网页计算器功能源码。可实现比较基本的加减乘除四则运算功能,界面简洁实用,是一款比较基本的js运算功能源码。该源码可兼容目前最新的各类主流浏览器。
293 2