jquery select三级联动

需求:
对地区进行选择,选择相应的省,就会出现相应范围的市,然后出现相应的范围的县区;如果县不存在,就不现实,自我要求是自己写个简单的插件,方便以后调用;

逻辑:
1.通过div的类名来获取,其下的select标签;
2.通过声明临时变量,用来保存option内容,并通过$.each()来遍历json然后添加到select中;
3.如果某个市没有县,就先判断json中有没记录,如果没有就不现实,有就继续执行下面代码;
4.用change事件来控制三个selet之间的联系;
5.通过ajax $.getJSON,来触发省份事件,然后通过省份select的改变,来触发市区,以此类推;

实现:

json数据

[
{"p":"江西省",
"c":[
{"ct":"南昌市",
"d":[
{"dt":"西湖区"},
{"dt":"东湖区"},
{"dt":"高新区"}
]},
{"ct":"赣州市",
"d":[
{"dt":"瑞金县"},
{"dt":"南丰县"},
{"dt":"全南县"}
]}
]},
{"p":"北京",
"c":[
{"ct":"东城区"},
{"ct":"西城区"}
]},
{"p":"河北省",
"c":[
{"ct":"石家庄",
"d":[
{"dt":"长安区"},
{"dt":"桥东区"},
{"dt":"桥西区"}
]},
{"ct":"唐山市",
"d":[
{"dt":"滦南县"},
{"dt":"乐亭县"},
{"dt":"迁西县"}
]}
]}
]

html代码

<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>select</title>
<meta name="description" content="">
<meta name="keywords" content="">
<script type="text/javascript" src="jquery.js"></script>
<script src = "areaSelect.js"></script>
<link href="" rel="stylesheet">
<style>
	.sel{
		300px;
		margin:0 auto;
	}
</style>
</head>
<body>
    <div class="sel">
    	<select class="province">
    		<option>请选择</option>
    	</select>
    	<select class="city">
    		<option>请选择</option>
    	</select>
    	<select class="district">
    		<option>请选择</option>
    	</select>    	    	
    </div>
</body>
</html>
<script>
	$(document).ready(function(){
		$(".sel").areaSelect({
			"jsonUrl":"area.json"
		})
	})
</script>

jquery插件

/**
 * 
 * @authors Your Name (you@example.org)
 * @date    2015-09-13 01:54:25
 * @version $Id$
 */
(function($){
	$.fn.areaSelect = function(options){
		var settings = $.extend({
			"jsonUrl":"json"
		},options);

        return this.each(function(){
        	var url = options.jsonUrl;
			var addJson;
			var tHtml = "";
			var op = $(this).find(".province");
			var oc = $(this).find(".city");
			var od = $(this).find(".district");
			//初始化
			var province = function(){
	            $.each(addJson,function(i,province){
	            	tHtml += "<option value = '"+province.p+"'>"+province.p+"</option>";
	            });
	            op.html(tHtml);
	            city();

			}
			var city = function(){
				var tHtml="";
				var n = op.get(0).selectedIndex;
				$.each(addJson[n].c,function(i,city){
	                tHtml += "<option value='"+city.ct+"''>"+city.ct+"</option>";
				});
				oc.html(tHtml);
				district();
			}
			var district = function(){
				var tHtml="";
				var n = op.get(0).selectedIndex;
	            var m = oc.get(0).selectedIndex;
	            if(typeof (addJson[n].c[m].d) == "undefined"){
	            	od.css("display","none")
	            }else{
	            	od.css("display","inline");
		            $.each(addJson[n].c[m].d,function(i,district){
		            	tHtml += "<option value='"+district.dt+"'>"+district.dt+"</option>"
		            });
		            od.html(tHtml);
		        }    

		    }

			op.change(function(){
				city();
			})
			oc.change(function(){
				district()
			});
			$.getJSON(settings.jsonUrl,function(data){
				addJson  = data;
				province()
			})

        })
	}
})(jQuery)

转载自:http://www.cnblogs.com/afuge/archive/2013/06/08/3127172.html  有修改!

原文地址:https://www.cnblogs.com/bestsamcn/p/4804864.html