省市区三级联动

前端实现省市区三级联动的方法有很多,我就用我认为最简单的方式进行实现。为了选取和操作dom方便我引入了jquery.

html代码:

          <div>
            <select name="" id="pro">//省
                <!--<option value=""></option>-->
            </select>
            <select name="" id="city">//市
                <!--<option value=""></option>-->
            </select>
            <select name="" id="area">//区
                <!--<option value=""></option>-->
            </select>
          </div>            

数据三个数组,分别代表省,市,区,这个数据可以是后台从数据库读出来的数据,也可以是在JS里直接写的数据。但无论是哪种形式,三个数组的数据都是有关联的。arr_c,市数组,里面每一项内容都有一个属性‘pid’,表示这个市是属于哪个省的,即pid对应的是省数组里的id。同样arr_a,区数组,里面的cid是对应市数组里的id,表示这个区是属于哪个市的。

let arr_p = [
                    {id:"0","text":"请选择省份"},
                    {id:"1","text":"北京"},
                    {id:"2","text":"上海"},
                    {id:"3","text":"安徽"},
                    {id:"4","text":"浙江"},
                    {id:"5","text":"江苏"}
               ]
            let arr_c = [
                    {id:"0",pid:"0","text":"请选择城市"},
                    {id:"1",pid:"1","text":"北京1"},
                    {id:"2",pid:"1","text":"北京2"},
                    {id:"3",pid:"1","text":"北京3"},
                    {id:"4",pid:"1","text":"北京4"},
                    {id:"5",pid:"2","text":"上海1"},
                    {id:"6",pid:"2","text":"上海2"},
                    {id:"7",pid:"2","text":"上海3"},
                    {id:"8",pid:"3","text":"安徽1"},
                    {id:"9",pid:"3","text":"安徽2"},
                    {id:"10",pid:"4","text":"浙江1"},
                    {id:"11",pid:"4","text":"浙江2"},
                    {id:"12",pid:"4","text":"浙江3"}    
            ]
            
            let arr_a = [
                    {id:"0",cid:"0","text":"请选择地区"},
                    {id:"1",cid:"1","text":"北京1区"},
                    {id:"2",cid:"1","text":"北京1区"},
                    {id:"3",cid:"1","text":"北京1区"},
                    {id:"4",cid:"2","text":"北京2区"},
                    {id:"5",cid:"2","text":"北京2区"},
                    {id:"6",cid:"3","text":"北京3区"},
                    {id:"7",cid:"3","text":"北京3区"},
                    {id:"8",cid:"4","text":"北京4区"},
                    {id:"9",cid:"4","text":"北京4区"},
                    {id:"10",cid:"4","text":"北京4区"},
                    
                    {id:"11",cid:"5","text":"上海1区"},
                    {id:"12",cid:"5","text":"上海1区"},
                    {id:"13",cid:"5","text":"上海1区"},
                    {id:"14",cid:"6","text":"上海2区"},
                    {id:"15",cid:"6","text":"上海2区"},
                    {id:"16",cid:"6","text":"上海2区"},
                    {id:"17",cid:"7","text":"上海3区"},
                    {id:"18",cid:"7","text":"上海3区"},
                    {id:"19",cid:"7","text":"上海3区"},
                    {id:"20",cid:"7","text":"上海3区"},
                    
                    
                    {id:"21",cid:"8","text":"安徽1区"},
                    {id:"22",cid:"8","text":"安徽1区"},
                    {id:"23",cid:"8","text":"安徽1区"},
                    {id:"24",cid:"8","text":"安徽1区"},
                    {id:"26",cid:"9","text":"安徽2区"},
                    {id:"27",cid:"9","text":"安徽2区"},
                    {id:"28",cid:"9","text":"安徽2区"},
                    {id:"29",cid:"9","text":"安徽2区"},
                    {id:"30",cid:"10","text":"安徽3区"},
                    {id:"31",cid:"10","text":"安徽3区"},
                    {id:"32",cid:"10","text":"安徽3区"},
                    {id:"33",cid:"10","text":"安徽3区"},
                
                
                    {id:"34",cid:"11","text":"浙江1区"},
                    {id:"35",cid:"11","text":"浙江1区"},
                    {id:"36",cid:"12","text":"浙江2区"},    
                    {id:"37",cid:"12","text":"浙江2区"},
                    {id:"38",cid:"12","text":"浙江2区"},
                    {id:"39",cid:"13","text":"浙江3区"},
                    {id:"40",cid:"13","text":"浙江3区"},
                    {id:"41",cid:"13","text":"浙江3区"}
            ]

接着添加一个方法selPro,该方法循环arr_p数组(省数据),为第一个下拉框添加选项。

function selPro(){
                    let len = arr_p.length;
                    let p = $("#pro")
                    for(var i=0;i<len;i++){
                        var option =`<option value=${arr_p[i].id}>${arr_p[i].text}</option>`
                        p.append(option)
                    }
            }

然后添加方法selCity,该方法和selPro类似,循环为第二个下拉框添加选项,主要的区别就是只添加某个省的市数据,添加哪个省的市数据,取决于第一个下拉框选的是哪个省,就是通过参数传过来的省id。代码如下。

function selCity(pid){
                let len = arr_c.length;
                let c = $("#city")
                c.empty()
                for(var i=0;i<len;i++){
                    if(arr_c[i].pid==pid){
                        let option = `<option value=${arr_c[i].id}>${arr_c[i].text}</option>`
                        c.append(option)
                    }
                    
                }
                
            }

最后添加的方法是selArea,和selCity方法一样,生成区下拉框,用哪个市的区取决于第二个下拉框选的数据。代码如下

function selArea(cid){
                let len = arr_a.length;
                let a = $("#area");
                a.empty()
                for(var i=0;i<len;i++){
                    if(arr_a[i].cid==cid){
                        let option = `<option value=${arr_a[i].id}>${arr_a[i].text}</option>`
                    a.append(option)
                    }
                    
                }    
            }

然后为第一个下拉框添加change事件,就是当第一个下拉框选择不同的省时,需要用该省下的市数据填充到第二个下拉框里。

同理要为第二个下拉框添加change事件,当第二个下拉框选择不同的市时,需要用该市下的区数据填充到第三个下拉框里。

代码如图。

$(function(){
                selPro();//对三个下拉框进行加载
                selCity(0);
                selArea(0);
$(
"#pro").change(function(){ let pid=$(this).val(); selCity(pid); let cid = $("#city").val(); selArea(cid) }) $("#city").change(function(){ let cid = $(this).val(); selArea(cid) }) })

效果如下:

实现的方式有很多,推荐几个比较好的:
 
posted @ 2018-03-22 11:40  孙氏楼  阅读(681)  评论(0编辑  收藏  举报