本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 [署名 4.0 国际 (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.zh) 本文作者: 苏洋 创建时间: 2013年05月11日 统计字数: 4204字 阅读时间: 9分钟阅读 本文链接: https://soulteary.com/2013/05/11/jquery-city-select.html ----- # jQuery省市联动下拉框插件 最近通宵严重,整理一下碎片化的代码,否则真担心一段时间后忘记了什么。 > Github代码已经更新,如使用插件,请参考最新代码。 把之前写的省市联动的JQUERY插件重写了一下,记录如下: [![jquery-select-box](https://attachment.soulteary.com/2013/05/11/jquery-select-box.png "jquery-select-box")](https://attachment.soulteary.com/2013/05/11/jquery-select-box.png) 完成地址:[http://thecdn.sinaapp.com/page/demo/jq-select/](http://thecdn.sinaapp.com/page/demo/jq-select/) GitHub地址:[https://github.com/soulteary/jquery-city-select](https://github.com/soulteary/jquery-city-select) 首先建立基础HTML结构: ```html html:5>div#warp>((select#province>option[value="载入中"])+(select#city>option[value="载入中"])) ``` 预览地址:[http://thecdn.sinaapp.com/page/demo/jq-select/step-1.html](http://thecdn.sinaapp.com/page/demo/jq-select/step-1.html) ```html 省市下拉联动插件 @soulteary
``` 添加简单的样式。 地址:[http://thecdn.sinaapp.com/page/demo/jq-select/step-2.html](http://thecdn.sinaapp.com/page/demo/jq-select/step-2.html) ```html 省市下拉联动插件 @soulteary
``` 接着来写JS实现。 首先我们要进行数据定义,就是这个省市联动的数据是如何的关系。 有许多的省份,那么省份是包含在一个数组中的,然后每个省份中的城市包含在这些省份中,所以获得包含关系。 定义结构如下:(为了简单的开发,我随意写的数据,真实上线用自己定义的数据来替换即可) ```js [ {'name':'北京市', id:100000, children:[ {'name':'海淀区', id:100003}, {'name':'西城区', id:100002}, {'name':'东城区', id:100001} ]}, {'name':'天津市', id:300000, children:[ {'name':'北辰区', id:300003}, {'name':'红桥区', id:300002}, {'name':'河西区', id:300001} ]} ]; ``` 简单的思考后,插件接受的参数为不定长,1~2个,为什么这么说呢。 场景A:数据要输出到一个下拉框中,即省份和城市输出一起。 场景B:数据分别初始化到两个下拉列表中。 那么设计插件框架如下: ```js (function ($) { $.fn.extend({ "citylist": function (params) { params = $.extend({ param:'this is a param' }, params); var target = $(this); if(!target.length){ return this; }else if(target.length==1){ }else{ } console.log('PLUGN LOADED!:',target,params); return this; } }); })(jQuery, 'SOULTEARY.COM'); //USEAGE: $('#province').citylist(); $('#province , #city').citylist(); ``` 接着来写实现代码: 地址:[http://thecdn.sinaapp.com/page/demo/jq-select/step-3.html](http://thecdn.sinaapp.com/page/demo/jq-select/step-3.html) 首先是将省市数据初始化到两个不同的列表中的功能的实现,即: `$('#province , #city').citylist();` ```js //插件基础代码 ; (function ($) { $.fn.extend({ "citylist": function (params) { params = $.extend({ param: 'this is a param' }, params); var target = $(this); if (!target.length) { return this; } else if (target.length == 1) { } else { var province = target.eq(0); var city = target.eq(1); var html = [], oItem; for(var item in params.data){ oItem = params.data[item]; console.log(oItem) html.push(''); } html = html.join(''); province.find('option').remove(); province.append(html); var provinces = province.find('option'); province.on('change',function(){ var curSelect = $(this).val(); provinces.each(function(k,v){ if ($(v).val() == curSelect){ return (function(v){ var extra = $(v).attr('data-extra'); var html = [], oItem; for(var item in params.data){ oItem = params.data[item]; if(oItem['id'] == extra && oItem.children){ oItem = oItem.children; for(var sItem in oItem){ html.push(''); } break; } } html = html.join(''); city.find('option').remove(); city.append(html); }(v)); } }) }).trigger('change'); } return this; } }); })(jQuery, 'SOULTEARY.COM'); //插件调用代码 ; $(function () { var data = [ {'name': '北京市', id: 100000, children: [ {'name': '海淀区', id: 100003}, {'name': '西城区', id: 100002}, {'name': '东城区', id: 100001} ]}, {'name': '天津市', id: 300000, children: [ {'name': '北辰区', id: 100003}, {'name': '红桥区', id: 100002}, {'name': '河西区', id: 100001} ]} ]; $('#province, #city').citylist({data:data}); }); ``` 接着我们继续写单独SELECT BOX的功能。 首先修改HTML结构,添加一个元素作为合并输出数据的容器。可以这么做: ```html
``` 当然,为了有较好的心情去写实现代码,我们需要把CSS也写一下: ```css #warp2 { width: 230px; height: 80px; position: absolute; top: 50%; left: 50%; margin-left: -200px; margin-top: 0; box-shadow: 1px 1px #3A393A; border: 1px solid #222; font-size: 13px; line-height: 13px; } #all { margin: 30px; } ``` 接着开始写实现代码: ```js var all = target; var data = params.data; var html = []; for(var oo in data){ html.push(''+data[oo]['name']+''); for(var xx in data[oo].children){ html.push(''+data[oo].children[xx]['name']+''); } } html = html.join(''); all.find('option').remove(); all.append(html); ``` 完整实现代码: 地址:`http://thecdn.sinaapp.com/page/demo/jq-select/step-4.html` ```html 省市下拉联动插件 @soulteary
``` 最后,把CSS,JS独立出页面即可。 当然,这里多添加了一个小功能,如果使用者定义的数据不是id,name,children这样的键,或者不想使用DATA-EXTRA来保存数据,那么一样可以使用这个小插件。 - 完成地址:[http://thecdn.sinaapp.com/page/demo/jq-select/](http://thecdn.sinaapp.com/page/demo/jq-select/) - GitHub地址:[https://github.com/soulteary/jquery-city-select](https://github.com/soulteary/jquery-city-select)