原生JS用select标签实现三级联动

三级联动思想与二级联动的一样,添加省与市的过程我就不写了,参考原生JS用select标签实现二级联动,就说一下如何添加区

对于区的数组设置,我们需要一个二维数组,拿数组中下标为0的值 来说,从整体上来说,下标为0 的数是一个数组。里面存放的是一个市所包括的所有区的值,不同市所包括的区的值分别放在不同的下标中,

实现思路
1、第一个下标代表的是选择的哪个省
2、第二个下标代表的是选择的哪个市
因此我们在点击省的时候,需要将当前的下标记录在一个全局变量中,在点市的时候,直接获取当前值,两者结合起来就会实现区的动态添加

函数封装
因为动态添加市与区的值是一样的,所以需要封装一个函数,减少代码冗余,但是这个封装不太好写,因为是点击省才有市,点击市才有区,是一层嵌套一层,所在封装一时候,需要判断当前的父节点是省还是市。省的话,当前的下标记录在一个全局变量中,再动态添加市。如果是市,用全局变量加当前点击的下标再动态添加区

代码区

	<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>三级联动 </title>
    <style>
        *{
            margin: 0;
            padding:0;
        }
        .clear::after{
            content: "";
            display: block;
            clear: both;
        }
        .box{
           margin: 100px auto;
           width:  720px;
        }
        .left,.right,.last{
            width: 32%;
            float: left;
        }
        .left{
            margin-right: 2px;
        }
        .name,.content{
            height: 30px;
            float: left;
        }
        .name{
            width: 30%;
            line-height: 30px;
            text-align: center;
            margin-right: 1px;
            background-color: yellowgreen;
        }
        .content{
            width: 69%;
        }
        select{
            width: 100%;
            height: 100%;
        }
      
    </style>
</head>
<body>
     <div class="box clear">
        <div class="left clear">
            <div class='name'>省:</div>
            <div class="content"><select class="province" id=""></select></div>
        </div>
        <div class="right clear">
            <div class='name'>市</div>
            <div class="content"><select class=" city" id=""></select></div>
        </div>
        <div class="last clear">
            <div class='name'>区</div>
            <div class="content"><select class=" county" id=""></select></div>
        </div>
    </div>
    <script>
         
        var provinceContent = document.querySelector('.province');
        var cityContent= document.querySelector('.city');
        var countyContent = document.querySelector('.county');
        // 设置省份城市数组
        var province = ['陕西','山西'];

        // 设置城市数组
        var city = [
                        ["西安","宝鸡","咸阳","渭南"],
                        ["太原","阳泉","晋城"],
                    ]
        
        var county = [ [
                            ['蓝田县','周至县','户县','高陵县'],
                            ['凤翔县','岐山县','扶风县','眉县','陇县','千阳县','麟游县','凤县','太白县'],
                            ['泾阳县','乾县','礼泉县','永寿县','彬县','长武县','旬邑县','淳化县','武功县'],
                            ['华县','潼关县','大荔县','蒲城县','澄城县','白水县','合阳县','富平县']
                        ],
                        [
                            ['小店区','迎泽区','杏花岭区','尖草坪区','万柏林区','晋源区','清徐县','阳曲县','娄烦县','古交市'],
                            ['城区','矿区','郊区','盂县','平定县'],
                            ['城区','泽州县','阳城县','沁水县','陵川县','高平市']
                        ]
                    ]   
        // 动态的添加内容元素:
        // 当动态添加元素时,首先要明确添加的是哪个数组,以及要给哪个元素添加,
        // 因为动态添加元素需要用到好几次,所有封装一个函数,方便以后再次添加元素时调用
        // obj表示数组,target表示要给哪个元素添加
        function createOption(obj,target){
            for(var i = 0; i<obj.length; i++){
                var option = document.createElement('option');
                option.innerText = obj[i];
                target.appendChild(option);
            }
        }
        // 调用执行函数
        createOption(province,provinceContent);
        getCity();

         //当选好省份之后,同时将当前省份对应的市写入市区域中,
          var index ;
        function getCity(){
            // 给省添加绑定事件选中内容
            common(provinceContent,cityContent,city);
           
        }
  // 当点击省或市之后,动态的添加当前省/市对应的市内容
       function common(obj,target,arr){
            for(var i = 0; i < obj.children.length; i++){
                obj.children[i].value = i;
                // 给省//市添加绑定事件选中内容
                obj.children[i].addEventListener('click',function(){
                    // 先判断当前市/区中是否有option,若是有,则删除所有元素再添加
                    if(target.children.length != 0){
                        var i = 0; 
                        while(i < target.children.length)
                            target.removeChild( target.children[0]);
                    }
                    // 如果当前的父节点是省,说明是在选择省,所以需要添加市
                    // 然后将当前点击的省的下标记住,用来添加区
                    if(this.parentNode == provinceContent){
                        index = this.value;
                        createOption(arr[this.value], target);
                        // 在添加省之后就需要添加市,
                        getCounty();
                    }
                    // 如果当前的父节点是市,说明是在选择市,所以要添加区
                    // 
                    if(this.parentNode == cityContent){
                        // arr[index]  --- 代表选择的哪个省
                        // arr[this.value]  --- 代表选择的是哪个市
                        // 所以省与市的下标结合起来就是区的内容
                        createOption(arr[index][this.value], target);
                    }
                });
            }

        }
       function getCounty(){
          common(cityContent,countyContent,county);
       }

    </script>
</body>
</html>

下面的是未封装的函数码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>三级联动 </title>
    <style>
        *{
            margin: 0;
            padding:0;
        }
        .clear::after{
            content: "";
            display: block;
            clear: both;
        }
        .box{
           margin: 100px auto;
           width:  720px;
        }
        .left,.right,.last{
            width: 32%;
            float: left;
        }
        .left{
            margin-right: 2px;
        }
        .name,.content{
            height: 30px;
            float: left;
        }
        .name{
            width: 30%;
            line-height: 30px;
            text-align: center;
            margin-right: 1px;
            background-color: yellowgreen;
        }
        .content{
            width: 69%;
        }
        select{
            width: 100%;
            height: 100%;
        }
      
    </style>
</head>
<body>
     <div class="box clear">
        <div class="left clear">
            <div class='name'>省:</div>
            <div class="content"><select class="province" id=""></select></div>
        </div>
        <div class="right clear">
            <div class='name'>市</div>
            <div class="content"><select class=" city" id=""></select></div>
        </div>
        <div class="last clear">
            <div class='name'>区</div>
            <div class="content"><select class=" county" id=""></select></div>
        </div>
    </div>
    <script>
         
        var provinceContent = document.querySelector('.province');
        var cityContent= document.querySelector('.city');
        var countyContent = document.querySelector('.county');
        // 设置省份城市数组
        var province = ['陕西','山西'];

        // 设置城市数组
        var city = [
                        ["西安","宝鸡","咸阳","渭南"],
                        ["太原","阳泉","晋城"],
                    ]
        
        var county = [ [
                            ['蓝田县','周至县','户县','高陵县'],
                            ['凤翔县','岐山县','扶风县','眉县','陇县','千阳县','麟游县','凤县','太白县'],
                            ['泾阳县','乾县','礼泉县','永寿县','彬县','长武县','旬邑县','淳化县','武功县'],
                            ['华县','潼关县','大荔县','蒲城县','澄城县','白水县','合阳县','富平县']
                        ],
                        [
                            ['小店区','迎泽区','杏花岭区','尖草坪区','万柏林区','晋源区','清徐县','阳曲县','娄烦县','古交市'],
                            ['城区','矿区','郊区','盂县','平定县'],
                            ['城区','泽州县','阳城县','沁水县','陵川县','高平市']
                        ]
                    ]   
        // 动态的添加内容元素:
        // 当动态添加元素时,首先要明确添加的是哪个数组,以及要给哪个元素添加,
        // 因为动态添加元素需要用到好几次,所有封装一个函数,方便以后再次添加元素时调用
        // obj表示数组,target表示要给哪个元素添加
        function createOption(obj,target){
            for(var i = 0; i<obj.length; i++){
                var option = document.createElement('option');
                option.innerText = obj[i];
                target.appendChild(option);
            }
        }
        // 调用执行函数
        createOption(province,provinceContent);
        getCity();

         //当选好省份之后,同时将当前省份对应的市写入市区域中,
        var index ;
        function getCity(){
            for(var i = 0; i < provinceContent.children.length; i++){
                provinceContent.children[i].value = i;
                // 给省添加绑定事件选中内容
                provinceContent.children[i].addEventListener('click',function(){   
                    // 当点击省之后,动态的添加当前省对应的市内容
                    // 先判断当前市中是否有option,若是有,则删除所有元素再添加
                    if(cityContent.children.length != 0){
                        var i = 0; 
                        while(i < cityContent.children.length)
                            cityContent.removeChild( cityContent.children[0]);
                    }
                    index = this.value;
                    createOption(city[this.value], cityContent);
                    getCounty();
                });
            }
        }

       
       function getCounty(){
           for(var i = 0; i < cityContent.children.length; i++){
                cityContent.children[i].value = i;
                // 给省添加绑定事件选中内容
                cityContent.children[i].addEventListener('click',function(){   
                    // 当点击省之后,动态的添加当前省对应的市内容
                    // 先判断当前市中是否有option,若是有,则删除所有元素再添加
                    if(countyContent.children.length != 0){
                        var i = 0; 
                        while(i < countyContent.children.length)
                            countyContent.removeChild( countyContent.children[0]);
                    }
                    console.log(this.value);
                    createOption(county[index][this.value], countyContent);
                });
            }
       }
    </script>
</body>
</html>

发布了12 篇原创文章 · 获赞 27 · 访问量 786

猜你喜欢

转载自blog.csdn.net/qq_36091461/article/details/105333684