javaScript小案例------js实现三级联动效果篇

js实现三级联动

三级联动效果

三级联动:

我写的是省与城市,城市与学校之间的三级联动。顾名思义就是我有三个下拉框,分别表示的是省,城市,学校。省所对应的城市,城市所对应的学校。我如果选择了一个省份,那么就会在城市的下拉框里面就会显示这个省所对应的城市,同理,在学校的下拉框里面也会出现城市所对应的学校。

**注:**本文所取的省份,城市,学校数据来自于互联网,若有差错,敬请谅解

data.js都是数据,太多了,只给出了一个模板。如果想要完整版,私信即可,我看见就会发给你
好了,直接开干

HTML:

html和css代码直接给出,不多说了。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>js实现三级联动</title>
    <link rel="stylesheet" href="./index.css">
</head>

<body>
    <div class="container">
        <div class="item">
            <div class="left province">省份</div>
            <div class="right">
                <select name="province" id="province">
                    <option value="00">请选择</option>
                </select>
            </div>
        </div>
        <div class="item">
            <div class="left province">城市</div>
            <div class="right">
                <select name="city" id="city">
                </select>
            </div>
        </div>
        <div class="item">
            <div class="left province">学校</div>
            <div class="right">
                <select name="school" id="school">
                </select>
            </div>
        </div>
    </div>
    <script src="./data.js"></script>
    <script src="./index.js"></script>

</body>

</html>

css:

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    background-color: lightblue;
}

.container {
    width: 300px;
    margin: 50px auto;
}

.container div {
    margin-bottom: 20px;
}

.item {
    width: 100%;
    height: 50px;
    background-color: #fff;
    border-radius: 15px;
    overflow: hidden;
}

.province {
    width: 80px;
    font-size: 20px;
    line-height: 50px;
    /* padding-left: 5px; */
    text-align: center;
    color: violet;
}

select {
    width: 200px;
    font-size: 20px;
    height: 50px;
    border: none;
}

.left {
    float: left;
}

.left::after {
    content: '|';
    color: #ccc;
    font-weight: 500;
    padding-left: 15px;
}

.right {
    float: right;
}

JS:

重要

首先分析一下如何能做到三级联动,我点击省份,去找省份的城市,我再点击城市,再去找城市的学校。这样一想,有了点思路,我想我用对象来表示省份,城市,学校。对象里面用数组来表示相关数据,再给上相关数据的对应的特殊标识不就行了吗,想到这,直接开始写,又因为相关的数据太多,所以我新建一个data.js文件来放这三个对象,因为数据太多了,所以用什么标识来区分呢,当然是数字简单便捷了。直接上data.js代码

data.js

直接看结构即可,完整版私信即可

var province = {
    "11": "重庆市",
    "12": "福建省",
}
 var city = {
    "11": {
        "014": "重庆市"
    },
    "12": {
        "015": "漳州市",
        "016": "厦门市",
        "017": "三明市",
        "018": "泉州市",
        "019": "莆田市",
        "020": "宁德市",
        "021": "南平市",
        "022": "龙岩市",
        "023": "福州市"
    },
 }
 var school = {
 "014": [
        "重庆大学",
        "重庆邮电大学",
        "重庆交通大学",
        "重庆医科大学",
        "西南大学",
        "重庆师范大学",
        "重庆文理学院",
        "重庆三峡学院",
        "长江师范学院",
        "四川外国语大学",
        "西南政法大学",
        "四川美术学院",
        "重庆科技学院",
        "重庆理工大学",
        "重庆工商大学",
        "重庆工程学院",
        "重庆大学城市科技学院",
        "重庆警察学院",
        "重庆人文科技学院",
        "四川外国语大学重庆南方翻译学院",
        "重庆师范大学涉外商贸学院",
        "重庆工商大学融智学院",
        "重庆工商大学派斯学院",
        "重庆邮电大学移通学院",
        "重庆第二师范学院",
        "重庆航天职业技术学院",
        "重庆电力高等专科学校",
        "重庆工业职业技术学院",
        "重庆三峡职业学院",
        "重庆工贸职业技术学院",
        "重庆机电职业技术学院",
        "重庆电子工程职业学院",
        "重庆海联职业技术学院",
        "重庆信息技术职业学院",
        "重庆传媒职业学院",
        "重庆城市管理职业学院",
        "重庆工程职业技术学院",
        "重庆房地产职业学院",
        "重庆城市职业学院",
        "重庆水利电力职业技术学院",
        "重庆工商职业学院",
        "重庆应用技术职业学院",
        "重庆三峡医药高等专科学校",
        "重庆医药高等专科学校",
        "重庆青年职业技术学院",
        "重庆财经职业学院",
        "重庆科创职业学院",
        "重庆建筑工程职业学院",
        "重庆电讯职业学院",
        "重庆能源职业学院",
        "重庆商务职业学院",
        "重庆交通职业学院",
        "重庆化工职业学院",
        "重庆旅游职业学院",
        "重庆安全技术职业学院",
        "重庆公共运输职业学院",
        "重庆艺术工程职业学院",
        "重庆轻工职业学院",
        "重庆电信职业学院",
        "重庆经贸职业学院",
        "重庆幼儿师范高等专科学校",
        "重庆文化艺术职业学院",
        "重庆服装工程职业学院",
        "重庆资源与环境保护职业学院",
        "庆护理职业学院"
    ],
    "015": [
        "闽南师范大学",
        "厦门大学嘉庚学院",
        "漳州职业技术学院",
        "漳州城市职业学院",
        "漳州科技职业学院",
        "漳州理工职业学院",
        "漳州卫生职业学院"
    ],
    "016": [
        "厦门大学",
        "集美大学",
        "厦门理工学院",
        "厦门医学院",
        "厦门华厦学院",
        "厦门工学院",
        "集美大学诚毅学院",
        "厦门海洋职业技术学院",
        "厦门演艺职业学院",
        "厦门华天涉外职业技术学院",
        "厦门城市职业学院",
        "厦门兴才职业技术学院",
        "厦门软件职业技术学院",
        "厦门南洋职业学院",
        "厦门东海职业技术学院",
        "厦门安防科技职业学院"
    ],
    "017": [
        "三明学院",
        "福建水利电力职业技术学院",
        "三明职业技术学院"
    ],
    "018": [
        "华侨大学",
        "泉州师范学院",
        "仰恩大学",
        "闽南理工学院",
        "福建师范大学闽南科技学院",
        "泉州信息工程学院",
        "黎明职业大学",
        "福建电力职业技术学院",
        "泉州医学高等专科学校",
        "泉州纺织服装职业学院",
        "泉州华光职业学院",
        "泉州理工职业学院",
        "泉州经贸职业技术学院",
        "泉州工艺美术职业学院",
        "泉州工程职业技术学院",
        "泉州海洋职业学院",
        "泉州轻工职业学院",
        "泉州幼儿师范高等专科学校"
    ],
    "019": [
        "莆田学院",
        "湄洲湾职业技术学院"
    ],
    "020": [
        "宁德师范学院",
        "宁德职业技术学院"
    ],
    "021": [
        "武夷学院",
        "福建林业职业技术学院",
        "闽北职业技术学院",
        "武夷山职业学院"
    ],
    "022": [
        "龙岩学院",
        "闽西职业技术学院"
    ],
    "023": [
        "福州大学",
        "福建工程学院",
        "福建农林大学",
        "福建医科大学",
        "福建中医药大学",
        "福建师范大学",
        "闽江学院",
        "福建商学院",
        "福建警察学院",
        "福建农林大学东方学院",
        "阳光学院",
        "福州大学至诚学院",
        "福建师范大学协和学院",
        "福州外语外贸学院",
        "福建江夏学院",
        "福州理工学院",
        "福建农林大学金山学院",
        "福建船政交通职业学院",
        "福建华南女子职业学院",
        "福州职业技术学院",
        "福建信息职业技术学院",
        "福建农业职业技术学院",
        "福建卫生职业技术学院",
        "福州英华职业学院",
        "福建警官职业学院",
        "福州黎明职业技术学院",
        "福州科技职业技术学院",
        "福建对外经济贸易职业技术学院",
        "福建生物工程职业技术学院",
        "福建艺术职业学院",
        "福建幼儿师范高等专科学校",
        "福州软件职业技术学院",
        "福建体育职业技术学院",
        "闽江师范高等专科学校"
    ],
 }

主要的index.js:

然后开始写一个index.js文件来写三级联动的主要代码:

我是首先是获取到省份,城市,学校的dom。然后先开始forin省份对象,并渲染相关数据到界面。里面的操作是先创建一个option元素,把value,和省份名称渲染进省份的dom里面。
然后给省份注册一个表单事件,change事件。在注册事件里面先清除一下城市的表达显示名称,以便做有关操作时候表单上的数据还在。还要清除一下学校的表单显示。然后先得到表单显示的省份的标识,在得到省份标识对应的城市的数组,然后开始遍历渲染,把有关数据添加进城市的dom里面。值得一提的是,我们选择省份的时候,有时候会选择到请选择这个选项,这个时候浏览器会报错,所以我们要在遍历渲染之前做一个判断操作,如果省份选项等于undefined时就什么也不干,因为选择请选择时,就是undefined。然后渲染完成后要得到默认的城市的标识,在拿到城市的标识所对应的学校数组。然后再循环渲染(为什么要用到循环而不是forin呢?因为forin的都是对象,我的学校都是数组,所以要用到循环)。
最后再给城市注册一个表单change事件,一样先清除学校的表单显示,再得到得到默认的城市的标识,在拿到城市的标识所对应的学校数组。然后再循环渲染进学校的dom中

idnex.js:
// 获取到省份,城市,学校的dom
var provinceDom = document.getElementById('province');
var cityDom = document.getElementById('city');
var schoolDom = document.getElementById('school');
// 遍历省份 渲染
for (key in province) {
    // 创建option元素
    var provinceOption = document.createElement('option');
    // 先得到省份value值
    provinceOption.value = key;
    // 在得到省份名称
    provinceOption.innerHTML = province[key];
    // 把创建好的option元素放进省份dom中
    provinceDom.appendChild(provinceOption);
}
// 注册省份的表单事件
provinceDom.addEventListener('change', function() {
    // 先清除一下城市的表单显示名称
    cityDom.innerHTML = '';
    // 在清除一下学校的表单显示名称
    schoolDom.innerHTML = '';
    // 得到表单上显示的省份的标号
    var provinceValue = provinceDom.value;
    // 得到城市的数组
    var citys = city[provinceValue];
    // 省份选择请选择选项时啥都不干
    if (citys === undefined) {
        return;
    }
    // 遍历渲染
    for (key in citys) {
        var cityOption = document.createElement('option');
        cityOption.value = key;
        cityOption.innerHTML = citys[key];
        cityDom.appendChild(cityOption);
    }
    // 得到默认的城市编号
    var schools = cityDom.value;
    // 城市下的学校数组
    var schoolnum = school[schools];
    // 循坏,渲染
    for (var i = 0; i < schoolnum.length; i++) {
        var schoolOption = document.createElement('option');
        schoolOption.innerHTML = schoolnum[i];
        schoolDom.appendChild(schoolOption);
    }
})
cityDom.addEventListener('change', function() {
    // 清除学校
    schoolDom.innerHTML = '';
    // 得到城市的编号
    var schools = cityDom.value;
    // 得到对应的学校数组
    var schoolnum = school[schools];
    // 遍历渲染
    for (var i = 0; i < schoolnum.length; i++) {
        var schoolOption = document.createElement('option');
        schoolOption.innerHTML = schoolnum[i];
        schoolDom.appendChild(schoolOption);
    }
})

若有错误,敬请指正

  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端志茗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值