美文网首页
省市区三级联动(原生JS)

省市区三级联动(原生JS)

作者: Gino_Li | 来源:发表于2019-03-15 00:07 被阅读0次
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <style type="text/css">
            .test{
                text-align: center;
            }
        </style>
        <div class="test">
            <select name="province" class="province">
                <option selected="selected" disabled value="">请选择</option>
            </select>
            <select name="city" class="city">
                <option selected disabled value="">请选择</option>
            </select>
            <select name="area" class="area">
                <option value="">请选择</option>
            </select>
        </div>
        <script type="text/javascript">
            let province = document.querySelector(".province"),
                city = document.querySelector(".city"),
                _area = document.querySelector(".area");
                        //数据源,json文件地址
            let pUrl = "js/province.json",
                cUrl = "js/city.json",
                aUrl = "js/area.json";
                
            //封装ajax函数,获取数据
            function myAjax(_type,_url,callback){
                let xhr = new XMLHttpRequest();
                xhr.open(_type,_url);
                xhr.send();
                xhr.addEventListener("readystatechange",function(){
                    if(xhr.readyState==4 && xhr.status==200){
                        let result = JSON.parse(xhr.responseText);
                        callback(result);
                    }
                });
            }
            
            //封装创建option元素的函数
            function creataOpt(parent,data){
                
                for(let i=0;i<data.length;i++){
                    //创建option元素,并设置value属性的值为数据库里相应的id值,内容为相应的name(如广东)
                    let _opt = "<option value="+data[i].id+">"+data[i].name+"</option>";
                    parent.innerHTML += _opt;
                }
            }
            
            //请求省份数据,并渲染省份数据
            myAjax("get",pUrl,function(res){
                console.log('省份',res);
                creataOpt(province,res);
            });
            
            //选择省份,联动城市
            //当选择的option发生变更时触发
            province.addEventListener("change",function(){
                //selectedIndex选中选项的下标值
                let index = province.selectedIndex;
                //options表示下拉框的所有选项
                //获取选择的option的value值
                let pId = province.options[index].value;
                //请求城市的数据
                myAjax("get",cUrl,function(cRes){
                    console.log('城市',cRes);
                    //遍历城市数据的内容
                    cRes.forEach((val,index)=>{
                        //判断:如果数据中的preId和选择的option的value值相同,就渲染相应的城市数据
                        if(val.preId === pId){
                            //每次渲染数据前将city内的option清空,以免出现叠加
                            city.innerHTML = "";
                            creataOpt(city,val.list);                       
                        }
                    })
                    //调用城市和区的联动效果,实现三级联动
                    selCity();
                    
                })
            })
            
            //选择城市,联动区
            city.addEventListener("change",selCity);
            
            //封装选择城市联动区的函数
            function selCity(){
                //获取省份id
                let pId = province.options[province.selectedIndex].value;
                //获取城市的id
                let cId = city.options[city.selectedIndex].value;
                console.log(pId,cId);
                
                //获取区的数据
                myAjax('get',aUrl,function(aRes){
                    console.log('地区',aRes);
                    //遍历区数据
                    aRes.forEach((aVal)=>{
                        //判断:如果区的preId等于省份的pId
                        if(aVal.preId==pId){
                            console.log(aVal);
                            //就再遍历区等于省份中的aVal
                            aVal.list.forEach((aValue)=>{
                                //判断:如果这些数据等于选择的城市的cId,就渲染区的数据
                                if(aValue.preId == cId){
                                    //创建option前先清空区里的内容
                                    _area.innerHTML = "";
                                    creataOpt(_area,aValue.list1);
                                }
                            })
                        }
                    })
                })
            }
                
        </script>
    </body>
</html>

相关文章

网友评论

      本文标题:省市区三级联动(原生JS)

      本文链接:https://www.haomeiwen.com/subject/qsfkmqtx.html