JQ三级联动

准备工作复制我的代码即可

地区数据 area.js

    var provinceList = [
        {name:'浙江', cityList:[
            {name:'杭州市', areaList:['上城区','下城区','江干区','拱墅区','西湖区','滨江区','萧山区','余杭区','桐庐县','淳安县','建德市','富阳市','临安市']},
            {name:'宁波市', areaList:['海曙区','江东区','江北区','北仑区','镇海区','鄞州区','象山县','宁海县','余姚市','慈溪市','奉化市']},
            {name:'温州市', areaList:['鹿城区','龙湾区','瓯海区','洞头县','永嘉县','平阳县','苍南县','文成县','泰顺县','瑞安市','乐清市']},
            {name:'嘉兴市', areaList:['秀城区','秀洲区','嘉善县','海盐县','海宁市','平湖市','桐乡市']},
            {name:'湖州市', areaList:['吴兴区','南浔区','德清县','长兴县','安吉县']},
            {name:'绍兴市', areaList:['越城区','绍兴县','新昌县','诸暨市','上虞市','嵊州市']},
            {name:'金华市', areaList:['婺城区','金东区','武义县','浦江县','磐安县','兰溪市','义乌市','东阳市','永康市']},
            {name:'衢州市', areaList:['柯城区','衢江区','常山县','开化县','龙游县','江山市']},
            {name:'舟山市', areaList:['定海区','普陀区','岱山县','嵊泗县']},
            {name:'台州市', areaList:['椒江区','黄岩区','路桥区','玉环县','三门县','天台县','仙居县','温岭市','临海市']},
            {name:'丽水市', areaList:['莲都区','青田县','缙云县','遂昌县','松阳县','云和县','庆元县','景宁畲族自治县','龙泉市']}
        ]},
        {name:'广东', cityList:[
            {name:'广州市', areaList:['东山区','荔湾区','越秀区','海珠区','天河区','芳村区','白云区','黄埔区','番禺区','花都区','增城市','从化市']},
            {name:'韶关市', areaList:['武江区','浈江区','曲江区','始兴县','仁化县','翁源县','乳源瑶族自治县','新丰县','乐昌市','南雄市']},
            {name:'深圳市', areaList:['罗湖区','福田区','南山区','宝安区','龙岗区','盐田区']},
            {name:'珠海市', areaList:['香洲区','斗门区','金湾区']},
            {name:'汕头市', areaList:['龙湖区','金平区','濠江区','潮阳区','潮南区','澄海区','南澳县']},
            {name:'佛山市', areaList:['禅城区','南海区','顺德区','三水区','高明区']},
            {name:'江门市', areaList:['蓬江区','江海区','新会区','台山市','开平市','鹤山市','恩平市']},
            {name:'湛江市', areaList:['赤坎区','霞山区','坡头区','麻章区','遂溪县','徐闻县','廉江市','雷州市','吴川市']},
            {name:'茂名市', areaList:['茂南区','茂港区','电白县','高州市','化州市','信宜市']},
            {name:'肇庆市', areaList:['端州区','鼎湖区','广宁县','怀集县','封开县','德庆县','高要市','四会市']},
            {name:'惠州市', areaList:['惠城区','惠阳区','博罗县','惠东县','龙门县']},
            {name:'梅州市', areaList:['梅江区','梅 县','大埔县','丰顺县','五华县','平远县','蕉岭县','兴宁市']},
            {name:'汕尾市', areaList:['主城区','海丰县','陆河县','陆丰市']},
            {name:'河源市', areaList:['源城区','紫金县','龙川县','连平县','和平县','东源县']},
            {name:'阳江市', areaList:['江城区','阳西县','阳东县','阳春市']},
            {name:'清远市', areaList:['清城区','佛冈县','阳山县','连山壮族瑶族自治县','连南瑶族自治县','清新县','英德市','连州市']},
            {name:'东莞市', areaList:['石龙镇','石排镇','茶山镇','企石镇','桥头镇','东坑镇','横沥镇','常平镇','虎门镇','长安镇','沙田镇','厚街镇','寮步镇','大岭山镇','大朗镇','黄江镇','樟木头镇','谢岗镇','塘厦镇','清溪镇','凤岗镇','麻涌镇','中堂镇','高埗镇','石碣镇','望牛墩镇','洪梅镇','道滘镇']},
            {name:'中山市', areaList:['石岐街道','东区街道','西区街道','南区街道','五桂山街道','火炬开发区','黄圃镇','南头镇','东凤镇','阜沙镇','小榄镇','东升镇','古镇镇','横栏镇','三角镇','民众镇','南朗镇','港口镇','大涌镇','沙溪镇','三乡镇','板芙镇','神湾镇','坦洲镇']},
            {name:'潮州市', areaList:['湘桥区','潮安县','饶平县']},
            {name:'揭阳市', areaList:['榕城区','揭东县','揭西县','惠来县','普宁市']},
            {name:'云浮市', areaList:['云城区','新兴县','郁南县','云安县','罗定市']}
        ]},

    ]

从网上找了两条测试即可

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
        <style>
            select{
                padding:5px 0;
                }
            .outer{
                width:500px;
                margin:20px auto;
                }
        </style>
    </head>
    <body>
    <div class="outer">
        <select  id="province">
            <option value="请选择">请选择</option>
        </select>
        <select id="city">
            <option value="请选择">请选择</option>
        </select>
        <select id="town">
            <option value="请选择">请选择</option>
        </select>
    </div>
    </body>
    <script src="http://www.jq22.com/jquery/jquery-1.10.2.js"></script>
    <script src="./area.js"></script> //引入上方数据
    <script>

    </script>
    </html>

开始JS部分,此处用的jq是cdn 复制即可

    <script>
        var province=$("#province"),city=$("#city"),town=$("#town");  //取到三个select元素,记住了代表的元素
    </script>

写个方法用来动态加载options

        function addSearch(el,value){  // el代表元素   value 表示我们获取的对象值
            var optionStr="";
            optionStr="<option value="+value+">"+value+"</option>";
            el.append(optionStr);//在元素后面添加标签
        }

首先我们先加载省区

            for(var i=0;i<provinceList.length;i++){ //上方引入的js地区数组名,获取它的长度遍历
              addSearch(province,provinceList[i].name);//这里的province表示 第一个id为province的select标签
            }

当前的JS代码 如果看不懂JQ代码可以翻阅JQ在线手册

    <script>
        var province=$("#province"),city=$("#city"),town=$("#town");       
            function addSearch(el,value){
                var optionStr="";
                optionStr="<option value="+value+">"+value+"</option>";
                el.append(optionStr);
            }
            for(var i=0;i<provinceList.length;i++){
              addSearch(province,provinceList[i].name);
            }
    </script>

我们看看效果


省区已经加载出来了,这步没看懂的建议再浏览一下

接下来做一个移除效果,当我们选择省区的时候,后面的两项清空,当我们选择第二项市区的时候,第三项清空,提前写一个方法方便调用
            function removeEl(el){
                el.find("option").remove(); //清空el下的option元素
                var optionStar="<option value="+"请选择"+">"+"请选择"+"</option>";
                el.append(optionStar); //增加 请选择的选项 插入
            }

接下来插入市区选项数据

            var provinceVal,cityVal,cityIndex; //定义三个全局变量  获取当前的数据 
            province.on('change',function(){
               provinceVal=$(this).val();//获取当前的省区name
               $.each(provinceList,function(i,item){ // 遍历循环provinceList数组 i 是索引 item是索引值
                if(provinceVal==item.name){ //遍历数组,如果找到当前的省区与数组中的name对应
                    cityIndex=i;
                    return cityIndex   //停止循环 返回索引
                }
              }); //此时当我们选择省区时 确定了数组中的索引位置
                  //此时我们清空后面两个select的选择
                  removeEl(city);
                  removeEl(town);
                  //既然确认了索引 就可以添加数据到第二个select
                  $.each(provinceList[cityIndex].cityList,function(i,item){
                        addSearch(city,item.name)//将id为city的select标签增加option选项
                 })
            })

此时页面效果

第二个选项已经填充完成,并且改变第一个选项第二个选项会清空,此时的js代码

    <script>
        var province=$("#province"),city=$("#city"),town=$("#town");
   
            function addSearch(el,value){
                var optionStr="";
                optionStr="<option value="+value+">"+value+"</option>";
                el.append(optionStr);
            }
            for(var i=0;i<provinceList.length;i++){
              addSearch(province,provinceList[i].name);
            }
            function removeEl(el){
                el.find("option").remove();
                var optionStar="<option value="+"请选择"+">"+"请选择"+"</option>";
                el.append(optionStar);
            }
            var provinceVal,cityVal,cityIndex; //定义三个全局变量  获取当前的数据 
            province.on('change',function(){ //当省区选项发生改变的时候
               provinceVal=$(this).val();//获取当前的省区name
               $.each(provinceList,function(i,item){ // 遍历循环provinceList数组 i 是索引 item是索引值
                if(provinceVal==item.name){ //遍历数组,如果找到当前的省区与数组中的name对应
                    cityIndex=i;
                    return cityIndex   //停止循环 返回索引
                }
              }); //此时当我们选择省区时 确定了数组中的索引位置
                  //此时我们清空后面两个select的选择
                  removeEl(city);
                  removeEl(town);
                  //既然确认了索引 就可以添加数据到第二个select
                  $.each(provinceList[cityIndex].cityList,function(i,item){
                        addSearch(city,item.name)//将id为city的select标签增加option选项
                 })
            })
        
    </script>

还差最后一个,其实很简单了,一样的逻辑

            city.on("change",function(){ //当市区选项发生改变的时候
            cityVal=$(this).val(); //获取当前的市区选项
            removeEl(town); //此时我们清空第三个select的option
            $.each(provinceList[cityIndex].cityList,function(i,item){//此时cityIndex依旧是之前的cityIndex,遍历该索引下的对象的cityList数组
                if(cityVal == item.name){ //找到第二个select的val与数组中的val相同的 
                    for(var n=0;n<item.areaList.length;n++){ //遍历增加数据
                        addSearch(town,item.areaList[n])
                    }
                }
            });
        });

此时的js代码

    <script>
        var province=$("#province"),city=$("#city"),town=$("#town");
   
            function addSearch(el,value){
                var optionStr="";
                optionStr="<option value="+value+">"+value+"</option>";
                el.append(optionStr);
            }
            for(var i=0;i<provinceList.length;i++){
              addSearch(province,provinceList[i].name);
              
            }
            function removeEl(el){
                el.find("option").remove();
                var optionStar="<option value="+"请选择"+">"+"请选择"+"</option>";
                el.append(optionStar);
            }
            var provinceVal,cityVal,cityIndex; //定义三个全局变量  获取当前的数据 
            province.on('change',function(){
               provinceVal=$(this).val();//获取当前的省区name
               $.each(provinceList,function(i,item){ // 遍历循环provinceList数组 i 是索引 item是索引值
                if(provinceVal==item.name){ //遍历数组,如果找到当前的省区与数组中的name对应
                    cityIndex=i;
                    return cityIndex   //停止循环 返回索引
                }
              }); //此时当我们选择省区时 确定了数组中的索引位置
                  //此时我们清空后面两个select的选择
                  removeEl(city);
                  removeEl(town);
                  //既然确认了索引 就可以添加数据到第二个select
                  $.each(provinceList[cityIndex].cityList,function(i,item){
                        addSearch(city,item.name)//将id为city的select标签增加option选项
                 })
            })
        

            city.on("change",function(){ //当市区选项发生改变的时候
            cityVal=$(this).val(); //获取当前的市区选项
            removeEl(town); //此时我们清空第三个select的option
            $.each(provinceList[cityIndex].cityList,function(i,item){//此时cityIndex依旧是之前的cityIndex,遍历该索引下的对象的cityList数组
                if(cityVal == item.name){ //找到第二个select的val与数组中的val相同的 
                    for(var n=0;n<item.areaList.length;n++){ //遍历增加数据
                        addSearch(town,item.areaList[n])
                    }
                }
            });
        });

    </script>

主要是思路,可能你的后台是个新手,数据写的不是很好

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容